ubichupas.net

【C#】ファイル一覧をファイル名でソートする

C#でフォルダ内のファイル一覧を取得するにはDirectoryInfo.GetFilesメソッドなどを使用しますが、そのファイル一覧は順序が保証されていません。 しかし今までファイル名順に取得できていた気がするので実験してみたところ、どうやらHDDをNTFSでフォーマットしているとファイル名順に取得できるらしい。 逆に言うとFAT32だとファイル名順にならなかったのです。 (;゚Д゚)エーッ!

FAT32とNTFSの違い

ファイルシステムに依存した話なので、dirコマンドでファイル一覧を表示した場合にも同様の現象が確認できます。 4つのファイル(001.jpg、002.jpg、003.jpg、004.jpg)を用意して、このうち003.jpgのファイル名を005.jpgに変更した後、dirコマンドで一覧を表示してみました。

するとNTFSのドライブ上ではファイル名順(001.jpg、002.jpg、004.jpg、005.jpg)に並び直されましたが、FAT32のドライブ上では同じ並び順(001.jpg、002.jpg、005.jpg、004.jpg)で表示されました。 FAT32では概ねファイルを作成した順番から変わらないようです。 (´・∀・`)ヘー

ちなみに/oオプションを付けるとdirコマンドの結果はソートされます。

ファイル名でソートするサンプルコード

ようは配列の並べ替えなのでArray.Sortメソッドにかければソートできます。 デリゲートを使った書き方をするのがC#らしくて良いでしょう。

file_sort.cs
static void Main(string[] args)
{
   // コマンドライン引数でディレクトリを指定
   if (args.Length < 1)
   {
       Console.WriteLine("Usage: <dir path>");
       return;
   }

   DirectoryInfo dir = new DirectoryInfo(args[0]);
   if (!dir.Exists)
   {
       Console.WriteLine("Not Found. {0}", args[0]);
       return;
   }

   // ファイル一覧を取得
   FileInfo[] files = dir.GetFiles();

   Array.Sort<FileInfo>(files, delegate(FileInfo a, FileInfo b)
   {
       // ファイルサイズで昇順ソート
       // return (int)(a.Length - b.Length);

       // ファイル名でソート
       return a.Name.CompareTo(b.Name);
   });

   // ソートしたファイル一覧を表示
   int count = 0;
   foreach (FileInfo file in files)
   {
       Console.WriteLine("{0,3} | {1}", ++count, file.Name);
   }

}

0 件のコメント: