0

それが私が試したことですが、ルートの下の最上位ディレクトリのみから最新のファイルのみを返します

if(Directory.Exists("YourPath"))
foreach (string _tempFiles in Directory.GetDirectories("YourPath")
                       .Select(directory => Directory.GetFiles(directory, "*.*", SearchOption.AllDirectories)
                       .OrderByDescending(File.GetLastWriteTime)
                       .FirstOrDefault()))
4

2 に答える 2

2

これは、各ディレクトリ (ルートを含む) のすべての最新ファイルを返します。

var rootDirFile = Directory
    .EnumerateFiles(yourPath, "*.*", SearchOption.TopDirectoryOnly)
    .OrderByDescending(f => File.GetLastWriteTime(f))
    .Take(1);
var allNewestFilesOfEachFolder = Directory
    .EnumerateDirectories(yourParth, "*.*", SearchOption.AllDirectories)
    .Select(d => Directory.EnumerateFiles(d, "*.*")
        .OrderByDescending(f => File.GetLastWriteTime(f))
        .FirstOrDefault());
// put both together, the root-file first
allNewestFilesOfEachFolder = rootDirFile.Concat(allNewestFilesOfEachFolder);

ディレクトリにファイルがない場合、ファイルはnullであるため、ファイルの数はフォルダーの数に等しくなります。

System.IOエラー処理が難しいため、Linq は適切なツールではないことに注意してください。

于 2013-01-20T10:35:03.200 に答える
0

これを処理するための基本的な再帰関数を作成しました。

// Dictionary: 
//   Key = The directory name.
//   Value = The most recently modified file for that directory.
public static Dictionary<string, string> GetNewestFiles(string directory)
{
  return GetNewestFiles(directory, null);
}

static Dictionary<string, string> GetNewestFiles(string directory, 
                                                 Dictionary<string, string> dictionary)
{
  if(dictionary == null)
    dictionary = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);

  try
  {
    var files = from file in Directory.GetFiles(directory)
                select new FileInfo(file);

    var latestFile = files.OrderByDescending(file => { return file.LastWriteTimeUtc; }).FirstOrDefault();

    if (latestFile != null)
      dictionary[latestFile.DirectoryName] = latestFile.FullName;
  }
  catch { }

  foreach (var subDirectory in Directory.GetDirectories(directory))
  {
    try
    {
      GetNewestFiles(subDirectory, dictionary);
    }
    catch { }
  }

  return dictionary;
}

したがって、次のように呼び出すことができます。

var fileDictionary = GetNewestFiles(@"C:\MyFolder");

于 2013-01-20T10:49:28.310 に答える