在 Windows 中是否有一种方法可以获取目录中的文件数量(非递归就足够了),而没有通过枚举它们的潜在重大开销FindFirst/NextFile
?
目的是估计需要处理多少文件。
目录结构已知且不深,文件夹通常不包含未知文件。
由于数据不是继续运行所必需的,而且该文件夹实际上始终位于本地驱动器上,因此可以接受特定于 NTFS 的命令(前提是不需要提升)。
有任何想法吗?
在 Windows 中是否有一种方法可以获取目录中的文件数量(非递归就足够了),而没有通过枚举它们的潜在重大开销FindFirst/NextFile
?
目的是估计需要处理多少文件。
目录结构已知且不深,文件夹通常不包含未知文件。
由于数据不是继续运行所必需的,而且该文件夹实际上始终位于本地驱动器上,因此可以接受特定于 NTFS 的命令(前提是不需要提升)。
有任何想法吗?
跟踪目录中的文件数量是一种开销,对文件系统没有任何好处,因此它们都没有这样做。
对于大多数用途,本地驱动器上的文件计数应该足够快。当然,处理文件所需时间的一小部分。
假设 Indexing 服务正在运行并且目录被索引,我们可以查询目录并计算给定目录上的文件。
我不知道查询目录是否更快,这是我脑海中唯一的想法。
问候。
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