System.IO.Directory.GetFiles()返回string[]。 返回值的默认排序顺序是什么? 我是按名称假设,但是如果是这样的话,当前的文化会对它产生多大影响? 您可以将其更改为创建日期吗?
更新:MSDN指出,不能保证.Net 3.5的排序顺序,但是该页面的2.0版本完全没有说明任何内容,而且两个页面都无法帮助您按创建或修改时间进行排序。 一旦拥有数组(仅包含字符串),该信息就会丢失。 我可以构建一个比较器,以检查它获取的每个文件,但这意味着在假定.GetFiles()方法已经执行此操作时,将重复访问文件系统。 似乎效率很低。
如果您对文件的属性(例如CreationTime)感兴趣,那么使用System.IO.DirectoryInfo.GetFileSystemInfos()会更有意义。
然后,您可以使用System.Linq中的一种扩展方法对它们进行排序,例如:
1 2 3
| DirectoryInfo di = new DirectoryInfo("C:\");
FileSystemInfo[] files = di.GetFileSystemInfos();
var orderedFiles = files.OrderBy(f => f.CreationTime); |
编辑-抱歉,我没有注意到.NET2.0标签,因此请忽略LINQ排序。虽然仍然保留使用System.IO.DirectoryInfo.GetFileSystemInfos()的建议。
在.NET 2.0中,您需要使用Array.Sort对FileSystemInfos进行排序。
另外,您可以使用Comparer委托来避免只为比较而声明一个类:
1 2 3 4 5 6 7 8
| 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);
}); |
这是我使用的VB.Net解决方案。
首先创建一个班级来比较日期:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| 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 |
然后在对数组进行排序时使用比较器:
1 2 3 4
| 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) |
1 2 3
| Dim Files() As String
Files = System.IO.Directory.GetFiles("C:")
Array.Sort(Files) |
来自msdn:
The order of the returned file names is not guaranteed; use the Sort() method if a specific sort order is required.
Sort()方法是标准的Array.Sort(),它接受IComparables(以及其他重载),因此,如果按创建日期排序,它将根据计算机设置处理本地化。
更加简洁的VB.Net版本...非常好。谢谢。
要以相反的顺序遍历列表,请添加reverse方法...
1 2 3
| For Each fi As IO.FileInfo In filePaths.reverse
' Do whatever you wish here
Next |
您可以实现自定义iComparer进行排序。读取文件的文件信息并根据需要进行比较。
1 2
| IComparer comparer = new YourCustomComparer();
Array.Sort(System.IO.Directory.GetFiles(), comparer); |
msdn info IComparer接口
您是正确的,默认值为我的名字asc。我发现改变排序顺序的唯一方法是从FileInfo集合创建数据表。
然后,您可以使用数据表中的DefaultView并使用.Sort方法对目录进行排序。
这涉及很多并且相当缓慢,但是我希望有人能够发布更好的解决方案。
如果要按创建日期等进行排序,则可能需要使用DirectoryInfo.GetFiles,然后使用合适的谓词对结果数组进行排序。
您可以编写一个自定义IComparer接口以按创建日期排序,然后将其传递给Array.Sort。您可能还想看一下StrCmpLogical,这是资源管理器用于排序的内容(用文本正确地对数字进行排序)。
MSDN文档指出,不能保证返回值的任何顺序。您必须使用Sort()方法。
如果有人有兴趣,可以使用更简洁的VB.Net版本
1 2 3 4 5 6
| 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 |
只是一个主意。我想找到一个简单的出路,然后尝试重新使用已经可用的资源。如果要对文件进行排序,我将只创建一个进程并将syscal设置为" DIR [x: Folders SubFolders *。*] / s / b / on"并捕获输出。
使用系统的DIR命令,您可以按以下方式排序:
1 2 3 4 5 6
| /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来获得。而且速度很快。我只是个懒惰的人;)
经过一番谷歌搜索后,我发现切换到按特定日期/时间排序:-
1 2 3 4 5 6
| /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 |