2012-09-03 31 views
1

在Windows中有没有一种方法可以获取目录中的文件数量(非递归是足够好的),而无需通过枚举全部枚举FindFirst/NextFileWindows/NTFS:目录中的文件数量,不包括它们

目的是估计需要处理多少个文件。
目录结构已知且不深,文件夹通常不包含未知文件。

由于数据不是必不可少的,并且该文件夹实际上始终位于本地驱动器上,所以可以接受NTFS特定的命令(前提是不需要提升)。

任何想法?

回答

2

文件目录中的数量保持跟踪是一个开销不用于文件系统带来任何好处,所以他们都没有。

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

+0

有道理。信息会很好地校准进度条,但这不是一个杀手 – peterchen

1

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

我不知道查询目录是否更快,其唯一的想法出现在我的脑海。

问候。在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 

示例代码更多信息:Searching your web site with the Microsoft Indexing Service and ASP.NET

相关问题