簡體   English   中英

在第一個子目錄中查找所有文件

[英]Find all files in first sub directories

我有一個可以在Documents/GameLauncher/后面的所有目錄中進行搜索的應用程序,如下所示:

var foundApplications = Directory.GetFiles(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + "/GameLauncher", "*.*", SearchOption.AllDirectories).Where(s => s.EndsWith(".exe") || s.EndsWith(".lnk") || s.EndsWith(".url"));

這工作正常,但現在我只想在此文件夾的第一個子目錄中找到所有應用程序。 像這樣:

GameLauncher/test/test.exe <--- find this file
GameLauncher/test/test/test.exe <--- Ignore this file
GameLauncher/hello/hello.exe <--- find this file

我到處搜索並提出了以下建議:

//Search for first sub directories of path
var folders = Directory.GetDirectories(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + "/GameLauncher");
IEnumerable<string> foundApplications;

//Use folders to find applications and add them to foundApplications
for (int i = 0; i < folders.Count(); i++)
{
    foundApplications += Directory.GetFiles(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + "/GameLauncher/" + folders[i], "*.*", SearchOption.AllDirectories).Where(s => s.EndsWith(".exe") || s.EndsWith(".lnk") || s.EndsWith(".url"));
}

//Ends up with error "Use of unassigned local variable 'foundApplications'" when using = instead of += in the forloop above.
foreach (var application in foundApplications){
    MessageBox.Show(application.ToString());
}

有沒有人有解決此問題的提示,甚至沒有更好的方法在我的GameLauncher文件夾的第一個子目錄中找到這些文件?

感謝您的閱讀/幫助。

如果您不想要全部,就不要使用“全部”選項,就這么簡單。

var path = Path.Combine(
    Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments),
    @"GameLauncher");
var includedExtensions = new HashSet<string> { ".exe", ".lnk", ".url" };
var files =
    from dir in Directory.EnumerateDirectories(path)
    from file in Directory.EnumerateFiles(dir)
    let extension = Path.GetExtension(file)
    where includedExtensions.Contains(extension)
    select file;

您應該使用列表而不是IEnumerable,因為它會動態增長。

var foundApplications = new List<string>();

var folders = Directory.GetDirectories(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + "/GameLauncher");

//Use folders to find applications and add them to foundApplications
for (int i = 0; i < folders.Count(); i++)
{
    foundApplications.AddRange(Directory.GetFiles(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + "/GameLauncher/" + folders[i], "*.*", SearchOption.AllDirectories).Where(s => s.EndsWith(".exe") || s.EndsWith(".lnk") || s.EndsWith(".url").ToList());
}

foreach (var application in foundApplications){
    MessageBox.Show(application.ToString());
}

如果要將一個IEnumerable附加到另一個IEnumerable ,則需要使用Concat 您還必須將foundApplications初始化為一個空IEnumerable

var folderPath = Path.Combine(
    Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), 
    "GameLauncher");
var folders = Directory.GetDirectories(folderPath);
IEnumerable<string> foundApplications = Enumerable<string>.Empty;

//Use folders to find applications and add them to foundApplications
foreach(var subFolder in folders)
{
    string path = Path.Combine(folderPath, subFolder);
    foundApplications.Concat(
        Directory.GetFiles(path, "*.*", SearchOption.TopDirectoryOnly)
            .Where(s => s.EndsWith(".exe") || s.EndsWith(".lnk") || s.EndsWith(".url")));
}

foreach (var application in foundApplications){
    MessageBox.Show(application.ToString());
}

另外,我非常確定您要使用SearchOption.TopDirectoryOnly而不要使用SearchOption.AllDirectories

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM