2012-12-27 21 views
18

C#.NETでは、ファイルを別の場所にコピーし、ソースファイルが既存のファイルよりも新しい場合(後で「変更日」にする)、既存のファイルを上書きする方法ソースファイルが古い場合は?ファイルをコピーし、新しいファイルを上書きする場合

+0

このWindowsまたはWebのアプローチですか? – user1102001

+0

@ user1102001 windows –

+1

これはバッチファイルで簡単に見つかるかもしれませんが、私はxcopyコマンドがこれを簡単にすると思います。 – JMK

答えて

28

あなたはFileInfo classを使用することができますし、それがプロパティとメソッドです:バッチファイルで

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); 
    } 
} 
7

あなたがたFileInfoクラスを使用することができます。

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

、これは動作します:

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

はい。しかし、パスのスペースなどを扱わなければならないので、おそらくトリッキーです。 –

+1

バッチファイルを使うと、ファイルパスの前後に一重引用符や二重引用符を置くことができます。 – JMK

1

ここに私の答えがあります:コピーはフォルダの内容を移動しません。ターゲットが存在しない場合、コードは読みやすくなります。技術的には、存在しないファイルのfileinfoを作成するとLastWriteTimeがDateTime.Minになるので、になりますが、読みやすさには少し不足します。このテスト済みのコードが誰かを助けてくれることを願って

**編集:自分のソースを更新して、はるかに柔軟になるようにしました。このスレッドに基づいていたので、私はここに更新を掲載しました。マスクを使用する場合、サブディレクトリは作成されません。の場合、サブフォルダには一致するファイルが含まれません。確かに、より頑強なエラーハンドラがあなたの将来にあります。 :)

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

これは再帰的ではありませんコール。 (これはウィキッドにする必要があります) –

+1

これは本当にうまくいきます。私はもう一つの改善を提案します。コピー元とコピー先の両方にファイルが存在する場合にチェックサムテストを追加し、ファイルが同一であればコピーしないようにします。 (VARストリーム=新しいBufferedStream(File.OpenRead(filePathに)、1200000))を使用してパブリック文字GetChecksum(文字列filePathに) {\t \t {\t \t SHA256Managed SHA =新しいSHA256Managed()。 \t \tバイト[]チェックサム= sha.ComputeHash(ストリーム); \t \t戻り値BitConverter.ToString(チェックサム).Replace( " - "、String.Empty); \t} } –

+0

@ChristopherHaws、それは素晴らしいアイデアです。私はそれを折るときに私は分を取得します。 :) –

関連する問題