FindFirst/NextFile
Windows でディレクトリ内のファイルの数を取得する方法はありますか(非再帰的に十分です) 。
目的は、処理する必要があるファイルの数を見積もることです。
ディレクトリ構造は既知で深くはありません。通常、フォルダーには不明なファイルは含まれません。
続行するためにデータは必須ではなく、フォルダーは事実上常にローカル ドライブ上にあるため、NTFS 固有のコマンドを使用できます (昇格が必要ない場合)。
何か案は?
FindFirst/NextFile
Windows でディレクトリ内のファイルの数を取得する方法はありますか(非再帰的に十分です) 。
目的は、処理する必要があるファイルの数を見積もることです。
ディレクトリ構造は既知で深くはありません。通常、フォルダーには不明なファイルは含まれません。
続行するためにデータは必須ではなく、フォルダーは事実上常にローカル ドライブ上にあるため、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