Windows/NTFS:目录中的文件数,不枚举

Windows/NTFS:目录中的文件数,不枚举,windows,filesystems,Windows,Filesystems,在Windows中,是否有一种方法可以获取目录中的文件数(非递归方式就足够了),而不必通过FindFirst/NextFile枚举所有文件,这可能会带来很大的开销 目的是估计需要处理的文件数量。 目录结构是已知的,不深入,文件夹通常不包含未知文件 由于数据不是继续的必要条件,而且文件夹实际上始终位于本地驱动器上,因此可以接受NTFS特定命令(前提是不需要提升) 有什么想法吗?假设索引服务正在运行并且目录已被索引,我们可以查询目录并统计给定目录上的文件 我不知道查询目录是否更快,这是我唯一想到的

在Windows中,是否有一种方法可以获取目录中的文件数(非递归方式就足够了),而不必通过
FindFirst/NextFile
枚举所有文件,这可能会带来很大的开销

目的是估计需要处理的文件数量。
目录结构是已知的,不深入,文件夹通常不包含未知文件

由于数据不是继续的必要条件,而且文件夹实际上始终位于本地驱动器上,因此可以接受NTFS特定命令(前提是不需要提升)


有什么想法吗?

假设索引服务正在运行并且目录已被索引,我们可以查询目录并统计给定目录上的文件

我不知道查询目录是否更快,这是我唯一想到的

问候

VB.NET中的示例代码

Sub Main()

    Try
        ' Catalog Name
        Dim strCatalog As String = "System"

        Dim strQuery As String
        strQuery = "Select DocPageCount,DocTitle,Filename,Size,PATH,URL from SCOPE('shallow traversal of ""C:\Windows""')"

        Dim connString As String = "Provider=MSIDXS.1;Integrated Security .='';Data Source='" & strCatalog & "'"

        Dim cn As New System.Data.OleDb.OleDbConnection(connString)
        cn.Open()

        Dim cmd As New System.Data.OleDb.OleDbCommand(strQuery, cn)
        Dim rdr As System.Data.OleDb.OleDbDataReader = cmd.ExecuteReader()

        Dim files As Integer = 0

        While rdr.Read()
            files += 1
            Console.WriteLine("Path: {0} Filename: {1} Size : {2}", rdr("PATH"), rdr("Filename"), rdr("Size"))
        End While

        rdr.Close()
        rdr = Nothing
        cmd.Dispose()
        cmd = Nothing

        cn.Close()

        Console.WriteLine("Total Files: {0}", files)

    Catch ex As Exception
        Console.WriteLine(ex)
    End Try
End Sub

更多信息:

跟踪目录中的文件数量是一种开销,对文件系统没有任何好处,因此它们都不能做到这一点


在大多数情况下,计算本地驱动器上的文件应该足够快。处理文件所需的时间肯定会减少一小部分。

很有意义。Informaiton可以很好地校准进度条,但这不是一个杀手