2017-04-21 7 views
1

열거하지 않고 크기가 대략 100kb-500kb 인 잠재적으로 10,000 개 이상의 파일을 포함하는 여러 하위 디렉토리가있는 디렉토리를 백업하려면 .NET에 방법이 있습니까? 여기서 사용 사례는 파일을 USB 저장소 및 NAS로 점진적으로 백업하는 것이지만 파일 수로 인해 실제로는 오랜 시간이 걸릴 수 있습니다. 나는 VSS에 익숙하고 그것을 활용하는 사용자 지정 백업 응용 프로그램을 만들었지 만 스냅 샷을 마운트 된 이미지로 노출하지 않고도 이러한 파일이 포함 된 볼륨을 스냅 샷으로 저장하고 스냅 샷을 저장하는 방법이 있는지 궁금합니다. 각 파일. 마지막 경기는 복사 작업에 소요되는 시간을 줄이는 것입니다.많은 수의 파일을 열거하지 않고 백업

+0

'ZipFile.CreateFromDirectory'의 성능이 받아 들여 지는지 확인 했습니까? –

+0

@EugeneKomisarenko - 나는 그것에 대해 실제로 생각해 왔으며 여전히 그것을 궁리하고 있습니다. 나는 모든 것을 zip에 보관할 수 있으며 심지어 내가 이해하는 것으로부터 추가 할 수 있습니다. 내가 변경된 파일의 최신 버전을 가지고 있는지 확인하기 위해 일부 빈도로 보관 파일을 다시 만들어야 할 것입니다. 나는 이것이 증분 백업의 형태를 취할 것이라는 점을 제 질문에서 제외했습니다. – Smitty

답변

1

Windows Server Backup Feature 좋은 대안이 될 수 있습니다 사용자 정의 내장 된 솔루션을 검사합니다. Windows Server 2016을 실행하는 경우이 새로운 기능을 흥미롭게 설명하는 article을 찾을 수 있습니다.

+0

나는 이것을 심각하게 보게 될 것입니다. 분명히 블록 수준이므로 개별 파일 수준 작업보다 낫습니다. – Smitty

+1

나는이 길로 갈 것 같습니다. 실제로 Windows Server Backup PowerShell (https://msdn.microsoft.com/en-us/library/gg241214(v=vs.85))을 호출하기 위해 .NET 응용 프로그램을 약간 작성할 수있는 곳을 찾았습니다. .aspx) 명령은 예약 된 '일회성'백업을 실행할 수 있습니다. 이것이 매력적인 솔루션 인 이유는 Windows Server 백업은 볼륨 섀도 복사본을 사용하기 때문에 좋은 파일이므로 일부 파일은 확실히 잠겨 있습니다. 또한 노출 된 스냅 샷에서 복사되는 개별 파일이 아닌 VHD 이미지 만 처리해야합니다. – Smitty

1

MFT (마스터 파일 테이블) 레코드는 1K or 1,024 bytes in size이므로 이름, 특성 등을 검색하는 데는 파일 데이터 자체를 이동하는 데 필요한 읽기와 비교할 때 약간의 I/O가 필요합니다. 따라서 파일 디렉터리 레코드를 열거하는 것은 문제가되지 않으며 처리의 일부를 제거해도 스피드 미터에 작은 깜박임 이상이 발생하지는 않습니다.

cloning software을 사용하여 디스크 데이터 자체의 저수준 BIOS "복제본"(복사본이 아님)을 시도해 볼 수 있다고 가정합니다. 디스크 헤드가 지그재그 할 필요가 없으므로 조금 더 빨라질 수 있습니다. 반면, 하드 디스크가 솔리드 상태 인 경우이 옵션은 거의 영향을 미치지 않습니다. 랜덤 액세스는 순차 액세스만큼 빠르기 때문입니다.

또 다른 옵션은 각 파일의 최종 수정 날짜 시간 소인을 검사하여 변경된 파일 만 백업하는 것입니다. 이를 수행하는 쉬운 방법은 /D 스위치 (인수 없음)와 함께 XCOPY 명령을 사용하여 마지막 백업의 날짜/시간을 현재 파일과 비교하고 하드 디스크의 파일이 더 새로운 경우에만 복사를 수행하는 것입니다 외장 드라이브의 파일보다

+0

정말 열거 형이 아니라 시간이 걸리는 복사 작업입니다. xcopy와 robocopy에 대해 들어 봤지만 FileSystemWatcher를 사용하여 디렉토리와 하위 디렉토리의 변경 이벤트를 잡아낼 수있는 무언가를 개발했습니다. 내가 바퀴를 다시 만들 수 없다면 나는 알 것이다. – Smitty

1

.Net과 다른 프로세스를 호출하고 RoboCopy를 사용하여 파일을 이동할 수 있습니다. 그것은 스레드의 수를 지정하는 등의 매개 변수를 많이 사용하는, 또는 타임 스탬프 등

public static void Main() 
{ 
    Process myProcess = new Process(); 

    try 
    { 
     myProcess.StartInfo.UseShellExecute = false; 
     myProcess.StartInfo.FileName = "C:\\Windows\\System32\\robocopy.exe Source Destination"; 
     myProcess.StartInfo.CreateNoWindow = true; 
     myProcess.Start(); 
    } 
    catch (Exception e) 
    { 
     Console.WriteLine(e.Message); 
    } 
}