162

ディレクトリで最後に変更されたファイルを見つける必要があります。

フォルダー内のすべてのファイルをループして比較できることはわかっていますが、File.GetLastWriteTimeループせずにこれを行うより良い方法はありますか?

4

11 に答える 11

353

このようなものはどうですか...

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();
于 2009-07-24T20:25:44.627 に答える
29

上記の最初のものを拡張して、特定のパターンを検索したい場合は、次のコードを使用できます。

using System.IO;
using System.Linq;
...
string pattern = "*.txt";
var dirInfo = new DirectoryInfo(directory);
var file = (from f in dirInfo.GetFiles(pattern) orderby f.LastWriteTime descending select f).First();
于 2012-07-11T02:20:49.233 に答える
20

再帰的に検索したい場合は、次の美しいコードを使用できます。

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か、ディレクトリが空の場合。

于 2011-04-24T03:55:59.310 に答える
10

非 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;
}
于 2009-11-23T07:51:11.310 に答える
3

FileSystemWatcherを使用して、新しいファイル アクティビティに対応できます。

于 2009-07-24T20:25:17.267 に答える
3

ちょっと遅いけど…

NullReference 例外がスローされるためlist<FileInfo> lastUpdateFile = null; 、コードは機能しません。lastUpdatedFile.Add(file);作業バージョンは次のとおりです。

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;
}

ありがとう

于 2014-05-27T19:58:58.993 に答える
0
private List<FileInfo> GetLastUpdatedFileInDirectory(DirectoryInfo directoryInfo)
{
    FileInfo[] files = directoryInfo.GetFiles();
    List<FileInfo> lastUpdatedFile = null;
    DateTime lastUpdate = new DateTime(1, 0, 0);
    foreach (FileInfo file in files)
    {
        if (file.LastAccessTime > lastUpdate)
        {
            lastUpdatedFile.Add(file);
            lastUpdate = file.LastAccessTime;
        }
    }

    return lastUpdatedFile;
}
于 2012-02-07T07:48:12.303 に答える
0

これは私のアプリの束であり、次のようなステートメントを使用します。

  var inputDirectory = new DirectoryInfo("\\Directory_Path_here");
  var myFile = inputDirectory.GetFiles().OrderByDescending(f => f.LastWriteTime).First();

ここから、「inputDirectory」変数のディレクトリに最近保存/追加/更新されたファイルのファイル名が表示されます。これで、それにアクセスして、必要なことを行うことができます。

それが役立つことを願っています。

于 2016-02-23T18:55:38.697 に答える