关于.net:排序Directory.GetFiles()

关于.net:排序Directory.GetFiles()

Sorting Directory.GetFiles()

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


推荐阅读

    linux命令的返回值?

    linux命令的返回值?,系统,工具,位置,管理,暂停,状态,项目,环境,数据,基础,lin

    linux默认命令删除?

    linux默认命令删除?,系统,软件,名称,档案,命令,文件,目录,不了,电脑,文件夹,

    linuxls命令排序?

    linuxls命令排序?,工作,系统,信息,数据,命令,目录,标准,基础,管理,时间,Linux

    linuxrm命令默认?

    linuxrm命令默认?,系统,命令,档案,工作,文件,目录,名称,文件夹,选项,子目录,l

    linux命令默认加后缀?

    linux命令默认加后缀?,系统,文件,密码,通用,设备,命令,目录,后缀,表示,程序,l

    linux排序数字命令?

    linux排序数字命令?,标准,数字,单位,情况,系统,信息,命令,文件,顺序,参数,lin

    linuxll排序命令?

    linuxll排序命令?,系统,信息,地址,标准,工作,命令,时间,数据,文件,目录,Linux

    linux默认浏览器命令?

    linux默认浏览器命令?,环境,系统,发行,工程,工具,浏览器,软件,情况,网站,管

    linux命令按大小排序?

    linux命令按大小排序?,数字,地址,时间,工作,标准,系统,命令,信息,单位,软件,l

    linux计数排序命令?

    linux计数排序命令?,标准,命令,情况,工作,文件,系统,数字,管理,目录,内容,Lin

    linux默认压缩命令?

    linux默认压缩命令?,系统,名称,命令,文件,工具,软件,目录,选项,文件名,格式,l

    linux下排序命令怎么?

    linux下排序命令怎么?,本行,命令,代码,数字,位置,单位,标准,文件,参数,文本,l

    linux默认命令行字体?

    linux默认命令行字体?,系统,工具,等级,数字,百度,情况,代码,终端,字体,字符,l

    linux默认命令行模式?

    linux默认命令行模式?,系统,密码,工具,地方,设计,设备,服务,网络,终端,界面,l

    linux按字符排序命令?

    linux按字符排序命令?,标准,命令,时间,情况,文件,数字,基础,状态,系统,功能,i

    linux命令提示符默认?

    linux命令提示符默认?,系统,标准,信息,基础,代码,软件,美元,电脑,提示符,用

    linux字典排序命令?

    linux字典排序命令?,工作,系统,标准,信息,命令,时间,数字,单位,状态,软件,Lin

    linux增加默认命令?

    linux增加默认命令?,地址,网络,系统,工作,管理,目录,命令,一致,服务,标准,lin

    linux默认安装命令?

    linux默认安装命令?,系统,工作,软件,命令,地址,基础,发行,信息,中心,在线,安

    linux查默认网关命令?

    linux查默认网关命令?,地址,系统,信息,网络,网关,终端,环境,命令,路由,机器,l