从我的驱动器获取文件在c#中返回0

KAN*_* UG 3 c#

我只是VS,C#和XAML的新手.我有这个项目建设,我想在我的D;\驱动器中显示所有图像.所以我实际上从这个问题得到了这个代码,幸运的是,我让它没有任何困难地工作.我可以告诉代码是有效的,因为我的应用程序现在需要大约2分钟才能启动,因此由于搜索到的图像而被延迟

public static IEnumerable<string> GetDirectoryFiles(string rootPath, string patternMatch, SearchOption searchOption)
{
    var foundFiles = Enumerable.Empty<string>();
    if (searchOption == SearchOption.AllDirectories)
    {
        try
        {
            IEnumerable<string> subDirs = Directory.EnumerateDirectories(rootPath);
            foreach (string dir in subDirs)
            {
                foundFiles = foundFiles.Concat(GetDirectoryFiles(dir, patternMatch, searchOption));
            }
        }
        catch (UnauthorizedAccessException) { }
        catch (PathTooLongException) { }
    }
    try
    {
        foundFiles = foundFiles.Concat(Directory.EnumerateFiles(rootPath, patternMatch));
    }
    catch (UnauthorizedAccessException) { }
    return foundFiles;
}
Run Code Online (Sandbox Code Playgroud)

我用这行代码来调用函数 GetDirectoryFiles

string[] filePaths = {};
string[] extObj = { "*.JPG", ".JPEG", ".PNG", ".GIF", ".BMP*.jpg", ".jpeg", ".png", ".gif", ".bmp" };
foreach(var ext in extObj)
    filePaths.Concat(GetDirectoryFiles(@"D:\", ext, SearchOption.AllDirectories));
System.Diagnostics.Debug.WriteLine(filePaths.Length);
Run Code Online (Sandbox Code Playgroud)

但是我有一个问题...当filePaths.Length输出时我得到了0.我实际上不知道为什么,但我知道.jpg我的D:\驱动器中至少有4000个图像,所以我不应该得到0.

我的问题简而言之:我想在我的D:\驱动器中加载所有图像,不包括返回的路径UnauthorizedAccessExceptionPathTooLongException参考我之前的问题的错误

mad*_*ion 6

Concat扩展方法返回一个新的枚举对象,但你没有做任何事的.您需要将其分配回去filePaths.

首先,更改filePaths的类型.如果你把它作为一个数组保存,那么你每次都要继续对它进行重新设置(例如调用ToArray),而且成本很高.

IEnumerable<string> filePaths = Enumerable.Empty<string>();
Run Code Online (Sandbox Code Playgroud)

然后,将每个新的可枚举分配回filePaths.

foreach (var ext in extObj)
    filePaths = filePaths.Concat(GetDirectoryFiles(@"D:\", ext, SearchOption.AllDirectories));
Run Code Online (Sandbox Code Playgroud)

最后,filePaths是IEnumerable<string>你必须使用Count()而不是Length.

System.Diagnostics.Debug.WriteLine(filePaths.Count());
Run Code Online (Sandbox Code Playgroud)

......或者只是把它改造成......

string[] finalFilePaths = filePaths.ToArray();
System.Diagnostics.Debug.WriteLine(finalFilePaths.Length);
Run Code Online (Sandbox Code Playgroud)


Vil*_*P P 5

尝试

    foreach(var ext in extObj)
        filePaths= filePaths.Concat(GetDirectoryFiles(@"D:\", ext, SearchOption.AllDirectories));
Run Code Online (Sandbox Code Playgroud)

你忘了将concat的结果分配给同一个源