2012-12-27 2 views
18

C# .NET의 경우 원본 파일이 기존 파일보다 최신 파일 인 경우 (나중에 "수정 된 날짜"로 지정) 기존 파일을 덮어 쓰고 다른 위치로 파일을 복사하는 방법 원본 파일이 오래된 경우?파일 복사, 새로 작성한 경우 덮어 쓰기

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

이 창 또는 웹 접근 ?? – user1102001

+0

@ user1102001 windows –

+1

배치 파일을 사용하면 더 쉽게 찾을 수 있습니다. xcopy 명령을 사용하면이 작업을 간단하게 처리 할 수 ​​있습니다. – JMK

답변

28

당신은 FileInfo class를 사용하고 프로퍼티와 메소드입니다 :

7

당신은에서는 FileInfo 클래스를 사용할 수있는 배치 파일에서

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

을이 작동합니다 :

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

예 .. 경로 등의 공간을 다루어야하기 때문에 더 까다 롭습니다. –

+1

충분히 도움이된다면 배치 파일을 사용하면 파일 경로 주위에 작은 따옴표 나 큰 따옴표를 넣을 수 있습니다. – JMK

1

여기에 대한 내 대답은 : 복사본 폴더 내용을 이동하지 않습니다. 대상이 존재하지 않으면 코드가 더 명확 해집니다. 기술적으로, 존재하지 않는 파일에 대한 fileinfo를 작성하면 LastTimeTime.Min의 LastWriteTime이됩니다. 따라서 이되지만 가독성은 약간 떨어집니다. 이 테스트 된 코드가 누군가를 돕기를 바랍니다.

** 편집 : 원본을 훨씬 더 유연하게 업데이트했습니다. 이 스레드를 기반으로하기 때문에 여기에 업데이트를 게시했습니다. 마스크를 사용할 때 하위 디렉토리가 생성되지 않음 하위 폴더에 일치하는 파일이 포함되어 있지 않은 경우. 확실히 더 강력한 오류 처리기가 앞으로있을 것입니다. :)

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

정말 잘됩니다. 나는 하나의 추가적인 개선을 제안 할 것이다. 파일이 원본과 대상에 모두 존재할 경우 파일이 동일한 경우 파일을 복사하지 않도록 체크섬 테스트를 추가합니다. 공개 GetChecksum 문자열 (문자열적인 filePath) {(VAR 스트림 = 신규 한 BufferedStream (File.OpenRead (여기서 filePath), 1200000)) { \t \t \t SHA256Managed SHA = 새로운 SHA256Managed()를 사용 \t; \t \t 바이트 [] 체크섬 = sha.ComputeHash (스트림); \t \t 반환 값 BitConverter.ToString (체크섬) .Replace ("-", String.Empty); \t} } –

+0

@ChristopherHaws, 좋은 생각입니다. 내가 잠길 때 나는 그것을 접을 것이다. :) –