最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

文件夾遍歷(C#實(shí)現(xiàn))

2021-05-30 14:40 作者:無(wú)情劍客Burning  | 我要投稿


瘋狂java講義習(xí)題11.1[1]使用Java語(yǔ)言列出了指定目錄的所有文件。這里使用C#來(lái)實(shí)現(xiàn)同樣的功能,使用遞歸和非遞歸兩種方式?;谖募闅v,實(shí)現(xiàn)類(lèi)似everything的功能以及grep功能。

C#

微軟出品,必屬精品。

C#和Java誰(shuí)更好是一個(gè)一直存在的問(wèn)題。怎么說(shuō)那,如果一定要選擇一個(gè)的話(huà),我選擇C#,因?yàn)?NET平臺(tái)的架構(gòu)是Java無(wú)法比擬的(能否最終實(shí)現(xiàn),還要看微軟了)。

.NET架構(gòu):

.NET5的架構(gòu):

Ubuntu下C#開(kāi)發(fā)

使用的IDE是MonoDevelop(https://www.monodevelop.com/)。

Mono是最早的.NET開(kāi)源實(shí)現(xiàn),是Xamarin和Unity的基礎(chǔ)。在《C# 7.0本質(zhì)論》一書(shū)中。作者說(shuō): 目前Mono已被.NET Core 替代。不過(guò)對(duì)于開(kāi)發(fā)應(yīng)用程序影響不大。

文件夾遍歷

遞歸版本

代碼實(shí)現(xiàn)

思路很簡(jiǎn)單,如果是文件的話(huà),就停止遞歸。如果是目錄的話(huà)就遞歸執(zhí)行。

/*
?* string path: 文件或者文件夾字符串 ? ? ?
?*/ ? ? ?
public static void RecvDir(string path)
{
? ? //判斷是否是文件
? ? /*if (File.Exists(path))
? ? {
? ? ? ? Console.WriteLine("文件名稱(chēng)是: " + path);
? ? }
? ? else
? ? {*/
? ? Console.WriteLine("目錄名稱(chēng)是: " + path);
? ? List<string> dirs = new List<string>(Directory.EnumerateDirectories(path));

? ? foreach (var dir in dirs)
? ? {
? ? ? ? Console.WriteLine($@"包含的目錄{dir}");
? ? ? ? RecvDir(dir);
? ? }
? ? Console.WriteLine($"{dirs.Count} directories found.");
? ? List<string> files = new List<string>(Directory.EnumerateFiles(path));

? ? foreach (string file in files)
? ? {
? ? ? ? Console.WriteLine($@"包含的文件{file}");
? ? }
? ? Console.WriteLine($"{files.Count} files found");
? ? //}
}

運(yùn)行結(jié)果:

說(shuō)說(shuō)遞歸

用遞歸實(shí)現(xiàn)方法的時(shí)候常見(jiàn)的錯(cuò)誤是在程序運(yùn)行的時(shí)候發(fā)生棧溢出(stack overflow), 這通常是由于無(wú)限遞歸造成的。假如方法持續(xù)調(diào)用自身,永遠(yuǎn)抵達(dá)不了標(biāo)志遞歸結(jié)束的位置,就會(huì)發(fā)生無(wú)限遞歸。必須仔細(xì)檢查每個(gè)遞歸的實(shí)現(xiàn),確保遞歸調(diào)用是有限的而不是無(wú)限的。

常應(yīng)的遞歸模式:

M(x)
{
? ?if x 已達(dá)最小,不可繼續(xù)分解
? ? ? ?返回結(jié)果
? ?else
? ? ? ?(1)采取一些操作使問(wèn)題變得更小
? ? ? ?(2)遞歸調(diào)用M來(lái)解決更小的問(wèn)題
? ? ? ?(3)根據(jù)(1)和(2)計(jì)算結(jié)果
? ? ? ?返回結(jié)果

}

非遞歸版本

在進(jìn)行內(nèi)核開(kāi)發(fā)中,盡量不要用遞歸,因?yàn)閮?nèi)核的??臻g有限,而遞歸需要不斷創(chuàng)建新的棧,如果層次很深的話(huà),就會(huì)導(dǎo)致棧空間很大,造成內(nèi)核的棧空間不足。因此這里給出非遞歸版本的實(shí)現(xiàn),這里基于的是BFS廣度優(yōu)先搜索(BFS),同時(shí)添加了異常處理。

代碼實(shí)現(xiàn)

/*
* string path: 文件或者文件夾字符串 ? ? ?
*/
public static void NonRecvDir(string path)
{
? ?List<string> temp = new List<string>();
? ?temp.Add(path);
? ?for (int i = 0; i < temp.Count; i++)
? ?{
? ? ? ?if (File.Exists(temp[i]))
? ? ? ?{
? ? ? ? ? ?continue;
? ? ? ?}
? ? ? ?else
? ? ? ?{
? ? ? ? ? ?try
? ? ? ? ? ?{
? ? ? ? ? ? ? ?List<string> dirs = new List<string>(Directory.EnumerateDirectories(temp[i]));

? ? ? ? ? ? ? ?foreach (var dir in dirs)
? ? ? ? ? ? ? ?{
? ? ? ? ? ? ? ? ? ?temp.Add(dir);
? ? ? ? ? ? ? ?}
? ? ? ? ? ? ? ?List<string> files = new List<string>(Directory.EnumerateFiles(temp[i]));

? ? ? ? ? ? ? ?foreach (string file in files)
? ? ? ? ? ? ? ?{
? ? ? ? ? ? ? ? ? ?temp.Add(file);
? ? ? ? ? ? ? ?}

? ? ? ? ? ?}
? ? ? ? ? ?catch (UnauthorizedAccessException ex)
? ? ? ? ? ?{
? ? ? ? ? ? ? ?Console.WriteLine(ex.Message);
? ? ? ? ? ?}
? ? ? ? ? ?catch (PathTooLongException ex)
? ? ? ? ? ?{
? ? ? ? ? ? ? ?Console.WriteLine(ex.Message);
? ? ? ? ? ?}
? ? ? ? ? ?catch(DirectoryNotFoundException ex)
? ? ? ? ? ?{
? ? ? ? ? ? ? ?Console.WriteLine(ex.Message); ?
? ? ? ? ? ?}
? ? ? ? ? ?catch (Exception ex)
? ? ? ? ? ?{
? ? ? ? ? ? ? ?Console.WriteLine(ex.Message);
? ? ? ? ? ?}
? ? ? ?}
? ?}
? ?foreach (string pathTemp in temp)
? ?{
? ? ? ?Console.WriteLine(pathTemp);
? ?}
}

運(yùn)行結(jié)果:

說(shuō)說(shuō)BFS

廣度優(yōu)先搜索算法(Breadth-First-Search,縮寫(xiě)為 BFS),是一種利用隊(duì)列實(shí)現(xiàn)的搜索算法。簡(jiǎn)單來(lái)說(shuō),其搜索過(guò)程和 “湖面丟進(jìn)一塊石頭激起層層漣漪” 類(lèi)似。

深度優(yōu)先搜索算法(Depth-First-Search,縮寫(xiě)為 DFS),是一種利用遞歸實(shí)現(xiàn)的搜索算法。簡(jiǎn)單來(lái)說(shuō),其搜索過(guò)程和 “不撞南墻不回頭” 類(lèi)似。

BFS 的重點(diǎn)在于隊(duì)列,而 DFS 的重點(diǎn)在于遞歸。這是它們的本質(zhì)區(qū)別。

寫(xiě)在最后

C#是目前微軟主推的語(yǔ)言,而中國(guó)即使像華為這樣的頂級(jí)公司,依然沒(méi)有一門(mén)自己主推的語(yǔ)言。目前國(guó)產(chǎn)手機(jī),國(guó)產(chǎn)操作系統(tǒng)這些很能激起人們的愛(ài)國(guó)情懷和購(gòu)買(mǎi)欲望,但是這些所謂的國(guó)產(chǎn)系統(tǒng),國(guó)產(chǎn)手機(jī)又有多少是真正國(guó)產(chǎn)的,大部分都是基于Linux內(nèi)核來(lái)搞出來(lái)的,當(dāng)然了,能做到這一步也很不容易。

相較于國(guó)產(chǎn)系統(tǒng)和國(guó)產(chǎn)手機(jī),國(guó)產(chǎn)語(yǔ)言貌似根本就沒(méi)有(易語(yǔ)言除外,非常依賴(lài)于Window操作系統(tǒng)的一門(mén)語(yǔ)言),甚至這個(gè)概念很少被提及,個(gè)人感覺(jué),語(yǔ)言是一切的基礎(chǔ),搞一門(mén)語(yǔ)言的意義或許比搞一個(gè)操作系統(tǒng)的意義更加重要。

當(dāng)然了,目前主流的語(yǔ)言大部分都已經(jīng)開(kāi)源了,但是沒(méi)有一門(mén)屬于自己國(guó)家的開(kāi)發(fā)語(yǔ)言總感覺(jué)少點(diǎn)什么。

公眾號(hào)

更多內(nèi)容,歡迎關(guān)注我的微信公眾號(hào): 無(wú)情劍客。


References

[1]?瘋狂java講義習(xí)題11.1:?https://helloworddm.blog.csdn.net/article/details/76785400


文件夾遍歷(C#實(shí)現(xiàn))的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
泸定县| 天全县| 汶川县| 神农架林区| 金门县| 肥东县| 正镶白旗| 贵定县| 如皋市| 张掖市| 云安县| 富阳市| 凤冈县| 墨竹工卡县| 广水市| 辽宁省| 洪江市| 抚顺市| 上高县| 盐池县| 诸暨市| 平罗县| 吴江市| 新巴尔虎左旗| 海南省| 中阳县| 大化| 英德市| 乌恰县| 奉贤区| 克东县| 柳林县| 汶川县| 浦城县| 香格里拉县| 长垣县| 阿城市| 梅河口市| 邛崃市| 乌鲁木齐县| 锦州市|