2011-09-15 5 views
1

File.Copy는 간단한 파일 복사를 허용합니다. 중복 된 파일 이름이 발견되면 File.Copy는 원래 파일을 덮어 쓸지 결정하는 세 번째 매개 변수를 갖습니다.파일 복사 - 이름이 충돌하는 경우 두 파일을 모두 유지하십시오.

복사 된 파일의 이름을 바꾸고 두 파일을 모두 유지하는 세 번째 옵션을 허용하는 내장 .Net 기능이 있습니까? 예를 들어 대상 폴더에 다른 readme.txt가 이미 존재하면 파일 복사는 "readme.txt"를 "readme - Copy.txt"로 자동으로 바꿉니다. Windows 탐색기 기능과 비슷합니까?

나는 그것이 쓰여질 수 있음을 깨달았지만 존재한다면 바퀴를 재발 명하고 싶지 않았다.

미리 감사드립니다.

+0

그리고 그 매개 변수가 'bool'이라면 어떻게 세 번째 옵션이 있다고 생각합니까? 나는 당신이 그 기능을 당신 자신의 것으로 써야한다고 생각한다. –

답변

1

File.Copy과 함께 할 수있는 모든 기능은 없지만 대상이 존재하는지 테스트 한 다음 Move 대신에 테스트 할 수 있습니다. Move은 두 개의 매개 변수를 사용하며 기본적으로 동시에 이름을 바꿀 수 있습니다. 위의

업데이트 코드 :

if File.Exists(destinationPath) { 
    File.Move(source, destinationPathRenamed); 
} else { 
    try { 
     File.Copy(source, destinationPath); 
    } catch (IOException ex) { 
     // destinationPath file already exists 
     File.Move(source, destinationPathRenamed); 
    } 
} 

Move documentation

편집을 참조하십시오. @xanatos는 원자 적 연산에 대해 좋은 점을 제시합니다. 파일에 액세스하는 다른 프로세스가 있는지 여부에 대한 가정은하지 않았습니다.

작업이 시작되기 전에 삭제되는 소스 파일에 대한 다른 오류 처리를 추가하지 않았습니다.

+1

이것은 "원자 적"이 아닙니다. Exists와 Copy 전에 파일이 나타날 수 있습니다. – xanatos

+0

답변 해 주셔서 감사합니다. – Dean

+1

@xanatos는 좋은 지적입니다. 내 대답이 약간 향상되었습니다. 실제로 그것을 방수로 만들기 위해서는 많은 점검과 오류 처리가 필요합니다. 대답의 핵심은 모든 테스트 및 예외 처리 코드에서 손실됩니다. –

2

아니요,이 기능은 기본적으로 존재하지 않습니다 (감사하게도 프레임 워크에 책임을 묻지 않으므로 * 필요하지 않음). 따라서이 기능을 원할 경우이 기능을 구현해야합니다. 맞춤형 솔루션.

* 어떤 구현 이어야합니까? "- 복사"를 추가하고 "(n)"을 추가 하시겠습니까? 오히려 건강에 해 롭습니다.

+0

답변 해 주셔서 감사합니다. – Dean

0
var destinationPath = c:\temp\archive.txt; 
if(File.Exists(destinationPath)) 
    destinationPath = string.Format("c:\temp\archive.{0}.txt", DateTime.Now.ToString("yyyyMMddHHmmffff")); 

File.Move (filePath, destinationPath);

관련 문제