在日常開(kāi)發(fā)中,我們經(jīng)常需要和文件打交道,特別是桌面開(kāi)發(fā),有時(shí)候會(huì)需要加載大批量的文件,而且可能還會(huì)存在部分文件缺失的情況,那么如何才能快速判斷文件是否存在呢?如果處理不當(dāng),且文件數(shù)量比較多的時(shí)候,可能會(huì)造成卡頓等情況,進(jìn)而影響程序的使用體驗(yàn)。今天就以一個(gè)簡(jiǎn)單的小例子,簡(jiǎn)述兩種不同的判斷文件是否存在的方式以及效率比較。
涉及知識(shí)點(diǎn)
在本示例中,涉及的知識(shí)點(diǎn)如下:- 單個(gè)文件是否存在判斷,通常采用File.Exists(file)來(lái)判斷文件是否存在,存在返回true,不存在返回false。
- 獲取目錄下的文件,通常采用Directory.GetFiles(dir)來(lái)獲取目錄下的文件,返回目錄下的文件列表。
- 計(jì)算程序執(zhí)行耗時(shí),通常采用Stopwatch進(jìn)行計(jì)算,單位可以是毫秒,秒,TimeSpan等。
前提
本示例的前提是,通常有多個(gè)文件(如:幾十,幾百,幾千,幾萬(wàn))需要判斷是否存在,且文件隸屬于多個(gè)目錄。循環(huán)文件判斷
C#默認(rèn)提供的文件存在判斷方式,一般用于單個(gè)文件。如果有多個(gè)文件,可以批量循環(huán)進(jìn)行判斷。步驟如下:
/// <summary>
/// 逐一判斷是否存在,并返回判斷時(shí)長(zhǎng)
/// </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;
}
上述判斷方式,如果有一百個(gè)文件,則會(huì)進(jìn)行一百次的文件是否存在判斷,都是磁盤(pán)文件判斷。
統(tǒng)一獲取判斷
統(tǒng)一獲取,即獲取文件夾目錄下的文件,在內(nèi)存中判斷文件是否存在。步驟如下:
先獲取文件列表所在的文件夾,
獲取文件夾中的所有文件,存入字典中,
然后通過(guò)字典判斷是否包含文件
代碼如下所示:
/// <summary>
/// 統(tǒng)一獲取文件夾目錄中的文件,再進(jìn)行判斷
/// </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;
}
性能比較
在本示例中,分別從不同維度進(jìn)行比較,如:本地文件和共享目錄文件,以及不同文件數(shù)量進(jìn)行比較。分別如下:本地文件,分別對(duì)10到500個(gè)文件進(jìn)行判斷是否存在,對(duì)兩種方式的耗時(shí)比較。
其中橫坐標(biāo)為文件數(shù)量,縱坐標(biāo)為判斷文件是否存在的執(zhí)行耗時(shí)(毫秒)。如下所示:通過(guò)比較發(fā)現(xiàn),對(duì)于本地文件,結(jié)論如下:- 對(duì)于需要判斷的文件數(shù)量較少時(shí),循環(huán)單個(gè)文件和統(tǒng)一獲取再判斷,性能上并無(wú)太大差異。
- 隨著需要判斷的文件數(shù)量逐漸增多,循環(huán)單個(gè)文件的耗時(shí)會(huì)增加,而統(tǒng)一獲取在內(nèi)存判斷,則并無(wú)太大波動(dòng)。
- 受操作系統(tǒng)影響,性能耗時(shí)可能會(huì)存在波動(dòng)。
2. 共享目錄文件
共享文件,分別對(duì)10到500個(gè)文件進(jìn)行判斷是否存在,對(duì)兩種方式的耗時(shí)比較。
其中橫坐標(biāo)為文件數(shù)量,縱坐標(biāo)為判斷文件是否存在的執(zhí)行耗時(shí)(毫秒)。如下所示:通過(guò)比較發(fā)現(xiàn),對(duì)于共享目錄文件,結(jié)論如下:- 隨著需要判斷的文件數(shù)量逐漸增多,循環(huán)單個(gè)文件的耗時(shí)會(huì)增加,而統(tǒng)一獲取在內(nèi)存判斷,則并無(wú)太大波動(dòng)。
- 受操作系統(tǒng)或網(wǎng)絡(luò)影響,性能耗時(shí)可能會(huì)存在波動(dòng)。
結(jié)論
通過(guò)對(duì)本地文件和共享目錄下文件,以及不同數(shù)量的文件進(jìn)行文件是否存在校驗(yàn)的耗時(shí)比較分析,結(jié)論如下:
如果需要判斷的文件數(shù)量比較多,且分散存儲(chǔ)的目錄雖然不唯一,卻相對(duì)集中,建議采用第二種(統(tǒng)一獲?。┓绞竭M(jìn)行校驗(yàn)。
該文章在 2024/7/22 12:34:40 編輯過(guò)