1

FindFirst/NextFileWindows でディレクトリ内のファイルの数を取得する方法はありますか(非再帰的に十分です) 。

目的は、処理する必要があるファイルの数を見積もることです。
ディレクトリ構造は既知で深くはありません。通常、フォルダーには不明なファイルは含まれません。

続行するためにデータは必須ではなく、フォルダーは事実上常にローカル ドライブ上にあるため、NTFS 固有のコマンドを使用できます (昇格が必要ない場合)。

何か案は?

4

2 に答える 2

2

ディレクトリ内のファイル数を追跡することはオーバーヘッドであり、ファイル システムに何のメリットももたらさないため、それを行うものはありません。

ローカル ドライブ上のファイルのカウントは、ほとんどの目的で十分に高速です。ファイルの処理に必要な時間のごく一部が必要になることは確かです。

于 2012-09-03T14:07:55.210 に答える
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

詳細: Microsoft Indexing Service と ASP.NET を使用して Web サイトを検索する

于 2012-09-03T14:07:29.073 に答える