2010-05-04 45 views
0

我有一些文件具有相同的名稱,但具有不同的日期。 基本上我們發現與最近的日期如何獲取C#中的最新文件

文件模式是

<FileNames><YYYYMMDD><FileExtension> 

e.g. test_20100506.xls indicates 

<FileNames> = test_ 
<YYYYMMDD> = 20100506 
<FileExtension> = .xls 

現在在源文件夾,該文件是

standardization_20100503.xls, standardization_20100504.xls, 文件standardization_20100305.xls, replacement_20100505.xls

可以看出,standardization_.xls是3號,但 replacement_.xls只有1

輸出將其內容將

standardization_20100504.xls和replacement_20100505文件名列表。 xls

因爲其中所有的standardization_.xls都是最近的一個,而replacement_.xls也是一樣的。

我用我自己的邏輯嘗試過,但不知何故失敗。

我的想法是在

private static void GetLatestFiles(ref List<FileInfo> validFiles) 
     { 
      List<FileInfo> validFilesTemp = new List<FileInfo>(); 
      for (int i = 0; i < validFiles.Count; i++) 
      { 
       for (int j = i+1; j < validFiles.Count; j++) 
       { 
        string getFileTextX = ExtractText(validFiles[i].Name); 
        string getFileTextY = ExtractText(validFiles[j].Name); 
        if (getFileTextX == getFileTextY) 
        { 
         int getFileDatesX = Convert.ToInt32(ExtractNumbers(validFiles[i].Name)); 
         int getFileDatesY = Convert.ToInt32(ExtractNumbers(validFiles[j].Name)); 

         if (getFileDatesX > getFileDatesY) 
         { 
          validFilesTemp.Add(validFiles[i]); 
         } 
         else 
         { 
          validFilesTemp.Add(validFiles[j]); 
         } 
        } 
       } 
      } 

      validFiles.Clear(); 
      validFiles = validFilesTemp; 
     } 

的ExtractNumbers是:

public static string ExtractNumbers(string expr) 
     { 
      return string.Join(null, System.Text.RegularExpressions.Regex.Split(expr, "[^\\d]")); 
     } 

和ExtractText是

public static string ExtractText(string expr) 
     { 
      return string.Join(null, System.Text.RegularExpressions.Regex.Split(expr, "[\\d]")); 
     } 

我使用C#3.0和框架3.5

需要幫助。這是非常迫切的

謝謝。

回答

0
class Program 
{ 
    static void Main() 
    { 
     var files = 
      from file in Directory.GetFiles(@"c:\somedirectory") 
      let name = Path.GetFileNameWithoutExtension(file) 
      let tokens = name.Split('_') 
      where tokens.Length > 1 
      let date = DateTime.ParseExact(tokens[1], "yyyyMMdd", CultureInfo.InvariantCulture) 
      orderby date descending 
      select file; 

     foreach (var item in files) 
     { 
      Console.WriteLine(item); 
     } 
    } 
} 
+0

拋出異常{「字符串未被識別爲有效的DateTime。」} – Newbie 2010-05-04 07:56:26

1

使用此正則表達式從完整文件名中獲取日期。

@"_([0-9]*)\." 

,如果你想爲

DateTime dt; 
dt = new DateTime(); 
dt = DateTime.ParseExact(MyString, "yyyyMMdd",null); 

使用dt.CompareTo(dt1).Equals(1)進行比較,如果日期是較早或較晚它然後將其轉換爲DateTime。

相關問題