狠狠色丁香婷婷综合尤物/久久精品综合一区二区三区/中国有色金属学报/国产日韩欧美在线观看 - 国产一区二区三区四区五区tv

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

【C#】大批量判斷文件是否存在的兩種方法效率對比

admin
2024年7月19日 23:53 本文熱度 1018

在日常開發(fā)中,我們經(jīng)常需要和文件打交道,特別是桌面開發(fā),有時(shí)候會(huì)需要加載大批量的文件,而且可能還會(huì)存在部分文件缺失的情況,那么如何才能快速判斷文件是否存在呢?如果處理不當(dāng),且文件數(shù)量比較多的時(shí)候,可能會(huì)造成卡頓等情況,進(jìn)而影響程序的使用體驗(yàn)。今天就以一個(gè)簡單的小例子,簡述兩種不同的判斷文件是否存在的方式以及效率比較。

涉及知識點(diǎn)

在本示例中,涉及的知識點(diǎn)如下:
  1. 單個(gè)文件是否存在判斷,通常采用File.Exists(file)來判斷文件是否存在,存在返回true,不存在返回false。
  2. 獲取目錄下的文件,通常采用Directory.GetFiles(dir)來獲取目錄下的文件,返回目錄下的文件列表。
  3. 計(jì)算程序執(zhí)行耗時(shí),通常采用Stopwatch進(jìn)行計(jì)算,單位可以是毫秒,秒,TimeSpan等。

前提

本示例的前提是,通常有多個(gè)文件(如:幾十,幾百,幾千,幾萬)需要判斷是否存在,且文件隸屬于多個(gè)目錄。

循環(huán)文件判斷

C#默認(rèn)提供的文件存在判斷方式,一般用于單個(gè)文件。如果有多個(gè)文件,可以批量循環(huán)進(jìn)行判斷。步驟如下:
  1. 循環(huán)需要判斷的文件列表
  2. 每個(gè)文件都判斷一次文件是否存在。 
代碼如下所示:
/// <summary>/// 逐一判斷是否存在,并返回判斷時(shí)長/// </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)行一百次的文件是否存在判斷,都是磁盤文件判斷。

統(tǒng)一獲取判斷

統(tǒng)一獲取,即獲取文件夾目錄下的文件,在內(nèi)存中判斷文件是否存在。步驟如下:
  1. 先獲取文件列表所在的文件夾,

  2. 獲取文件夾中的所有文件,存入字典中,

  3. 然后通過字典判斷是否包含文件

代碼如下所示:

/// <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)行比較。分別如下:

1. 本地文件
本地文件,分別對10到500個(gè)文件進(jìn)行判斷是否存在,對兩種方式的耗時(shí)比較。
其中橫坐標(biāo)為文件數(shù)量,縱坐標(biāo)為判斷文件是否存在的執(zhí)行耗時(shí)(毫秒)。如下所示:
通過比較發(fā)現(xiàn),對于本地文件,結(jié)論如下:
  1. 對于需要判斷的文件數(shù)量較少時(shí),循環(huán)單個(gè)文件和統(tǒng)一獲取再判斷,性能上并無太大差異。
  2. 隨著需要判斷的文件數(shù)量逐漸增多,循環(huán)單個(gè)文件的耗時(shí)會(huì)增加,而統(tǒng)一獲取在內(nèi)存判斷,則并無太大波動(dòng)。
  3. 受操作系統(tǒng)影響,性能耗時(shí)可能會(huì)存在波動(dòng)。

2. 共享目錄文件

共享文件,分別對10到500個(gè)文件進(jìn)行判斷是否存在,對兩種方式的耗時(shí)比較。
其中橫坐標(biāo)為文件數(shù)量,縱坐標(biāo)為判斷文件是否存在的執(zhí)行耗時(shí)(毫秒)。如下所示:
通過比較發(fā)現(xiàn),對于共享目錄文件,結(jié)論如下:
  1. 隨著需要判斷的文件數(shù)量逐漸增多,循環(huán)單個(gè)文件的耗時(shí)會(huì)增加,而統(tǒng)一獲取在內(nèi)存判斷,則并無太大波動(dòng)。
  2. 受操作系統(tǒng)或網(wǎng)絡(luò)影響,性能耗時(shí)可能會(huì)存在波動(dòng)。

結(jié)論

通過對本地文件和共享目錄下文件,以及不同數(shù)量的文件進(jìn)行文件是否存在校驗(yàn)的耗時(shí)比較分析,結(jié)論如下:

如果需要判斷的文件數(shù)量比較多,且分散存儲(chǔ)的目錄雖然不唯一,卻相對集中,建議采用第二種(統(tǒng)一獲取)方式進(jìn)行校驗(yàn)。


該文章在 2024/7/22 12:34:40 編輯過
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點(diǎn)晴ERP是一款針對中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場、車隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報(bào)表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場作業(yè)而開發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉儲(chǔ)管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購管理,倉儲(chǔ)管理,倉庫管理,保質(zhì)期管理,貨位管理,庫位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時(shí)間、不限用戶的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved