11

Directory.EnumerateFilesメソッドのデフォルトの読み取り順序は何ですか?一貫性がありますか?

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

私が尋ねる理由は、私が取り組んでいるプログラムの一部が、バイナリファイルをディレクトリからオブジェクトにロードし、オブジェクトが配列にロードされるためです。これらのオブジェクトは、インデックスの配列によって相互に参照します。つまり、配列にロードされる順序は一貫している必要があります(インデックスのシフトを回避するため)。

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


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

4

3 に答える 3

20

FindFirstFile.NETで使用される基盤となるWin32APIはとFindNextFileです。ドキュメントには具体的に次のように記載されています。

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

したがって、ファイルが返される順序を保証することはできません。他の回答は、この動作を回避するための十分な方法を提供します。

于 2012-12-31T04:11:07.560 に答える
11

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

正直なところ、非常に壊れやすいデータモデルを持っているようです。あなたはそれを修正するためにあなたがしていることについて本当に十分に私たちに話していませんが、結果の中でファイルの整数インデックスを使用することDirectory.EnumerateFiles確かに最善のアプローチではありません。

インデックスの代わりにファイルを使用した場合、ファイルを読み取るときにファイルを処理できる可能性がありますが、実行しようとしていることによっては、さらに優れたアプローチがある可能性があります。名前の使用は、それでもかなり安価であるはずです。整数ではなく単一の文字列参照になり、複数の場所で使用されている場合でも、同じ文字列オブジェクトへの複数の参照になります。

于 2012-12-31T04:02:39.220 に答える
4

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

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

に基づくより読みやすいデータ構造を念頭に置いている場合は、Dictionaryそれに切り替えることを検討し、プロファイラーがコードのこの特定の部分を最適化する必要があると指示するまで、効率の懸念を無視してください。

于 2012-12-31T04:06:42.710 に答える