C#遞歸搜索指定目錄下的文件或目錄


來源:https://www.cnblogs.com/huhangfei/p/5012978.html

誠然可以使用現成的Directory類下的GetFiles、GetDirectories、GetFileSystemEntries這幾個方法實現同樣的功能,但請相信我不是蛋疼,原因是這幾個方法在遇上【System Volume Information】這種目錄時,極有可能會給你個拒絕訪問的異常,想跳過都不行。所以沒辦法,重新實現了一下。 實現說明- 仍然是基于對Directory類的幾個方法的封裝進行實現,只是沒有使用它們的searchPattern和searchOption功能 - 將匹配模式由windows的通配符?、*改為正則匹配。一是讓匹配更強大,二是要實現?*匹配還得做額外工作,沒必要匹配模式并沒有默認添加首尾限定^$,即“abc"將會匹配所有包含該字串的項目,所以如果你要匹配首尾,請自行添加^$忽略大小寫匹配如果不想搜索指定項目而是全部,請將regexPattern參數設為null,而不是.*,前者性能更好 - 可通過設置recurse和throwEx參數決定是否遞歸搜索,和是否拋異常。默認是不遞歸,不拋異常 - 遇到不可訪問的目錄會跳過。當然前提是throwEx=false - 之所以在foreach外層再套一層try-catch,是因為如果指定的dir就是不可訪問的目錄,那也可以避免異常 - 之所以為獲取項、獲取文件、獲取目錄分別實現3個方法,而不是只實現一個獲取項,另外兩個重載,是因為只實現一個的話,foreach中要做的邏輯判斷不少,考慮到方法是要遞歸的,所以循環中邏輯越少越好 - 之所以不做dir參數合法性檢查,原因同上,判斷越少越好。所以請用戶調用前自行確保dir合法不廢話,上代碼:

 1 /// <summary>
 2     /// 獲取指定目錄中的匹配項(文件或目錄)
 3     /// </summary>
 4     /// <param name="dir">要搜索的目錄</param>
 5     /// <param name="regexPattern">項名模式(正則)。null表示忽略模式匹配,返回所有項</param>
 6     /// <param name="recurse">是否搜索子目錄</param>
 7     /// <param name="throwEx">是否拋異常</param>
 8     /// <returns></returns>
 9     public static string[] GetFileSystemEntries(string dir, string regexPattern, bool recurse, bool throwEx)
10     {
11         List<string> lst = new List<string>();
12 
13         try
14         {
15             foreach (string item in Directory.GetFileSystemEntries(dir))
16             {
17                 try
18                 {
19                     if (regexPattern == null || Regex.IsMatch(Path.GetFileName(item), regexPattern, RegexOptions.IgnoreCase | RegexOptions.Multiline))
20                     { lst.Add(item); }
21 
22                     //遞歸
23                     if (recurse && (File.GetAttributes(item) & FileAttributes.Directory) == FileAttributes.Directory)
24                     { lst.AddRange(GetFileSystemEntries(item, regexPattern, recurse, throwEx)); }
25                 }
26                 catch { if (throwEx) { throw; } }
27             }
28         }
29         catch { if (throwEx) { throw; } }
30 
31         return lst.ToArray();
32     }
33 
34     /// <summary>
35     /// 獲取指定目錄中的匹配文件
36     /// </summary>
37     /// <param name="dir">要搜索的目錄</param>
38     /// <param name="regexPattern">文件名模式(正則)。null表示忽略模式匹配,返回所有文件</param>
39     /// <param name="recurse">是否搜索子目錄</param>
40     /// <param name="throwEx">是否拋異常</param>
41     /// <returns></returns>
42     public static string[] GetFiles(string dir, string regexPattern, bool recurse, bool throwEx)
43     {
44         List<string> lst = new List<string>();
45 
46         try
47         {
48             foreach (string item in Directory.GetFileSystemEntries(dir))
49             {
50                 try
51                 {
52                     bool isFile = (File.GetAttributes(item) & FileAttributes.Directory) != FileAttributes.Directory;
53 
54                     if (isFile && (regexPattern == null || Regex.IsMatch(Path.GetFileName(item), regexPattern, RegexOptions.IgnoreCase | RegexOptions.Multiline)))
55                     { lst.Add(item); }
56 
57                     //遞歸
58                     if (recurse && !isFile) { lst.AddRange(GetFiles(item, regexPattern, recurse, throwEx)); }
59                 }
60                 catch { if (throwEx) { throw; } }
61             }
62         }
63         catch { if (throwEx) { throw; } }
64 
65         return lst.ToArray();
66     }
67 
68     /// <summary>
69     /// 獲取指定目錄中的匹配目錄
70     /// </summary>
71     /// <param name="dir">要搜索的目錄</param>
72     /// <param name="regexPattern">目錄名模式(正則)。null表示忽略模式匹配,返回所有目錄</param>
73     /// <param name="recurse">是否搜索子目錄</param>
74     /// <param name="throwEx">是否拋異常</param>
75     /// <returns></returns>
76     public static string[] GetDirectories(string dir, string regexPattern, bool recurse, bool throwEx)
77     {
78         List<string> lst = new List<string>();
79 
80         try
81         {
82             foreach (string item in Directory.GetDirectories(dir))
83             {
84                 try
85                 {
86                     if (regexPattern == null || Regex.IsMatch(Path.GetFileName(item), regexPattern, RegexOptions.IgnoreCase | RegexOptions.Multiline))
87                     { lst.Add(item); }
88 
89                     //遞歸
90                     if (recurse) { lst.AddRange(GetDirectories(item, regexPattern, recurse, throwEx)); }
91                 }
92                 catch { if (throwEx) { throw; } }
93             }
94         }
95         catch { if (throwEx) { throw; } }
96 
97         return lst.ToArray();
98     }

?

?
?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/454062.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/454062.shtml
英文地址,請注明出處:http://en.pswp.cn/news/454062.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

solr 配置

創建 SolrHome(solrCore) 1.解壓 solr-4.10.4.tgz 到 /usr/local/solr 2.將 solr-4.10.4/example/solr 下所有文件拷貝到 /usr/local/solrhome (此 solrhome 為自己創建的) solrhome 是 solr 運行主目錄&#xff0c;可包含多個 SolrCore 目錄SolrCore 目錄中包含運行 Solr 實例…

mfc程序轉化為qt_10年程序員:我都學過這些語言,2019年開始我再也不是程序員......

為什么學編程2008年&#xff0c;高中畢業的我問一個已經工作兩年的親戚&#xff1a;什么專業工資高&#xff1f;他告訴我&#xff1a;程序員。2008年成都最低工資好像是800元&#xff0c;我的生活費也是800元&#xff0c;據他所說程序員出來的工資是2000&#xff0c;于是開始了…

day 7 引用

1.ba在c語言和python中的區別 c語言&#xff1a;a100 a變量里面放的100 b a b變量里面也放的100 python &#xff1a; a100 內存中有個100 a放的100的內存地址 b a b也放的100的內存地址 相當于給100那一塊內存&#xff0c;貼個便利簽 2.type查看數據類型&…

Dapper逆天入門~強類型,動態類型,多映射,多返回值,增刪改查+存儲過程+事物案例演示...

Dapper的牛逼就不扯蛋了&#xff0c;答應群友做個入門Demo的&#xff0c;現有園友需要&#xff0c;那么公開分享一下&#xff1a; 完整Demo&#xff1a;http://pan.baidu.com/s/1i3TcEzj 注 意 事 項&#xff1a;http://www.cnblogs.com/dunitian/p/5221058.html 平臺之大勢何人…

Linux 狀態命令之磁盤狀態 iostat

Linux系統中的iostat是I/O statistics&#xff08;輸入/輸出統計&#xff09;的縮寫&#xff0c;iostat工具將對系統的磁盤操作活動進行監視。它的特點是匯報磁盤活動統計情況&#xff0c;同時也會匯報出CPU使用情況。同vmstat一樣&#xff0c;iostat也有一個弱點&#xff0c;就…

GDB十分鐘教程

GDB十分鐘教程 作者: liigo 原文鏈接: http://blog.csdn.net/liigo/archive/2006/01/17/582231.aspx 日期: 2006年1月16日 本文寫給主要工作在Windows操作系統下而又需要開發一些跨平臺軟件的程序員朋友&#xff0c;以及程序愛好者。 GDB是一個由GNU開源組織發布的、UNIX/LI…

課后作業-閱讀任務-閱讀提問-3

1.如果兩個人合作的始終達不到規范階段該怎如何處理&#xff1f; 2. 邏輯和界面設計要注意哪些因素&#xff1f;轉載于:https://www.cnblogs.com/fhycm/p/7866548.html

ride上點擊用例不能顯示edit信息_接口測試平臺代碼實現61: 多接口用例1

終于又序更上了&#xff0c;原諒最近作者幾天事情不斷。按照我們之前的計劃&#xff0c;需要迅速開啟很重要的核心多用例接口。首先&#xff0c;我們要確定&#xff0c;這個功能的大體設計。就放在在我們的頁面 用例庫 中&#xff1a;所以也就是我們很久之前就創建好的P_cases.…

黑客攻防專題八:21種RING的提權方法

好多都沒有成功&#xff0c;還是發來看看&#xff0c;看看思路&#xff0c;呵呵 以下全部是本人提權時候的總結 很多方法至今沒有機會試驗也沒有成功&#xff0c;但是我是的確看見別人成功過的。本人不才&#xff0c;除了第一種方法自己研究的&#xff0c;其他的都是別人的經驗…

Linux 狀態命令之內存狀態 free

簡介 free指令會顯示內存的使用情況&#xff0c;包括實體內存&#xff0c;虛擬的交換文件內存&#xff0c;共享內存區段&#xff0c;以及系統核心使用的緩沖區等。 語法 free [-bkmotV][-s <間隔秒數>]參數說明&#xff1a;-b  以Byte為單位顯示內存使用情況。-k  以…

SpringMVC在使用Jackson2時關于日期類型格式化的問題

*本例程序使用Jackson2.9.0&#xff0c;jackson1.x的處理方式稍稍有些不同。 在基于Spring&SpringMVC的Web項目中&#xff0c;我們常使用Jackson(1.x/2.x)來增加程序對Json格式的數據的支持。 因此&#xff0c;在實際應用中有個常見的需求&#xff1a;日期的格式化。 假設&…

GDB 使用——Linux C編程

簡述 一 列文件清單 二&#xff1a;執行程序 三&#xff1a;顯示數據 四&#xff1a;斷點(breakpoint) 五&#xff0e;斷點的管理 六&#xff0e;變量的檢查和賦值 七. 單步執行 八&#xff0e;函數的調用 九&#xff0e;機器語言工具 …

python撥號_python 撥號代碼(win10 系統親測有效)

# -*- coding: utf-8 -*-import win32rasimport time,osdef Connect(dialname, account, passwd):dial_params (dialname, , , account, passwd, )return win32ras.Dial(None, None, dial_params, None)def DialBroadband():dialname u寬帶連接 #just a nameaccount u059291…

HP服務器引導盤下載地址

HP SmartStart CD 8.7 x32版本的下載地址為&#xff1a;http://ftp.hp.com/pub/softlib2/software1/cd/p1040463476/v63549/smartstart-8.70-0-x86.zip HP SmartStart CD 8.7 x32版本支持以下機型&#xff1a; HP ProLiant ML 和 DL 300、500 和 700 系列以及 HP ProLiant BL S…

MUI - 預加載

打開詳情頁回到頂部:document.body.scrollTop document.documentElement.scrollTop 0;方式一&#xff1a;preload一次僅能預加載一個頁面&#xff08;除非循環&#xff09; var subWebview mui.preload({url: examples/accordion.html,id: template_sub,top: styles: {48 …

python 分類變量xgboost_【轉】XGBoost參數調優完全指南(附Python代碼)

xgboost入門非常經典的材料&#xff0c;雖然讀起來比較吃力&#xff0c;但是會有很大的幫助&#xff1a;英文原文鏈接:https://www.analyticsvidhya.com/blog/2016/03/complete-guide-parameter-tuning-xgboost-with-codes-python/

用 GDB 調試Linux程序及有用技巧

用 GDB 調試Linux程序及有用技巧(轉) armlinux 2008-06-19 10:48 閱讀91 評論0 字號&#xff1a; 大大 中中 小小 GNU的調試器稱為gdb&#xff0c;該程序是一個交互式工具&#xff0c;工作在字符模式。在 X Window 系統中&#xff0c;有一個gdb的前端圖形工具…

Bash : 索引數組

Bash 提供了兩種類型的數組&#xff0c;分別是索引數組(indexed array)和關聯數組(associative array)。本文主要介紹索引數組的基本用法。 索引數組的基本特點 Bash 提供的數組都是一維數組。任何變量都可以用作索引數組。通過 declare 關鍵字可以顯式的聲明一個索引數組。數組…

Flask 第三方組件之 login

在了解使用Flask來實現用戶認證之前&#xff0c;我們首先要明白用戶認證的原理。假設現在我們自己去實現用戶認證&#xff0c;需要做哪些事情呢&#xff1f; 首先&#xff0c;登錄。用戶能夠輸入用戶名和密碼進行登錄&#xff0c;所以需要網頁和表單&#xff0c;實現用戶輸入和…

Zookeeper客戶端Curator使用詳解

http://www.jianshu.com/p/70151fc0ef5dZookeeper客戶端Curator使用詳解 簡介 Curator是Netflix公司開源的一套zookeeper客戶端框架&#xff0c;解決了很多Zookeeper客戶端非常底層的細節開發工作&#xff0c;包括連接重連、反復注冊Watcher和NodeExistsException異常等等。Pat…