2012-12-31 19 views
8

Directory.EnumerateFilesメソッドの既定の読み込み順序は何ですか?それは一貫していますか?Directory.EnumerateFiles読み込み順序(C#)

これまでのところ私の経験では、ファイルが作成された日だと思われますが、私はこれの確認を見つけることができませんでした。

理由私は、作業中のプログラムの一部が、ディレクトリからバイナリファイルを順番に配列に読み込まれたオブジェクトに読み込むため、質問します。これらのオブジェクトは、インデックスの配列によって互いに参照します。つまり、配列にロードされる順序は、インデックスの移動を避けるために一貫性を保つ必要があります。

私はここにいますが、もう少し小さな質問があります。ファイルが削除されると、私が何をしていても配列にロードされたファイルのインデックスが明らかに変更されます。この問題を避けるための提案はありますか?私は今までストレージを心配していたために辞書を使用することを避けました(避けることができれば、テキストキーの配列を格納するのではなくなります)が、実現可能な唯一のアプローチであれば実装する必要があります。


EDIT:あなたの答えからの優れたヒントの後、私は、ファイルの名前を使用して、辞書のアプローチにリファクタリングしました。パフォーマンスへの影響はごくわずかです。可読性と保守性が大幅に向上しているため、非常にうまく機能しています。

+0

なぜインデックスの代わりに参照を保持するだけではないのですか?あなたがこれをした場合、インデックスがシャッフルされる心配はありません。 – casperOne

+0

ファイルのシリアル化の仕組みのために。シリアライゼーションを介して参照を含むファイルを保存してからそれらのファイルをロードする場合は、毎回オブジェクトツリー全体をロードして大量の重複を招くことになります。たとえば、CarがTireとTruckの参照Tireを参照していて、それらが保存されて読み込まれている場合、私はTireの2つの複製インスタンスを持ちます。 – Djentleman

+2

GetFiles(本質的に 'EnumerateFiles'を呼び出します)については、[MSDN](http://msdn.microsoft.com/en-us/library/07wt70x2.aspx)を参照してください。*返されるファイル名の順序は、保証されません。特定の並べ替え順序が必要な場合は、Sort()メソッドを使用してください。*ドキュメントに記載されているように、独自の並べ替え方法を使用することをお勧めします。 – Mir

答えて

10

あなたが知る限り、それは文書化されていません - したがって、あなたがでもパターンを見つけることができます、それに頼るべきではありません。 .NETのバージョンやオペレーティングシステムのバージョンによって異なる場合があります。または単にサービスパック間で変更する場合があります。代わりに、特定の順序が必要な場合は、自分で並べ替える必要があります。もちろん残念ながら、それらのファイル名を処理する前にすべてのファイル名を見つける必要がありますが、一貫性があります。

正直言っても、非常に壊れやすいデータモデルがあるようです。あなたは本当にあなたがそれを修正するために何をしているかについて私たちに十分な説明をしていませんが、Directory.EnumerateFilesの結果内のファイルの整数インデックスはです。確かには最善の方法ではありません。

インデックスの代わりにファイルを使用した場合、ファイルを読み込むときにファイルを処理できるようになりますが、実行しようとしていることによってはさらに良い方法があるかもしれません。その名前を使用するのは、それほど安くはありません。整数ではなく単なる文字列参照であり、複数の場所で使用されていても同じ文字列オブジェクトへの参照がいくつかあります。

4

ドキュメントでは注文は指定されていませんが、LINQのOrderBy機能を使用することで、いつでも注文を強制することができます。

実際にアレイから項目を削除するのではなく、nullへの参照を消去することで、インデックスの変更をスキップできます。ここでのトレードオフは、指定されたインデックスのアイテムがnullであるかどうかを確認する必要があることです。

Dictionaryに基づいたより読みやすいデータ構造を念頭に置いている場合は、コードのこの特定の部分を最適化する必要があることをプロファイラが通知するまで、効率の問題を無視してください。

13

.NETで使用される基になるWin32 APIはFindFirstFileFindNextFileです。The documentation specifically states

この関数がファイル名を返す順序は、ファイルシステムの種類によって異なります。 NTFSファイルシステムとCDFSファイルシステムでは、名前は通常アルファベット順に返されます。 FATファイルシステムでは、名前は通常、ファイルがディスクに書き込まれた順に返されます。アルファベット順である場合とそうでない場合があります。ただし、前述のとおり、これらの動作は保証されていません。

だから、ファイルが返される順序は保証できません。その他の答えは、この問題を回避するのに十分な方法を提供します。

+0

ありがとうございます。有用! – Shimmy

+0

私はこの技術的な詳細とリンクが好きです。 – Gqqnbig

関連する問題