2010-12-01 13 views
2

私は日付に基づいて並べ替えるファイルのリストを持っています。注意すべき点は、リスト内の各ファイルに日付がファイル名の一部として含まれていることです。この日付に基づいてファイルを並べ替える必要があります。これは、ファイル名文字列の日付がファイル内のコンテンツと相関するためです。つまり、ファイルの実際の日付プロパティ、作成日時、変更日時、アクセス日時などは、ファイルが移動されるたびに変更されることがあります私の目的のためにそれに依存することはできません。私は、リストの並べ替え方法で使用するためにカスタムのコンペアを作成していますが、そこにいる誰かがこれに対して他のより良いまたはユニークなアプローチを持っているかどうかを見たいと思っていました。前もって感謝します。ファイルの内容でファイルを並べ替える

はUPDATE:YYYYMMDDとHHMMSSは、それぞれの日付と時刻、ある

{Test Name}_{YYYYMMDD}_{HHmmSS}.txt 

:サイードさんのコメントに答えて

は、ファイル名は、次の形式になります。

UPDATE 2:

[OK]を、それは他の誰かを助けている場合、私はちょうど良い仕事をしているようだアップ書かれた比較演算子を持って、ここにあります。それはファイル名の他の要素を検索するためにそれを変更するために多くの努力を払うことはありません、ちょうど正規表現を変更する必要があります。皆さんありがとうございます。建設的な批判はいつでも歓迎します。

public class TDRDateTimeComparer : IComparer<FileInfo> 
{ 
    public int Compare(FileInfo x, FileInfo y) 
    { 
     //Return if both strings are null or empty 
     if (string.IsNullOrEmpty(x.Name) && string.IsNullOrEmpty(y.Name)) 
     { 
      return 0; 
     } 
     Regex rDateTime = new Regex(@"(19|20|21)\d\d(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])_([0-1]\d|2[0-3])([0-5]\d)([0-5]\d)"); 

     /* NOTE: File names will already have been validated at this point, so no need to validate the date/time again.*/ 
     string date1 = rDateTime.Match(x.Name).Value, date2 = rDateTime.Match(y.Name).Value; 
     DateTime d1 = DateTime.ParseExact(date1, "yyyyMMdd_HHmmss", null), d2 = DateTime.ParseExact(date2, "yyyyMMdd_HHmmss", null); 

     return d1.CompareTo(d2); 
    } 
} 
+0

あなたのファイル名の形式は何ですか、そしてそれを改善するために何をしましたか? –

答えて

2

私はカスタムコンペラーが行く方法だと思います。正規表現を使用して日付部分を抽出し、DateTimeを作成して比較します。

+0

ここにその例があります - http://en.csharp-online.net/Comparer_class – BeemerGuy

1

OrderBy拡張方法を使用してソートする値を指定することができます。例:私は、ファイル名にエンコード日付&時間でファイルを生成したシステム上で動作するために使用

list = list.OrderBy(f => DateTime.Parse(Path.GetFileName(f.Name))).ToList(); 
+2

OPの発言には* "リストの各ファイルには、その名前の一部として**の日付が含まれています** "*、あなたはそれより少し多くの仕事をしなければならないでしょう::) –

1

。日付形式は、古いDOS 8.2ファイル名形式に適合しています。

ファイルシステムにファイルをリストするときの命名規則のため、それらは当然正しくソートされていました。そのような量のコントロールがあれば、そのようにすることを検討できます。つまり、YYYYMMDDという名前を付けると、デフォルトで日付順にソートされます。

特別なコードは必要ありません。

+0

彼らは名前でどのようにソートされていると思いますか? Typeやその他のものでソートされます。 –

+0

WindowsのAPIディレクトリリスト関数は常に名前でソートされるためです。 – Matt

関連する問題