按日期排序文件

我使用这样的代码比较文件按日期排序..

FileInfo f = new FileInfo(name1); FileInfo f1 = new FileInfo(name2); if (f.Exists && f1.Exists) output = DateTime.Compare(f.LastWriteTime, f1.LastWriteTime); 

是否有更好更快的方式按日期排序?

在这个时候我只能比较2个项目……

我无法从目录中获取所有文件。

您可以使用LINQ:

 var sortedFiles = new DirectoryInfo(@"D:\samples").GetFiles() .OrderBy(f => f.LastWriteTime) .ToList(); 
  DirectoryInfo directoryInfo = new DirectoryInfo(@"D:\Temp"); var result = directoryInfo.GetFiles("*.*",SearchOption.AllDirectories).OrderBy(t => t.LastWriteTime).ToList(); 

那么使用Array.Sort呢?

 string[] fileNames = Directory.GetFiles("directory ", "*.*"); DateTime[] creationTimes = new DateTime[fileNames.Length]; for (int i = 0; i < fileNames.Length; i++) creationTimes[i] = new FileInfo(fileNames[i]).CreationTime; Array.Sort(creationTimes, fileNames); 

这是为整个目录执行此操作的另一种方法:dateCompareFileInfo

 if (Directory.Exists(DIRECTORY_NAME)) { DirectoryInfo di = new DirectoryInfo(DIRECTORY_NAME); FileInfo[] logFiles = di.GetFiles("AN-10-log.txt*"); DateCompareFileInfo dateCompareFileInfo = new DateCompareFileInfo(); Array.Sort(logFiles, dateCompareFileInfo); } 

你需要一个新的DateCompareFileInfo类来实现IComparer:

 class DateCompareFileInfo : IComparer { ///  /// Compare the last dates of the File infos ///  /// First FileInfo to check /// Second FileInfo to check ///  public int Compare(FileInfo fi1, FileInfo fi2) { int result; if (fi1.LastWriteTime == fi2.LastWriteTime) { result = 0; } else if (fi1.LastWriteTime < fi2.LastWriteTime) { result = 1; } else { result = -1; } return result; } } 

重要信息 – 当通过LastWriteTime进行排序时,应该注意的是,如果文件从未被修改过,则此日期可能会返回1601或1600.以下是MSDN所说的内容:

如果path参数中描述的文件不存在,则此方法返回到公元1601年1月1日午夜12点(CE)协调世界时(UTC),调整为当地时间。

如果您的时区是PST,像我一样,日期实际上是12/31/1600。 为了解决这个问题并编写更强大的代码,您可以考虑这样的事情:

 .OrderByDescending(f => f.LastWriteTime.Year <= 1601 ? f.CreationTime : f.LastWriteTime) 

这将通过SSIS对象将结果转换为可读类:

 var directory = Dts.Variables["User::SourceDir"].Value.ToString(); DirectoryInfo directoryInfo = new DirectoryInfo(directory); var result = directoryInfo.GetFiles("*.xml", SearchOption.AllDirectories).OrderBy(t => t.LastWriteTime).ToList(); DataTable dsSorted = new DataTable(); DataColumn dc = new DataColumn("Value"); dsSorted.Columns.Add(dc); foreach (FileInfo item in result) { DataRow dr = dsSorted.NewRow(); dr[0] = directory + item ; dsSorted.Rows.Add(dr); } // lastModified = file.LastWriteTime; Dts.Variables["User::FileNamesSorted"].Value = dsSorted; // MessageBox.Show(Dts.Variables["User::FileNamesSorted"].Value.ToString()); Dts.TaskResult = (int)ScriptResults.Success; 

这是我从MSDN Social找到的解决方案。

 DirectoryInfo di = new DirectoryInfo(@"c:\my-directory"); FileInfo[] files = di.GetFiles(@"*.*"); Array.Sort(files, (x, y) => Comparer.Default.Compare(x.LastWriteTime, y.LastWriteTime)