System.IO.Directory.GetFiles()
返回string[]
。返回值的默认排序顺序是什么?我是按名字假设,但如果是这样的话,目前的文化对它有多大影响呢?你能把它改成创建日期吗?
更新:MSDN指出.Net 3.5不保证排序顺序,但2.0版本的页面根本没有说什么,这两个页面都不会帮助您按事情排序喜欢创造或修改时间。一旦你有了数组(它只包含字符串),这些信息就会丢失。我可以构建一个比较器来检查它获得的每个文件,但这意味着重复访问文件系统,大概是.GetFiles()方法已经这样做了。似乎非常低效。
答案 0 :(得分:108)
如果您对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()的建议仍然存在。
答案 1 :(得分:12)
这是我用过的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)
答案 2 :(得分:12)
在.NET 2.0中,您需要使用Array.Sort对FileSystemInfos进行排序。
此外,您可以使用Comparer委托来避免仅为比较声明一个类:
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);
});
答案 3 :(得分:7)
Dim Files() As String
Files = System.IO.Directory.GetFiles("C:\")
Array.Sort(Files)
答案 4 :(得分:6)
来自msdn:
无法保证返回文件名的顺序;如果需要特定的排序顺序,请使用Sort()方法。
Sort()方法是标准的Array.Sort(),它接收IComparables(以及其他重载),因此如果按创建日期排序,它将根据计算机设置处理本地化。
答案 5 :(得分:3)
你是对的,默认是我的名字asc。我找到的唯一方法是更改排序顺序,以便从FileInfo集合中创建数据表。
然后,您可以使用数据表中的DefaultView,并使用.Sort方法对目录进行排序。
这涉及到相当缓慢但我希望有人会发布更好的解决方案。
答案 6 :(得分:3)
您可以实现自定义iComparer进行排序。阅读文件的文件信息并根据需要进行比较。
IComparer comparer = new YourCustomComparer();
Array.Sort(System.IO.Directory.GetFiles(), comparer);
答案 7 :(得分:3)
更简洁的VB.Net版本......非常好。谢谢。 要以相反的顺序遍历列表,请添加反向方法...
For Each fi As IO.FileInfo In filePaths.reverse
' Do whatever you wish here
Next
答案 8 :(得分:2)
MSDN Documentation表示无法保证返回值的任何顺序。您必须使用Sort()方法。
答案 9 :(得分:2)
您可以编写自定义IComparer接口以按创建日期排序,然后将其传递给Array.Sort。您可能还想查看StrCmpLogical,它是用于排序资源管理器使用的(使用文本正确排序数字)。
答案 10 :(得分:2)
如果要按创建日期之类的方式排序,则可能需要使用DirectoryInfo.GetFiles,然后使用合适的谓词对结果数组进行排序。
答案 11 :(得分:1)
只是一个想法。我想找到一个简单的方法,并尝试重新使用已有的资源。如果我要对文件进行排序,我只需创建一个进程并将syscal设置为“DIR [x:\ Folders \ SubFolders *。*] / s / b / on”并捕获输出。
使用系统的DIR命令,您可以按以下方式排序:
/O List by files in sorted order.
sortorder N By name (alphabetic) S By size (smallest first)
E By extension (alphabetic) D By date/time (oldest first)
G Group directories first - Prefix to reverse order
The /S switch includes sub folders
我不确定如果D =按日期/时间正在使用LastModifiedDate或FileCreateDate。但是如果所需的排序顺序已经内置在DIR命令中,我将通过调用syscall来实现。它很快。我只是懒惰的人;)
经过一番谷歌搜索后,我发现切换按特定日期/时间排序: -
/t [[:]TimeField] : Specifies which time field to display or use for sorting. The following list describes each of the values you can use for TimeField.
Value Description
c : Creation
a : Last access
w : Last written
答案 12 :(得分:1)
一个更简洁的VB.Net版本,如果有人感兴趣的话
Dim filePaths As Linq.IOrderedEnumerable(Of IO.FileInfo) = _
New DirectoryInfo("c:\temp").GetFiles() _
.OrderBy(Function(f As FileInfo) f.CreationTime)
For Each fi As IO.FileInfo In filePaths
' Do whatever you wish here
Next