-1

命名規則のあるフォルダーに複数のファイルがあります

Name_MoreName_DDMMYYYY_SomeNumber_HHMMSS.txt

最も古い日付と時刻 (つまり、最も古い DDMMYYYY と HHMMSS) を持つファイルを取得するにはどうすればよいですか。

元:

  • Name_MoreName_22012012_SomeNumber_072334.txt
  • Name_MoreName_22012012_SomeNumber_072134.txt
  • Name_MoreName_24012012_SomeNumber_072339.txt
  • Name_MoreName_22012012_SomeNumber_072135.txt

したがって、最も古いファイルは

Name_MoreName_22012012_SomeNumber_072134.txt

最も古いファイルのみを取得するにはどうすればよいですか?

編集 これは私がこれまでに行ったことです..forachループで、ファイル名を1つずつ読み取っています

private void FileInformation(string fileName, ref string concatFile)
        {
            try
            {
                string completeFileName = fileName.Trim();
                string[] fileComponenets = completeFileName.Split('_');

                string fileDate = string.Empty;
                string fileTime = string.Empty;


                if (fileComponenets.Length > 0)
                {
                    fileDate = fileComponenets[4].Replace(".txt", "").Trim();
                    fileTime = fileComponenets[2].ToString();
                    concatFile = fileDate + "-" + fileTime;
                }

            }

            catch (Exception ex)
            {
                            }

        }

- 主な機能

string fileStats = string.Empty;
 foreach (string filePath in arrFileCollection)
                {
                    if (filePath.ToLower().Contains("Name_MoreName_")&&
                        filePath.ToLower().Contains(".txt"))
                    {
                                                string concatFile = string.Empty;
                        FileInformation(filePath.Replace(dirPath, ""), ref concatFile);
                        fileStats = fileStats + "," + concatFile;
                    }
}

現在、コンマ区切り値の文字列ですべての日時を取得しています。今、私は立ち往生しています。それらの中で最小のものを取得して関連ファイルを取得するにはどうすればよいですか

EDIT2

注: フレームワークは .NET 2.0 です

4

4 に答える 4

1

これを使って:

更新しました

List<string> address = new List<string>() { "Name_MoreName_22012011_SomeNumber_072334.txt",
            "Name_MoreName_22012012_SomeNumber_072134.txt",
            "Name_MoreName_24012012_SomeNumber_072339.txt",
            "Name_MoreName_22012012_SomeNumber_072135.txt",};
            DateTimeFormatInfo dtfi = new DateTimeFormatInfo();
            dtfi.ShortDatePattern = "dd-MM-yyyy";
            dtfi.DateSeparator = "-";
            address = address.OrderBy(s => Convert.ToDateTime((s.Split('_')[2]).Insert(2, "-").Insert(5, "-"), dtfi)).ToList();
            string oldest = address[0];
于 2012-11-22T14:50:39.673 に答える
1
string oldestFile = Directory.EnumerateFiles(path)
                             .OrderBy(file => ExtractDateTimeFrom(file))
                             .First(); // FirstOrDefault

ファイル名を解析し、そこから日付を抽出するメソッドを記述します。

public static DateTime ExtractDateTimeFrom(string fileName)
{
    Regex regex = new Regex(@".+_(\d\d\d\d\d\d\d\d)_.+_(\d\d\d\d\d\d).txt");
    var match = regex.Match(fileName);
    string dateString = match.Groups[1].Value + match.Groups[2].Value;
    return DateTime.ParseExact(dateString, "ddMMyyyyHHmmsss", null);
}

.NET 2.0最も簡単なソリューション:

string oldestFile = "";
DateTime oldestDate = DateTime.Max;

foreach(string fileName in Directory.GetFiles(path))
{
    DateTime date = ExtractDateTimeFrom(fileName);
    if (date < oldestDate)
    {
        oldestFile = fileName;
        oldestDate = date;
    }
}
于 2012-11-22T14:43:31.593 に答える
1

DirectoryInfo および FileInfo クラスを使用します。たとえば、アイデアを与えるために:

        IOrderedEnumerable<FileInfo> filesInfo =  new DirectoryInfo("D:\\")
                                                      .EnumerateFiles()
                                                      .OrderBy(f=>f.FullName);

更新: .NET 2.0 の場合は、メイン コードから比較ロジックを分離することをお勧めします。そのため、IComparable インターフェイスを実装するカスタム タイプを作成しないでください。

public class CustomFileInfo :IComparable<CustomFileInfo>
{
    public string Name { get; set; }
    public string MoreName { get; set; }
    public DateTime FileDate { get; set; }
    public int Number { get; set; }
    public DateTime FileTime { get; set; }

    public CustomFileInfo(string fileNameString)
    {
        string[] fileNameStringSplited = fileNameString.Split('_');
        this.Name = fileNameStringSplited[0];
        this.MoreName = fileNameStringSplited[1];
        this.FileDate = DateTime.ParseExact(fileNameStringSplited[2], "ddMMyyyy", null);
        this.Number = int.Parse(fileNameStringSplited[3]);
        this.FileTime = DateTime.ParseExact(fileNameStringSplited[4], "HHmmss", null);
    }

    public int CompareTo(CustomFileInfo other)
    {
        // add more comparison criteria here
        if (this.FileDate == other.FileDate) 
            return 0;
        if (this.FileDate > other.FileDate)
            return 1;
        return -1;
    }
}

そして、あなたのコードでは、DirectoryInfo を使用してファイルを取得し、各ファイルを比較することができます...

    FileInfo[] filesInfo = new DirectoryInfo("D:\\").GetFiles();
    //set first file initially as minimum
    CustomFileInfo oldestFileInfo = new CustomFileInfo(filesInfo[0].FullName);

    for (int i = 1; i < filesInfo.Length; i++)
    {
            CustomFileInfo currentFileInfo = new CustomFileInfo(filesInfo[i].FullName);
        //compare each file and keep the oldest file reference in oldestFileInfo
            if (oldestFileInfo.CompareTo(currentFileInfo) < 0)
                oldestFileInfo = currentFileInfo;
    }

使用するコードを最適化し、基準に従って比較コードをカスタマイズできます。

于 2012-11-22T14:47:26.703 に答える
1

このようなものでしょうか?

        string[] filePaths = Directory.GetFiles(@"c:\MyDir\");
        Regex rex          = new Regex(@"^.*_(\d+)\.txt");
        int date           = int.MaxValue;
        int oldestdate     = int.MaxValue;
        String oldestfile;
        foreach(String filePath in filePaths)
        {
            Match match = rex.Match(filePath);

            if(match.Success)
                date = int.Parse(match.Groups[0].Value);
            if (date < oldestdate)
            {
                oldestdate = date;
                oldestfile = filePath;
            }
        }
于 2012-11-22T14:53:01.783 に答える