2013-07-19 1 views
-1

디렉토리에있는 모든 파일을 검사하고 콘솔에 목록을 작성하는 기능이 있습니다. 문제는 현재 디렉터리에 복사되는 파일을 포함시키지 않고 완료된 파일 만 표시하기를 원합니다. 어떻게해야합니까? 여기 내 코드는 다음과 같습니다.디렉토리의 모든 파일을 표시하지만 현재 복사중인 파일은 표시하지 않습니다.

foreach (string file in Directory.EnumerateFiles("C:\folder")) 
     { 
      Console.WriteLine(file); 
     } 
+0

응용 프로그램에서 파일을 복사합니까? 그렇다면 복사 할 각 파일의 이름을 목록에 추가하고 목록에없는 파일을 인쇄 할 수 있습니다. – PoweredByOrange

+1

"현재 복사 중"질문의 맥락에서 "현재"의 정의는 무엇입니까? – Learner

+1

[XY 문제] (http://meta.stackexchange.com/questions/66377/).너 왜 신경 쓰냐? 어떻게 대답을 알면 도움이 될까요? 목록을 만들었지 만 "콘솔"에 표시된 후에 파일이 디렉토리에 "복사"되지 않으면 어떻게됩니까? –

답변

1

Windows/.NET/아무 곳이나 "현재 파일 복사 중"목록이 없습니다. 아마 당신이 할 수있는 일은 아마도 추가를 위해 각 파일을 열어보고 예외가 있는지 확인하는 것입니다. 디렉토리의 크기와 위치 및 보안 설정에 따라 옵션이 아닐 수도 있습니다.

1

가이 작업을 수행 할 수있는 깨끗한 방법은 아니지만,이 ... 작동 ...

foreach (var file in new DirectoryInfo(@"C:\Folder").GetFiles()) 
{ 
    try 
    { 
     file.OpenRead(); 
    } 
    catch 
    { 
     continue; 
    } 
    Console.WriteLine(file.Name); 
} 
3

대 "무언가 서면 잠겨" "복사"말할 수 실제로있는 방법은 없습니다. 관련 : How to check for file lock?

당신은 단순히 쓰기 위해 열되지 않은 파일의 목록을 표시하려면 Can I simply 'read' a file that is in use?, 당신이 할 수있는을 열려고 시도하여 :

foreach (string file in Directory.EnumerateFiles("C:\folder")) 
{ 
    try { 
    using (var file = file.Open(file, FileMode.Open, FileAccess.Read, FileShare.ReadWrite) { 
     Console.WriteLine(file); 
    } 
    } catch { 
    // file is in use 
    continue; 
    } 
} 

을하지만 -주의를 많이.

  • 바로 그것에도 불구하고, 파일이 호출이 성공을 의미합니다 파일을 작성하는 과정은 FileShare.Read 사용했을 수
  • 뭔가 다른 열 수 있습니다합니다 (using 블록 끝) 파일 이름을 표시 한 후 에 써졌다.

내가 정확히 당신이 여기까지하는지 모르겠지만, 큐 디렉토리를 공유하는 두 개의 프로세스 같은 소리 : 하나 개의 쓰기, 하나 개의 읽기/처리. 가장 큰 도전은 파일을 작성하는 데 시간이 걸리므로 "읽기"프로세스가 끝나고 전체 파일이 있기 전에 읽는 것을 시도합니다. 공유 모드에 따라 어떤 식 으로든 실패합니다. , 기록 등

이 상황을 처리하는 일반적인 패턴은 Move 같은 원자 파일 작업을 사용하는 것입니다

:

  • 에서의 임시 디렉토리에 (느리게) 쓰기/복사 작업을 수행 동일한 파일 시스템 (매우 중요) 대기열 디렉토리로
  • 일단 완료되면 임시 폴더에서 이동하십시오 ry 디렉토리에서 대기열 디렉토리로 이동하십시오.

이동은 원자 적이므로 파일이 없거나 100 %있을 것입니다. "읽기"프로세스가 부분적으로 파일을 보는 기회가 없습니다.

파일 시스템간에 이동을 수행하면 복사본과 동일하게 작동합니다.

관련 문제