2012-12-27 29 views
18

C# .NET'de, bir dosya başka bir konuma nasıl kopyalanır, varolan dosyanın üzerine, kaynak dosya mevcut dosyadan daha yeniyse (daha sonra "Değiştirilmiş bir tarihe sahip ol") varolan bir dosyaya nasıl yazılır kaynak dosya daha eskiyse?Dosyayı kopyala, üzerine yazmaktansa üzerine yazın

FileInfo infoOld = new FileInfo("C:\\old.txt"); 
FileInfo infoNew = new FileInfo("C:\\new.txt"); 

if (infoNew.LastWriteTime > infoOld.LastWriteTime) 
{ 
    File.Copy(source path,destination path, true) ; 
} 
+0

Bu pencere veya web yaklaşımı nedir? – user1102001

+0

@ user1102001 windows –

+1

Bir toplu iş dosyasıyla bunu daha kolay bulabilirsin, xcopy komutunun bu kadar basit olduğunu düşünüyorum – JMK

cevap

7

Sen FileInfo sınıfını kullanabilirsiniz bir toplu dosyasında

FileInfo file = new FileInfo(path); 
string destDir = @"C:\SomeDirectory"; 
FileInfo destFile = new FileInfo(Path.Combine(destDir, file.Name)); 
if (destFile.Exists) 
{ 
    if (file.LastWriteTime > destFile.LastWriteTime) 
    { 
     // now you can safely overwrite it 
     file.CopyTo(destFile.FullName, true); 
    } 
} 
0

, işe yarayacak:

XCopy "c:\my directory\source.ext" "c:\my other directory\dest.ext" /d 
+0

evet .. ama muhtemelen trickier çünkü yoldaki boşluklarla uğraşmak zorunda kalıyoruz, vb. –

+1

Yeterince adil, bence toplu iş dosyaları – JMK

1

İşte cevabı almam: Kopyalar, klasör içeriğini taşımaz. Hedef mevcut değilse kodun okunması daha nettir. Teknik olarak, var olmayan bir dosya için bir fileinfo oluşturacaksınız bir DateWimeTime DateTime.Min olacak kopya olurdu ama okunabilirlik biraz kısa düşüyor. Umarım bu test edilmiş kod birisine yardım eder.

** DÜZENLEME: Kaynağımı daha esnek olacak şekilde güncelledim. Bu konuya dayandığından güncellemeyi buraya gönderdim. Maske altdizileri kullanıldığında ise alt klasörü eşleşen dosyalar içermiyorsa. Kesinlikle daha sağlam bir hata işleyicisi geleceğiniz için. :)

public void CopyFolderContents(string sourceFolder, string destinationFolder) 
{ 
    CopyFolderContents(sourceFolder, destinationFolder, "*.*", false, false); 
} 

public void CopyFolderContents(string sourceFolder, string destinationFolder, string mask) 
{ 
    CopyFolderContents(sourceFolder, destinationFolder, mask, false, false); 
} 

public void CopyFolderContents(string sourceFolder, string destinationFolder, string mask, Boolean createFolders, Boolean recurseFolders) 
{ 
    try 
    { 
     if (!sourceFolder.EndsWith(@"\")){ sourceFolder += @"\"; } 
     if (!destinationFolder.EndsWith(@"\")){ destinationFolder += @"\"; } 

     var exDir = sourceFolder; 
     var dir = new DirectoryInfo(exDir); 
     SearchOption so = (recurseFolders ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly); 

     foreach (string sourceFile in Directory.GetFiles(dir.ToString(), mask, so)) 
     { 
      FileInfo srcFile = new FileInfo(sourceFile); 
      string srcFileName = srcFile.Name; 

      // Create a destination that matches the source structure 
      FileInfo destFile = new FileInfo(destinationFolder + srcFile.FullName.Replace(sourceFolder, "")); 

      if (!Directory.Exists(destFile.DirectoryName) && createFolders) 
      { 
       Directory.CreateDirectory(destFile.DirectoryName); 
      } 

      if (srcFile.LastWriteTime > destFile.LastWriteTime || !destFile.Exists) 
      { 
       File.Copy(srcFile.FullName, destFile.FullName, true); 
      } 
     } 
    } 
    catch (Exception ex) 
    { 
     System.Diagnostics.Debug.WriteLine(ex.Message + Environment.NewLine + Environment.NewLine + ex.StackTrace); 
    } 
} 
+0

yardım ederse bir dosya yoluna tek veya çift tırnak koymanıza izin veriyor. aramak. (Bu ihtiyaçlar çözülmüş olmalı) –

+1

Bu gerçekten iyi çalışıyor. Bir ek gelişme öneriyorum. Dosya hem kaynakta hem de dosyada bulunuyorsa bir sağlama toplamı testi ekleme, böylece dosya aynıysa, kopyalamayın. kamu String GetChecksum (String filePath) {(var akışı = Yeni BufferedStream (File.OpenRead (filePath), 1200000)) \t { \t \t SHA256Managed sha = yeni SHA256Managed() kullanılarak \t; \t \t byte [] checksum = sha.ComputeHash (akış); \t Bitcoder.ToString (sağlama toplamı). \t} –

+0

@ChristopherHaws, bu harika bir fikir. Bunu bir dakika aldığımda katlayacağım. :) –

İlgili konular