2010-05-04 44 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。