.NET에서 생성 날짜별로 파일 가져 오기


94

많은 파일이 포함 된 폴더가 있습니다. 생성 날짜 / 시간별로 정렬 된 디렉토리에서 파일 이름을 얻는 쉬운 방법이 있습니까?

을 사용하면 Directory.GetFiles()파일 이름별로 정렬 된 파일이 반환됩니다.



4
GetFiles ()는 정렬 되지 않으므로 이름순으로 정렬하는 것은 우연입니다. 자신을 정렬하십시오.
Hans Passant 2011 년

답변:


203

이것은 당신을 위해 일할 수 있습니다.

using System.Linq;

DirectoryInfo info = new DirectoryInfo("PATH_TO_DIRECTORY_HERE");
FileInfo[] files = info.GetFiles().OrderBy(p => p.CreationTime).ToArray();
foreach (FileInfo file in files)
{
    // DO Something...
}

'System.IO.FileInfo은 []' '있는 OrderBy'에 대한 정의가 포함되어 있지 않습니다
UMAIR 자바

2

14
ToArray () 메서드를 호출 할 필요가 없다고 생각합니다.
Ivo

.NET 2.0을 대상으로하기 때문에 확장 메서드 / LINQ를 사용하지 않는 AnyIdeas
Pratik

10
디렉토리의 파일이 다른 시간대 (일광 절약 시간 포함)에서 생성되었을 가능성이있는 경우 CreationTime 대신 info.GetFiles (). OrderBy (p => p.CreationTimeUtc)를 사용하는 것이 좋습니다.
Steve

46

Linq를 사용할 수 있습니다.

var files = Directory.GetFiles(@"C:\", "*").OrderByDescending(d => new FileInfo(d).CreationTime);

2
DirectoryInfo 솔루션은 이것보다 훨씬 빠릅니다 (특히 네트워크 경로의 경우)
jing

9

LINQ를 사용하지 않으려는 경우

// Get the files
DirectoryInfo info = new DirectoryInfo("path/to/files"));
FileInfo[] files = info.GetFiles();

// Sort by creation-time descending 
Array.Sort(files, delegate(FileInfo f1, FileInfo f2)
{
    return f2.CreationTime.CompareTo(f1.CreationTime);
});

4

마지막으로 수정 한 날짜와 해당 기간을 반환합니다.

DateTime.Now.Subtract(System.IO.File.GetLastWriteTime(FilePathwithName).Date)

1

@jing : "DirectoryInfo 솔루션은 이것보다 훨씬 빠릅니다 (특히 네트워크 경로의 경우)"

나는 이것을 확인할 수 없다. Directory.GetFiles가 파일 시스템 또는 네트워크 캐시를 트리거하는 것처럼 보입니다. 첫 번째 요청은 시간이 걸리지 만 새 파일이 추가 된 경우에도 다음 요청은 훨씬 빠릅니다. 내 테스트에서 동일한 패턴을 가진 Directory.getfiles 및 info.GetFiles를 수행했으며 둘 다 동일하게 실행됩니다.

GetFiles  done 437834 in00:00:20.4812480
process files  done 437834 in00:00:00.9300573
GetFiles by Dirinfo(2)  done 437834 in00:00:20.7412646

1

성능이 문제가되는 경우 MS_DOS에서 다음 명령을 사용할 수 있습니다.

dir /OD >d:\dir.txt

이 명령 은 ** d : ** 루트에 dir.txt 파일을 생성하고 모든 파일을 날짜별로 정렬합니다. 그런 다음 코드에서 파일을 읽으십시오. 또한 * 및?로 다른 필터를 추가합니다.


0
            DirectoryInfo dirinfo = new DirectoryInfo(strMainPath);
            String[] exts = new string[] { "*.jpeg", "*.jpg", "*.gif", "*.tiff", "*.bmp","*.png", "*.JPEG", "*.JPG", "*.GIF", "*.TIFF", "*.BMP","*.PNG" };
            ArrayList files = new ArrayList();
            foreach (string ext in exts)
                files.AddRange(dirinfo.GetFiles(ext).OrderBy(x => x.CreationTime).ToArray());
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.