.NETでの作成日によるファイルの取得


92

多くのファイルを含むフォルダがあります。ディレクトリ内のファイル名を作成日時でソートする簡単な方法はありますか?

を使用するとDirectory.GetFiles()、ファイル名でソートされたファイルが返されます。


私は同様の質問を見つけました:stackoverflow.com/questions/52842/sorting-directory-getfiles
センスフル

4
GetFiles()は並べ替えを行わず、名前順に並べ替えることは偶然です。自分を並べ替えるだけです。
ハンスパッサント2011年

回答:


198

これはあなたのために働くことができます。

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 Jabbar

2
これは拡張メソッドです... msdn.microsoft.com/en-us/library/bb383977.aspx
Ivo

12
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

8

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.