[英]Count lines in files in folders recursively
在C#中,最好的方法是對目錄及其所有子目錄中的所有文件中的行總數進行計數?
顯而易見的答案是使一個遞歸函數遍歷所有目錄,並使用此問題中的策略計算每個文件中的行數。 有沒有更好/更簡便的方法?
有沒有更好/更簡便的方法?
不,(通常)沒有比計數行數更好的方法來獲取文件中的行數。
為了找到所有文件中的總行數,您將必須在某個時刻獲取每個文件中的總行數。 真的沒有辦法解決。
確實沒有更好的方法。 遍歷目錄結構到達所有子目錄本身就使其可以遞歸完成。 至於計算文件中的行數,您實際上別無選擇,只能打開文件並計算行數。 請注意,您確實需要注意要炸毀堆棧,因此您可能必須使用Queue
手動模擬遞歸。
由於正確,清晰,簡潔地編碼該方法相對容易,我認為這是您應該做的,然后繼續在其他地方增加價值。
您描述的策略效果很好。 替代遞歸函數(基本上是DFS)的一種替代方法是使用BFS。 就像是:
int CountLines(string path)
{
var queue = new Queue<string>();
queue.Enqueue(path);
int count = 0;
while (queue.Count > 0) {
string dir = queue.Dequeue();
foreach (var subdir in Directory.GetDirectories(dir))
queue.Enqueue(subdir);
foreach (var file in Directory.GetFiles(dir))
count += GetLineCount(file);
}
return count;
}
這是一種LINQy方式:
string path = @"C:\TonsOfTextFiles";
int totalLines = (from file in Directory.GetFiles(path, "*.*", SearchOption.AllDirectories)
let fileText = File.ReadAllLines(file)
select fileText.Length).Sum();
我認為該帖子足以說明您問題的后半部分。 至於遍歷目錄,請查看此http://dotnetperls.com/recursively-find-files
更新:對此有一個抽象:我真的希望您能閱讀鏈接,但這是http://dotnetperls.com/recursive-file-list-1
要查找文件,為什么不只使用以下內容:
Directory.GetFiles("C:/some/path", "*.txt", SearchOption.AllDirectories);
這將為您提供遞歸搜索的結果。
請上帝,原諒我:
@echo off
set sum=0
for /r %%f in (*.cs) do find /v /c "$$some nonsense string$$" %%f >> test.dat
for /f "tokens=3 delims=:" %%i in (test.dat) do set /a sum += %%i
echo total lines = %sum%
del test.dat
不是C#,但很有趣。
編輯:這可以提高內存效率,因為它不使用ReadAllLines
,但一次使用:
string basePath = @"C:\some\path";
Console.WriteLine(
Directory.GetFiles(basePath, "*.cs", SearchOption.AllDirectories)
.Sum(file =>
{
int lines = 0;
using (StreamReader reader = new StreamReader(file))
while(reader.ReadLine() != null) lines++;
return lines;
}));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.