我在22個文件夾中有660000個xml文件(具有唯一文件名)。每個文件夾都有30000個文件。我需要在C#應用程序中有效地找到它們的名稱。我知道Windows中有一個SearchIndexer服務(?Vista +?),我只是想知道我是否可以使用它,或者我必須自己編制索引文件?索引文件和最快捷的方式來找到文件夾中的文件?
另外,我想我可以創建一個數據庫,文件名是主鍵和另一列中的路徑。但是,我應該創建一個有660000行的表或者每個有30000行的22個表?爲什麼?
在此先感謝。
我在22個文件夾中有660000個xml文件(具有唯一文件名)。每個文件夾都有30000個文件。我需要在C#應用程序中有效地找到它們的名稱。我知道Windows中有一個SearchIndexer服務(?Vista +?),我只是想知道我是否可以使用它,或者我必須自己編制索引文件?索引文件和最快捷的方式來找到文件夾中的文件?
另外,我想我可以創建一個數據庫,文件名是主鍵和另一列中的路徑。但是,我應該創建一個有660000行的表或者每個有30000行的22個表?爲什麼?
在此先感謝。
我的經驗可能會過時(NTFS),但是您應該檢查在30,000個文件的目錄中打開文件的速度有多快。我想你可能會發現將文件分發到更多的目錄會更好。
如果你有過的目錄佈局控制,考慮散列文件名的數字0和660000.之間然後,您可以使用文件系統作爲索引:
00/
00/
<99 files that hash here>
..
65
您仍然需要寫一個簡單的「索引器」讀取每個文件,計算它的散列並將其存儲在正確的位置。然後,您查找一個文件:
Lookup(string filename)
{
int hash = filename.GetHashCode() % 660000;
string directory = HashToDirectory(hash);
string path = Path.Combine(directory, filename);
...
有一件事是很好的這個做法是,你可以分析各種「密度」的文件目錄中的數量。您只需更改HashToPath
函數。你也不需要數據庫。
我們使用了一個類似的方法與一個網絡爬蟲,它存儲了一個很多文件。它反對NTFS,所以YMMV。
Querying the Index Programmatically:
- Using SQL and AQS Approaches to Query the Index
- 查詢索引與ISearchQueryHelper
- 與搜索毫秒協議
- 與Windows搜索SQL語法
- 使用查詢索引查詢索引高級查詢語法編程