私は VB.NET webforms サイトを作成しています。その 1 ページでファイルのリストをリストボックスにロードする必要があります。データベースにエントリがないディレクトリ内のすべての PDF および TIF ファイルをロードする必要があります。現在、次のコードを使用してこれを正常に実行しています。基本的に、データベースにクエリを実行してファイル名エントリの配列リストを取得し、ディレクトリ内の各ファイルを調べて、その名前を配列リストの各エントリと照合し、その名前が配列リストにない場合は、リストに追加してバインドしますリストボックス:
Dim category As String = "RFQ"
'Initialize database connection variables
Dim sql As String
Dim query As System.Data.SqlClient.SqlCommand
Dim result As System.Data.SqlClient.SqlDataReader
'Load document list from database
Dim savedfiles As New ArrayList
database.Open() 'Open connection to database
sql = "SELECT filename FROM fileheaders WHERE [category] = '" & category & "'" 'SQL query to read file header information
query = New System.Data.SqlClient.SqlCommand(sql, database) 'Create query to send to database
result = query.ExecuteReader() 'Execute query
While result.Read()
savedfiles.Add(row(result, "filename"))
End While
result.Close()
dbDocscan.Close()
'The following code section pulls all files from the current file directory.
Dim filelist = New ArrayList
Dim dir As New System.IO.DirectoryInfo(dirName) 'Get directory information
Dim files As System.IO.FileInfo() = dir.GetFiles() 'Get all files in directory
Dim file As System.IO.FileInfo
Dim i As Integer = 0
For Each file In files
If ((file.Extension Like ".pdf") Or (file.Extension Like ".tif")) And Not inArray(savedfiles, file.Name) Then
filelist.Add(file.Name) 'Add .pdf and .tif files to list of documents
End If
Next
filelist.TrimToSize()
eltFilelist.DataSource = filelist
eltFilelist.DataBind() 'Bind document list to listbox
次に、inArray 関数コード:
Function inArray(arr As ArrayList, str As String) As Boolean
For Each item In arr
If TypeOf (item) Is String Then
If str = item Then
Return True
Exit Function
End If
End If
Next
Return False
End Function
ここに問題があります。機能している一方で、非常に効率が悪いようです。ディレクトリには約 27,000 個のファイルがあり、データベースには約 26,000 個のファイル エントリがあります。したがって、26,000 の名前のリストに対して 27,000 のファイル名のそれぞれをチェックしています。これを組み合わせの問題にしないと、何億もの文字列一致ステートメントになります。これについてもっと効率的な方法はありますか?