在日常開發中,我們經常需要和文件打交道,特別是桌面開發,有時候就會需要載入大批量的文件,而且可能還會存在部分文件缺失的情況,那麼如何才能快速的判斷文件是否存在呢?如果處理不當的,且文件數量比較多的時候,可能會造成卡頓等情況,進而影響程式的使用體驗。今天就以一個簡單的小例子,簡述兩種不同的判斷文件是否... ...
在日常開發中,我們經常需要和文件打交道,特別是桌面開發,有時候就會需要載入大批量的文件,而且可能還會存在部分文件缺失的情況,那麼如何才能快速的判斷文件是否存在呢?如果處理不當,且文件數量比較多的時候,可能會造成卡頓等情況,進而影響程式的使用體驗。今天就以一個簡單的小例子,簡述兩種不同的判斷文件是否存在的方式以及效率比較。
涉及知識點
在本示例中,涉及的知識點如下:
- 單個文件是否存在判斷,通常採用File.Exists(file)來判斷文件是否存在,存在返回true,不存在返回false。
- 獲取目錄下的文件,通常才是Directory.GetFiles(dir)來獲取目錄下的文件,返回目錄下的文件列表。
- 計算程式執行耗時,通常採用Stopwatch進行計算,可以計算程式執行的耗時,單位可以是毫秒,秒,TimeSpan等。
前提
本示例的前提是,通常有多個文件(如:幾十,幾百,幾千,幾萬)需要判斷是否存在,且文件隸屬於多個目錄。
迴圈文件判斷
C#預設提供的文件是否存在判斷方式,一般用於單個文件,如果有多個文件,可以批量迴圈進行判斷。步驟如下:
- 迴圈需要判斷的文件列表
- 每個文件都判斷一次文件是否存在。
代碼如下所示:
/// <summary>
/// 逐一判斷是否存在,並返回判斷時長
/// </summary>
/// <param name="files"></param>
/// <returns></returns>
private static long CheckFileExist01(List<string> files)
{
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
foreach (var file in files)
{
if (File.Exists(file))
{
}
}
stopwatch.Stop();
return stopwatch.ElapsedMilliseconds;
}
上述判斷方式,如果有一百個文件,則會進行一百次的文件是否存在判斷,都是磁碟文件判斷。
統一獲取判斷
統一獲取,即獲取文件夾目錄下的文件,再進行記憶體中判斷文件是否存在。步驟如下:
- 先獲取文件列表所在的文件夾,
- 獲取文件夾中的所有文件,存入字典中,
- 然後通過字典判斷是否包含文件
代碼如下所示:
/// <summary>
/// 統一獲取文件夾目錄中的文件,再進行判斷
/// </summary>
/// <param name="files"></param>
/// <returns></returns>
private static long CheckFileExist02(List<string> files)
{
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
Dictionary<string,string> dictionary = new Dictionary<string, string>();
var folders = files.Select(item=>Path.GetDirectoryName(item)).Distinct().ToList();
foreach (var folder in folders)
{
var tmpFiles=Directory.GetFiles(folder);
foreach(var tmpFile in tmpFiles)
{
dictionary[tmpFile] = tmpFile;
}
}
foreach (var file in files)
{
if (dictionary.TryGetValue(file, out string a))
{
}
}
stopwatch.Stop();
return stopwatch.ElapsedMilliseconds;
}
性能比較
在本示例中,分別從不同維度進行比較,如:本地磁碟文件和共用目錄中的文件,以及不同文件數量進行比較。分別如下:
1. 本地文件
本地文件,分別對10到500個文件進行判斷是否存在,對兩種方式的耗時比較。
其中橫坐標為文件數量,縱坐標為判斷文件是否存在的執行耗時(毫秒)。如下所示:
通過比較發現,對於本地文件,結論如下:
- 對於需要判斷的文件數量較少時,迴圈單個文件和統一獲取再判斷,性能上並無太大差異。
- 隨著需要判斷的文件數量逐漸增多,迴圈單個文件的耗時會增加,而統一獲取再記憶體判斷,則並無太大波動。
- 受操作系統影響,性能耗時可能會存在波動。
2. 共用目錄文件
共用文件,分別對10到500個文件進行判斷是否存在,對兩種方式的耗時比較。
其中橫坐標為文件數量,縱坐標為判斷文件是否存在的執行耗時(毫秒)。如下所示:
通過比較發現,對於共用目錄文件,結論如下:
- 隨著需要判斷的文件數量逐漸增多,迴圈單個文件的耗時會增加,而統一獲取再記憶體判斷,則並無太大波動。
- 受操作系統或網路影響,性能耗時可能會存在波動。
結論
通過對本地文件和共用目錄下文件,以及不同數量的文件進行文件是否存在校驗時的耗時比較分析,結論如下:
如果需要判斷的文件數量比較多,且分散存儲的目錄雖然不唯一,卻相對較少,建議採用第二種(統一獲取)方式進行校驗。
以上就是【推薦一種批量判斷文件是否存在的快速辦法】的全部內容,希望能夠一起學習,共同進步。
作者:老碼識途
出處:http://www.cnblogs.com/hsiang/
本文版權歸作者和博客園共有,寫文不易,支持原創,歡迎轉載【點贊】,轉載請保留此段聲明,且在文章頁面明顯位置給出原文連接,謝謝。
關註個人公眾號,定時同步更新技術及職場文章