System.IO.Directory.GetFiles()返回一个string[]。返回值的默认排序顺序是什么?我是在说名字,但如果是的话,目前的文化对它的影响有多大?你能把它改为类似于创作日期的东西吗?
更新: MSDN指出,.Net 3.5不能保证排序顺序,但是该页面的2.0版本根本没有说任何话,任何页面都不会帮助您按创建或修改时间进行排序。一旦有了数组(它只包含字符串),信息就会丢失。我可以构建一个比较器来检查它所获得的每个文件,但这意味着在假定.GetFiles()方法已经这样做时重复访问文件系统。看起来效率很低。
发布于 2008-09-09 20:47:03
如果您对CreationTime等文件的属性感兴趣,那么使用System.IO.DirectoryInfo.GetFileSystemInfos()就更有意义了。然后,您可以使用System.Linq中的一种扩展方法对它们进行排序,例如:
DirectoryInfo di = new DirectoryInfo("C:\\");
FileSystemInfo[] files = di.GetFileSystemInfos();
var orderedFiles = files.OrderBy(f => f.CreationTime);编辑-对不起,我没有注意到.NET2.0标签,所以忽略LINQ排序。不过,使用System.IO.DirectoryInfo.GetFileSystemInfos()的建议仍然有效。
发布于 2008-11-10 20:57:43
在.NET 2.0中,需要使用Array.Sort对FileSystemInfos进行排序。
此外,您还可以使用比较器委托来避免仅为比较而声明类:
DirectoryInfo dir = new DirectoryInfo(path);
FileSystemInfo[] files = dir.GetFileSystemInfos();
// sort them by creation time
Array.Sort<FileSystemInfo>(files, delegate(FileSystemInfo a, FileSystemInfo b)
{
return a.LastWriteTime.CompareTo(b.LastWriteTime);
});发布于 2008-09-29 15:12:40
下面是我使用过的VB.Net解决方案。
首先,做一个类来比较日期:
Private Class DateComparer
Implements System.Collections.IComparer
Public Function Compare(ByVal info1 As Object, ByVal info2 As Object) As Integer Implements System.Collections.IComparer.Compare
Dim FileInfo1 As System.IO.FileInfo = DirectCast(info1, System.IO.FileInfo)
Dim FileInfo2 As System.IO.FileInfo = DirectCast(info2, System.IO.FileInfo)
Dim Date1 As DateTime = FileInfo1.CreationTime
Dim Date2 As DateTime = FileInfo2.CreationTime
If Date1 > Date2 Then Return 1
If Date1 < Date2 Then Return -1
Return 0
End Function
End Class然后在排序数组时使用比较器:
Dim DirectoryInfo As New System.IO.DirectoryInfo("C:\")
Dim Files() As System.IO.FileInfo = DirectoryInfo.GetFiles()
Dim comparer As IComparer = New DateComparer()
Array.Sort(Files, comparer)https://stackoverflow.com/questions/52842
复制相似问题