在瘋狂java講義習(xí)題11.1使用Java語言列出了指定目錄的所有文件。這里使用C#來實現(xiàn)同樣的功能授账,使用遞歸和非遞歸兩種方式吗购“探#基于文件遍歷,實現(xiàn)類似everything的功能以及grep功能阳似。
C#
微軟出品骚勘,必屬精品。
C#和Java誰更好是一個一直存在的問題障般。怎么說那调鲸,如果一定要選擇一個的話盛杰,我選擇C#,因為.NET平臺的架構(gòu)是Java無法比擬的(能否最終實現(xiàn)藐石,還要看微軟了)即供。
.NET架構(gòu):
.NET5的架構(gòu):
Ubuntu下C#開發(fā)
使用的IDE是MonoDevelop(https://www.monodevelop.com/)。
Mono是最早的.NET開源實現(xiàn)于微,是Xamarin和Unity的基礎(chǔ)逗嫡。在《C# 7.0本質(zhì)論》一書中。作者說: 目前Mono已被.NET Core 替代株依。不過對于開發(fā)應(yīng)用程序影響不大驱证。
文件夾遍歷
遞歸版本
代碼實現(xiàn)
思路很簡單,如果是文件的話恋腕,就停止遞歸抹锄。如果是目錄的話就遞歸執(zhí)行。
/*
* string path: 文件或者文件夾字符串
*/
public static void RecvDir(string path)
{
//判斷是否是文件
/*if (File.Exists(path))
{
Console.WriteLine("文件名稱是: " + path);
}
else
{*/
Console.WriteLine("目錄名稱是: " + 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");
//}
}
運行結(jié)果:
說說遞歸
用遞歸實現(xiàn)方法的時候常見的錯誤是在程序運行的時候發(fā)生棧溢出(stack overflow), 這通常是由于無限遞歸造成的荠藤。假如方法持續(xù)調(diào)用自身伙单,永遠抵達不了標志遞歸結(jié)束的位置,就會發(fā)生無限遞歸哈肖。必須仔細檢查每個遞歸的實現(xiàn)吻育,確保遞歸調(diào)用是有限的而不是無限的。
常應(yīng)的遞歸模式:
M(x)
{
if x 已達最小淤井,不可繼續(xù)分解
返回結(jié)果
else
(1)采取一些操作使問題變得更小
(2)遞歸調(diào)用M來解決更小的問題
(3)根據(jù)(1)和(2)計算結(jié)果
返回結(jié)果
}
非遞歸版本
在進行內(nèi)核開發(fā)中布疼,盡量不要用遞歸,因為內(nèi)核的棻液荩空間有限游两,而遞歸需要不斷創(chuàng)建新的棧,如果層次很深的話漩绵,就會導(dǎo)致椘鞴蓿空間很大,造成內(nèi)核的椊バ校空間不足。因此這里給出非遞歸版本的實現(xiàn)铸董,這里基于的是BFS廣度優(yōu)先搜索(BFS)祟印,同時添加了異常處理。
代碼實現(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);
}
}
運行結(jié)果:
說說BFS
廣度優(yōu)先搜索算法(Breadth-First-Search粟害,縮寫為 BFS)蕴忆,是一種利用隊列實現(xiàn)的搜索算法。簡單來說悲幅,其搜索過程和 “湖面丟進一塊石頭激起層層漣漪” 類似套鹅。
深度優(yōu)先搜索算法(Depth-First-Search站蝠,縮寫為 DFS),是一種利用遞歸實現(xiàn)的搜索算法卓鹿。簡單來說菱魔,其搜索過程和 “不撞南墻不回頭” 類似。
BFS 的重點在于隊列吟孙,而 DFS 的重點在于遞歸澜倦。這是它們的本質(zhì)區(qū)別。
寫在最后
C#是目前微軟主推的語言杰妓,而中國即使像華為這樣的頂級公司藻治,依然沒有一門自己主推的語言。目前國產(chǎn)手機巷挥,國產(chǎn)操作系統(tǒng)這些很能激起人們的愛國情懷和購買欲望桩卵,但是這些所謂的國產(chǎn)系統(tǒng),國產(chǎn)手機又有多少是真正國產(chǎn)的倍宾,大部分都是基于Linux內(nèi)核來搞出來的雏节,當然了,能做到這一步也很不容易凿宾。
相較于國產(chǎn)系統(tǒng)和國產(chǎn)手機矾屯,國產(chǎn)語言貌似根本就沒有(易語言除外,非常依賴于Window操作系統(tǒng)的一門語言)初厚,甚至這個概念很少被提及件蚕,個人感覺,語言是一切的基礎(chǔ)产禾,搞一門語言的意義或許比搞一個操作系統(tǒng)的意義更加重要排作。
當然了,目前主流的語言大部分都已經(jīng)開源了亚情,但是沒有一門屬于自己國家的開發(fā)語言總感覺少點什么妄痪。
公眾號
更多內(nèi)容,歡迎關(guān)注我的微信公眾號: 無情劍客楞件。