質問

System.IO.Directory.GetFiles() を返します string[]. 。戻り値のデフォルトの並べ替え順序は何ですか?私は名前から推測していますが、もしそうなら、現在の文化はどの程度影響を及ぼしますか?作成日などに変更してもらえますか?

アップデート: MSDN は、.Net 3.5 では並べ替え順序が保証されていないと指摘していますが、2.0 バージョンのページには何も記載されておらず、どちらのページも作成時間や変更時間などによる並べ替えには役立ちません。配列を取得すると、その情報は失われます (配列には文字列のみが含まれます)。取得した各ファイルをチェックする比較器を構築することもできますが、それは、おそらく .GetFiles() メソッドがすでにこれを実行しているときに、ファイル システムに繰り返しアクセスすることを意味します。とても非効率的に思えます。

役に立ちましたか?

解決

CreationTime などのファイルのプロパティに興味がある場合は、System.IO.DirectoryInfo.GetFileSystemInfos() を使用する方が合理的です。次に、System.Linq の拡張メソッドの 1 つを使用して、これらを並べ替えることができます。例:

DirectoryInfo di = new DirectoryInfo("C:\\");
FileSystemInfo[] files = di.GetFileSystemInfos();
var orderedFiles = files.OrderBy(f => f.CreationTime);

編集 - 申し訳ありませんが、.NET2.0 タグに気づかなかったので、LINQ ソートは無視してください。ただし、System.IO.DirectoryInfo.GetFileSystemInfos() を使用するという提案は依然として有効です。

他のヒント

.NET 2.0 では、Array.Sort を使用して FileSystemInfo を並べ替える必要があります。

さらに、Comparer デリゲートを使用すると、比較のためだけにクラスを宣言する必要がなくなります。

DirectoryInfo dir = new DirectoryInfo(path);
FileSystemInfo[] files = dir.GetFileSystemInfos();

// sort them by creation time
Array.Sort<FileSystemInfo>(files, delegate(FileSystemInfo a, FileSystemInfo b)
                                    {
                                        return a.LastWriteTime.CompareTo(b.LastWriteTime);
                                    });

これが私が使用した VB.Net ソリューションです。

まず日付を比較するクラスを作成します。

Private Class DateComparer
    Implements System.Collections.IComparer

    Public Function Compare(ByVal info1 As Object, ByVal info2 As Object) As Integer Implements System.Collections.IComparer.Compare
        Dim FileInfo1 As System.IO.FileInfo = DirectCast(info1, System.IO.FileInfo)
        Dim FileInfo2 As System.IO.FileInfo = DirectCast(info2, System.IO.FileInfo)

        Dim Date1 As DateTime = FileInfo1.CreationTime
        Dim Date2 As DateTime = FileInfo2.CreationTime

        If Date1 > Date2 Then Return 1
        If Date1 < Date2 Then Return -1
        Return 0
    End Function
End Class

次に、配列をソートするときに比較子を使用します。

Dim DirectoryInfo As New System.IO.DirectoryInfo("C:\")
Dim Files() As System.IO.FileInfo = DirectoryInfo.GetFiles()
Dim comparer As IComparer = New DateComparer()
Array.Sort(Files, comparer)

Dim Files() As String
Files = System.IO.Directory.GetFiles("C:\")
Array.Sort(Files)

から msdn:

返されるファイル名の順序は保証されません。特定の並べ替え順序が必要な場合は、Sort() メソッドを使用します。

選別() メソッドは標準の Array.Sort() で、(他のオーバーロードの中でも特に) IComparables を受け取るため、作成日で並べ替えると、マシンの設定に基づいてローカライズが処理されます。

おっしゃる通りです。デフォルトは私の名前 asc です。並べ替え順序を変更する唯一の方法は、FileInfo コレクションからデータテーブルを作成することです。

その後、データテーブルから DefaultView を使用し、.Sort メソッドでディレクトリを並べ替えることができます。

これはかなり手間がかかり、かなり時間がかかりますが、誰かがより良い解決策を投稿してくれることを期待しています。

カスタム iComparer を実装して並べ替えを行うことができます。ファイルのファイル情報を読み取り、必要に応じて比較します。

IComparer comparer = new YourCustomComparer();
Array.Sort(System.IO.Directory.GetFiles(), comparer);

msdn info IComparer インターフェイス

より簡潔な VB.Net バージョンは非常に優れています。ありがとう。リストを逆順に移動するには、reverse メソッドを追加します...

For Each fi As IO.FileInfo In filePaths.reverse
  ' Do whatever you wish here
Next

MSDN ドキュメント 戻り値の順序は保証されないと述べています。Sort() メソッドを使用する必要があります。

作成日で並べ替えるカスタム IComparer インターフェイスを作成し、それを Array.Sort に渡すことができます。おそらく、StrCmpLogical も参照する必要があります。StrCmpLogical は、エクスプローラーが使用する並べ替え (数値とテキストを正しく並べ替える) を行うために使用されます。

作成日などで並べ替えたい場合は、おそらく DirectoryInfo.GetFiles を使用し、適切な述語を使用して結果の配列を並べ替える必要があります。

ただのアイデアです。私は簡単な方法を見つけて、すでに利用可能なリソースを再利用してみるのが好きです。ファイルを並べ替える場合は、プロセスを作成し、「DIR [x:\Folders\SubFolders*.*] /s /b /on」に syscal を実行して、出力をキャプチャするだけでしょう。

システムの DIR コマンドを使用すると、次の基準で並べ替えることができます。

/O          List by files in sorted order.
sortorder    N  By name (alphabetic)       S  By size (smallest first)
             E  By extension (alphabetic)  D  By date/time (oldest first)
             G  Group directories first    -  Prefix to reverse order

The /S switch includes sub folders

D = By Date/Time が LastModifiedDate または FileCreateDate を使用しているかどうかはわかりません。ただし、必要なソート順序がすでに DIR コマンドに組み込まれている場合は、syscall を呼び出してそれを取得します。そして速いです。私はただの怠け者です ;)

少しグーグルで調べたところ、特定の日付/時刻で並べ替えるスイッチが見つかりました:-

/t [[:]TimeField] : Specifies which time field to display or use for sorting. The following list describes each of the values you can use for TimeField. 

Value Description 
c : Creation
a : Last access
w : Last written

興味のある方は、より簡潔な VB.Net バージョンをご覧ください。

Dim filePaths As Linq.IOrderedEnumerable(Of IO.FileInfo) = _
  New DirectoryInfo("c:\temp").GetFiles() _
   .OrderBy(Function(f As FileInfo) f.CreationTime)
For Each fi As IO.FileInfo In filePaths
  ' Do whatever you wish here
Next
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top