0
我有一個C#4.0 .Net應用程序,它目前正在分析查找特定字符串的文本行,並且我想添加用於搜索所有目錄的複選框選項的功能,並且還可以通過擴展名或所有文件進行過濾。我應該爲代碼構建一個表達式還是有很多路徑?
我最終在四個可能的選擇中的每一個上使用Directory.EnumerateFiles語句執行了幾個if/else語句。
當我試圖分配Enumerable foreach來循環遍歷它們時,我一直被上面代碼的上下文置之不理。 我猜我需要包含每個EnumerateFiles if/else塊中的所有代碼,還是我?
我是一名VBA開發人員,努力向C#跳轉,我發現範圍和上下文對我來說是最大的挑戰。在VB中,我會建立一串選項,然後連接它們(&)以獲得可執行的代碼行,但用(+)和字符串變量嘗試這些代碼並沒有取得任何成功。
我在說的if/else塊在下面。
try
{
string sourceDirectory =txtFolder.Text;
var filters = new[] { txtFileExt.ToString() };
var result = new List<string>();
if (txtExtensionsFile == null)
{
if (chkSubFolderFiles.Checked)
{
var txtFiles = Directory.EnumerateFiles(sourceDirectory, "*.*", SearchOption.AllDirectories) ;
}
else
{
var txtFiles = Directory.EnumerateFiles(sourceDirectory, "*.*", SearchOption.TopDirectoryOnly) ;
}
}
else
{
if (chkSubFolderFiles.Checked)
{
var txtFiles = Directory.EnumerateFiles(sourceDirectory, "*.*", SearchOption.AllDirectories).Where(s => filters.Any(ext => ext == Path.GetExtension(s)))) ;
}
else
{
var txtFiles = Directory.EnumerateFiles(sourceDirectory, "*.*", SearchOption.TopDirectoryOnly).Where(s => filters.Any(ext => ext == Path.GetExtension(s)))) ;
}
}
foreach (string filename in txtFiles)
{
using (var reader = new StreamReader(filename))
if (Path.GetExtension(filename) == txtFileExt.Text)
//continues on to parse out text from each file
}
有幾個不同的方法來做到這一點,而無需使用這麼多的冗餘代碼。例如,你可以使用變量替換此 var files = Directory.EnumerateFiles(@「C:\ path \ folder \」,「*。*」,SearchOption.AllDirectories) .Where(s => s.EndsWith(「。mp3」)|| s.EndsWith (「.jpg」));''你可以混合搭配......並且獲得所有文件 'var allFilenames = Directory.EnumerateFiles(path).Select(p => Path.GetFileName(p));'' – MethodMan