[C#] .NET을 사용하고 루핑하지 않고 디렉토리에서 최신 파일을 찾는 방법은 무엇입니까?

디렉토리에서 가장 최근에 수정 된 파일을 찾아야합니다.

폴더의 모든 파일을 반복하고 비교할 수 있다는 것을 알고 File.GetLastWriteTime있지만 반복하지 않고이를 수행하는 더 좋은 방법이 있습니까?



답변

이런 식으로 …

var directory = new DirectoryInfo("C:\\MyDirectory");
var myFile = (from f in directory.GetFiles()
             orderby f.LastWriteTime descending
             select f).First();

// or...
var myFile = directory.GetFiles()
             .OrderByDescending(f => f.LastWriteTime)
             .First();


답변

재귀 적으로 검색하려면이 아름다운 코드를 사용할 수 있습니다.

public static FileInfo GetNewestFile(DirectoryInfo directory) {
   return directory.GetFiles()
       .Union(directory.GetDirectories().Select(d => GetNewestFile(d)))
       .OrderByDescending(f => (f == null ? DateTime.MinValue : f.LastWriteTime))
       .FirstOrDefault();
}

다음과 같이 부르십시오.

FileInfo newestFile = GetNewestFile(new DirectoryInfo(@"C:\directory\"));

그리고 그게 다야. FileInfo인스턴스가 있거나 null디렉토리가 비어있는 경우를 리턴합니다 .


답변

위의 첫 번째 패턴을 확장하여 특정 패턴을 검색하려면 다음 코드를 사용할 수 있습니다.

string pattern = "*.txt";
var dirInfo = new DirectoryInfo(directory);
var file = (from f in dirInfo.GetFiles(pattern) orderby f.LastWriteTime descending select f).First();


답변

비 LINQ 버전 :

/// <summary>
/// Returns latest writen file from the specified directory.
/// If the directory does not exist or doesn't contain any file, DateTime.MinValue is returned.
/// </summary>
/// <param name="directoryInfo">Path of the directory that needs to be scanned</param>
/// <returns></returns>
private static DateTime GetLatestWriteTimeFromFileInDirectory(DirectoryInfo directoryInfo)
{
    if (directoryInfo == null || !directoryInfo.Exists)
        return DateTime.MinValue;

    FileInfo[] files = directoryInfo.GetFiles();
    DateTime lastWrite = DateTime.MinValue;

    foreach (FileInfo file in files)
    {
        if (file.LastWriteTime > lastWrite)
        {
            lastWrite = file.LastWriteTime;
        }
    }

    return lastWrite;
}

/// <summary>
/// Returns file's latest writen timestamp from the specified directory.
/// If the directory does not exist or doesn't contain any file, null is returned.
/// </summary>
/// <param name="directoryInfo">Path of the directory that needs to be scanned</param>
/// <returns></returns>
private static FileInfo GetLatestWritenFileFileInDirectory(DirectoryInfo directoryInfo)
{
    if (directoryInfo == null || !directoryInfo.Exists)
        return null;

    FileInfo[] files = directoryInfo.GetFiles();
    DateTime lastWrite = DateTime.MinValue;
    FileInfo lastWritenFile = null;

    foreach (FileInfo file in files)
    {
        if (file.LastWriteTime > lastWrite)
        {
            lastWrite = file.LastWriteTime;
            lastWritenFile = file;
        }
    }
    return lastWritenFile;
}


답변

짧고 간단한 :

new DirectoryInfo(path).GetFiles().OrderByDescending(o => o.LastWriteTime).FirstOrDefault();


답변

조금 늦었지만 …

코드가 작동하지 않으므로 list<FileInfo> lastUpdateFile = null;
나중에 lastUpdatedFile.Add(file);NullReference 예외가 발생합니다. 작업 버전은 다음과 같아야합니다.

private List<FileInfo> GetLastUpdatedFileInDirectory(DirectoryInfo directoryInfo)
{
    FileInfo[] files = directoryInfo.GetFiles();
    List<FileInfo> lastUpdatedFile = new List<FileInfo>();
    DateTime lastUpdate = DateTime.MinValue;
    foreach (FileInfo file in files)
    {
        if (file.LastAccessTime > lastUpdate)
        {
            lastUpdatedFile.Add(file);
            lastUpdate = file.LastAccessTime;
        }
    }

    return lastUpdatedFile;
}

감사


답변

FileSystemWatcher 로 새로운 파일 활동에 반응 할 수 있습니다 .