2011-08-31 4 views
3

C#에서 매개 변수로 디렉터리 경로를 가져 오는 함수를 작성하려고하며 키가 해당 디렉터리 바로 아래의 파일이고 값이있는 사전을 반환합니다. 그들의 마지막 수정 시간입니다. 이 작업은 Directory.GetFiles()와 File.GetLastWriteTime()에서 쉽게 수행 할 수 있습니다. 그러나 이것은 모든 파일에 액세스해야한다는 것을 의미하며, 이는 필자의 필요에 비해 너무 느립니다. 디렉터리에만 액세스하는 동안이 작업을 수행 할 수있는 방법이 있습니까? 파일 시스템이 이런 종류의 요구 사항을 지원합니까?디렉터리에 액세스하는 동안 디렉터리 아래에있는 모든 파일의 특성 가져 오기

일부 대답을 읽은 후 편집 : 여러분 모두, FileInfo 객체를 사용해 주셔서 감사합니다. 그래도 Directory.GetFiles() (또는 Directory.EnumerateFiles())를 사용하여 이러한 객체를 가져 오는 것은 속도가 느리고, 모든 파일에 액세스해야하는 것으로 생각됩니다. 파일 시스템이 파일 자체의 파일의 최종 수정 시간을 유지하는 경우 파일 액세스없이 해당 정보를 추출 할 수 없습니다. 이 사건이 여기 있습니까? DirectoryInfo의 GetFiles() 및 EnumerateFiles()는 모든 파일에 액세스하거나 디렉토리 항목에서 해당 정보를 가져 옵니까? 필자가 파일 이름만을 원한다면 모든 파일에 액세스하지 않고도 Directory 클래스를 사용하여이 작업을 수행 할 수 있다는 것을 알고 있습니다. 그러나 속성을 얻는 것이 더 까다로워 보입니다 ...

편집 후 henk 님의 답변 : FileInfo Object를 사용하는 것이 더 빠릅니다.
31/08/2011 17시 14분 48초
31/08/2011 17시 14분 51초
: 난 보통 뭔가를 얻을, 약 800 파일의

static void Main(string[] args) 
    { 
     Console.WriteLine(DateTime.Now); 

     foreach (string file in Directory.GetFiles(@"\\169.254.78.161\dir")) 
     { 
      DateTime x = File.GetLastWriteTime(file); 
     } 

     Console.WriteLine(DateTime.Now); 

     DirectoryInfo dirInfo2 = new DirectoryInfo(@"\\169.254.78.161\dir"); 
     var files2 = from f in dirInfo2.EnumerateFiles() 
       select f; 
     foreach (FileInfo file in files2) 
     { 
      DateTime x = file.LastWriteTime; 
     } 

     Console.WriteLine(DateTime.Now); 
    } 

: 나는 다음과 같은 테스트를 생성 31/08/2011 17:14:52

+2

아니요,이 정보는 파일에 액세스 할 필요가 없으며 MFT의 디렉토리 항목 만 필요합니다. 속도가 너무 느린 경우 더 빠른 디스크가 필요합니다. –

+0

@Yoni : 너는 어떻게/무엇을 측정하고 있니? GetFiles에 대한 호출을 각 파일을 열거 나 닫는 루프와 비교 했습니까? 루프가 두 배 오래 걸리는 반면 GetFiles()는 100 | 200 파일에 대해 거의 같은 시간이 걸릴 것으로 예상됩니다. –

+0

당신이 옳다고 생각합니다. 나는 약간의 테스트를했는데 위의 편집을 참조하십시오. – Yoni

답변

1

제가 생각할 수있는 유일한 다른 점은 FileInfo -Class입니다. 최대한 멀리 볼 수있는이 당신을 도울 수도 있고 그것뿐만 아니라 (읽기 권한이 필요합니다) 파일

+0

감사합니다. 나는 당신이 무엇을 의미하는지 정확히 모르지만 그 중 하나는 다소 도움이된다. http://msdn.microsoft.com/en-us/library/dd413232.aspx – Yoni

+0

그건 내가 말했듯이 FileInfo-Objects에 접근하는 단지 방법이다. . 그 Info * Object가 내부 코드와 똑같이 동작하는지는 모르겠지만 ... 마음은 참을 수 없습니다. – Carsten

+0

DirectoryInfo 객체에 EnumerateFiles()를 적용하면 필요한 마지막 쓰기 시간을 포함하는 모든 FileInfo 객체가 반환됩니다.그러나 그것은 여전히 ​​"내가 파일을 읽을 수도 있습니다"라고 말하려고했던 모든 파일 – Yoni

2

내가 어떤 타이밍하지만 가장 좋은 건하지 않았다 읽을 수 있습니다 :

DirectoryInfo di = new DirectoryInfo(myPath); 
FileInfo[] files = di.GetFiles(); 

나는 생각한다 모든 FileInfo 속성을 디렉토리 파일 레코드에서 사용할 수 있으므로 최소한의 I/O가 필요합니다.

+0

GetFiles() 구현 방법을 모르겠지만 내가 측정하는 시간에 따라, 그것을 액세스하는 것으로 보인다 정보를 얻는 모든 파일 – Yoni

관련 문제