ディレクトリにzipファイルがあります。ファイル名に最大日時のファイルを取得するにはどうすればよいですか?
私のファイル形式:
Files_2013.06.04_15-42-55.zip Files_2013.06.03_15-42-55.zip ...
ファイルがソート可能な形式を使用しているように見える場合、名前を辞書式の降順でソートし、最初のエントリを取得できます。(もちろん、昇順で並べ替えて、最後のエントリを取得します。)
もちろん、あなたが与えた例が本当に代表的であると仮定しています. たとえば、異なる接頭辞が混在している場合は、おそらく各ファイル名から日付部分を解析する必要があります。LINQ を使用すると、これを合理的に単純化できます。
var latestFile = files.OrderByDescending(ParseFileDateTime)
.FirstOrDefault();
...
public static DateTime ParseFileDateTime(string name)
{
int dateTimeStartIndex = name.Length - 19;
if (dateTimeStartIndex < 0)
{
throw new ArgumentException("No date/time in filename: " + name);
}
string text = name.Substring(dateTimeStartIndex);
return DateTime.ParseExact(text,
"yyyy'.'MM'.'dd'_'HH'-'mm'-'ss",
CultureInfo.InvariantCulture);
}
FirstOrDefault
files
が空のシーケンスの場合は null を返します。
日付/時刻の形式が固定長であるため、最後の 19 文字しか取得できないことに注意してください。月の名前 (または類似のもの) を使用するように変更したことがある場合は、ファイル名のどの部分が日付/時刻であるかを調べる別の方法を考え出す必要があります。
これを行う方法は次のとおりです。
//var files = Directory.EnumerateFiles("path/to/dir");
var files = {"Files_2013.06.04_15-42-55.zip", "Files_2013.06.03_15-42-55.zip"};
var date = files.Max(f =>
DateTime.ParseExact(f, "'Files_'yyyy'.'MM'.'dd'_'HH'-'mm'-'ss'.zip'",
CultureInfo.InvariantCulture));
Console.WriteLine(date);
文字列を分割し、日付と時刻をまとめてdatetimeに変換し、linqを見て最大のdatetimeを見つけてください。
編集:たとえば、すべてのファイル名を配列にロードすることを忘れないでください。構築された日時で同じことを行うと、linq によって返される最大日時と同じインデックスで適切なファイル名が見つかります。
次のフローに進むことができます。
すべてのファイルで日付形式が同じで、2013.06.04 で06が月の数字である場合、DateTime.Parse または ParseExact を避けることができます。
注: これらのメソッドは、ファイル名の日付がパターン yyyy.MM.dd_HH-mm-ss に従う場合にのみ適用されます。
すべてのファイル名が常に同じパターンに従う場合(あなたの場合は「File_yyyy.MM.dd_HH-mm-ss.zip」)、max要素を使用できます
var files = Directory.GetFiles(path);
var fileWithMaxDate = files.Any() ? files.Max(f=>f) : (string)null;
日付部分のみがパターン yyyy.MM.dd_HH-mm-ss に従う場合:
private const string DatePattern = "yyyy.MM.dd_HH-mm-ss";
private static readonly int DatePatternLen = DatePattern.Length;
var files = Directory.GetFiles(path);
var fileWithMaxDate = files
.Where
(f => Path.GetFileNameWithoutExtension(f).Length >= DatePatternLen)
.OrderByDescending
(f => Path.GetFileNameWithoutExtension(f)
.Substring(f.Length - DatePatternLen))
.FirstOrDefault();
それ以外の場合は、正しい順序で日付部分を DateTime にキャストする必要があります