2017-12-14 14 views
0

だから私と一緒に裸で。私がしたいのは、何かで始まる複数のファイルのディレクトリを検索/スキャンし、最後に最後に変更されたファイルを取得することです。たとえば、 "apple"、 "pear"、 "orange"で始まるファイルのディレクトリPrefetchを検索したいとします。これらのファイルは存在しないかもしれませんが、そうであればリンゴで始まるファイルと、pearで始まるファイルがあり、それらのファイルのうち、最近変更されたファイルを取得したいとします。以下のコードは私にこれを可能にしますが、1つだけを検索します。ディレクトリで何かで始まるファイルを検索する方法は、一番最近変更されたファイルを取得する

DirectoryInfo prefetch = new DirectoryInfo("c:\\Windows\\Prefetch"); 
FileInfo[] apple = prefetch.GetFiles("apple*"); 
if (apple.Length == 0) 
    // Do something 
else 
{ 
    double lastused = DateTime.Now.Subtract(
        apple.OrderByDescending(x => x.LastWriteTime) 
          .FirstOrDefault().LastWriteTime).TotalMinutes; 
    int final = Convert.ToInt32(lastused); 
} 

基本的に、リンゴの代わりにコード検索「apple」、「pear」などを作成するにはどうすればよいですか?上記のコードを修正して完全に変更する必要があるかどうかはわかりません。私は何時間もこれを理解しようとしてきましたが、それはできません。

List<string> files=new List<string>(); 
foreach(var str in prefixes) 
    files.AddRange(dirInfo.GetFiles(str)); 

return (from d in (from name in files select File.GetLastAccessTime(name)) orderby d descending).FirstOrDefault(); 

プレフィックスは、検索パターンのリストであり、そしてdirInfoはDirectoryInfoです:

あなたはその後、それらのファイルの日付を確認接頭辞に一致するファイルのセットを作成することができ
+0

GetFilesを適切なパターンで3回コールし、3つの異なる配列に結果を格納し、それらを単一のリストに追加します。これで、降順で順序を適用し、リストの最初の要素を取得できます。最終的にその計算で何をしようとしているのかはっきりしない – Steve

+0

これがどのように機能し、おそらく私の問題を解決するのか分かりますが、どうすればそれらを保存してリストに追加できますか? – DylanC

+0

** List **を宣言し、AddRangeを使用して3つのファイルセットを同じリストに追加します。今、そのリストのOrderByDescendingとFirstOrDefaultが、あなたにセットの最新の書かれたファイルを与えるでしょう。 – Steve

答えて

1

としては、私のコメントで説明したリストを反復処理することができます。 1パターンだけがサポートされています。

既に説明したように、パターンのリストを準備し、各パターンのGetFilesをループで呼び出すことができます。

しかし、私はあなたにも同じアプローチを示していますが、Linqのコードは1行だけで済みます。今

List<string> patterns = new List<string> { "apple*", "pear*", "orange*" }; 
DirectoryInfo prefetch = new DirectoryInfo(@"c:\Windows\Prefetch"); 

var result = patterns.SelectMany(x => prefetch.GetFiles(x)) 
        .OrderByDescending(k => k.LastWriteTime) 
        .FirstOrDefault(); 

結果は、最新の更新とのFileInfoです。もちろん、3つのパターンに一致するファイルがない場合、の結果はになります。その変数を使用する前のチェックは必須です。

0

は、のようなものは(テストしていません)オブジェクト。

+1

DirectoryInfo.GetFilesはFileInfosを返します。最後の行は必要ありませんが、OrderByDescendingとFirstOrDefaultだけです – Steve

0

あなたはとても異なるパターンでののFileInfoをリストを返すようにDirectoryInfo.GetFilesを使用することはできません

List<string> patterns = new List<string> { "apple*", "pear*", "orange*" }; 
    DirectoryInfo prefetch = new DirectoryInfo("c:\\Windows\\Prefetch");   

    foreach (var pattern in patterns) { 
     FileInfo[] files = prefetch.GetFiles(pattern); 
     var lastAccessed = files.OrderByDescending(x => x.LastAccessTime).FirstOrDefault(); 
     if (lastAccessed != null) { 
      var minutes = DateTime.Now.Subtract(lastAccessed.LastAccessTime).TotalMinutes; 
     } 
    } 
関連する問題