从驱动器中获取文件在c#

时间:2019-01-13 05:55:14

标签: c#

我只是VS,C#和XAML的新手。 我正在构建这个项目,我想在我的D;\驱动器中显示所有图像。因此,我实际上是从question处获得此代码的,幸运的是,我可以毫无困难地使用它。我可以说代码正在运行,因为我的应用现在需要大约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;
}

我使用这一行代码来调用函数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);

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

简而言之,我的问题是:我想将所有图像加载到D:\驱动器中,但要排除返回与我以前的{{3}相关的UnauthorizedAccessExceptionPathTooLongException错误的路径}

2 个答案:

答案 0 :(得分:6)

Concat扩展方法返回一个新的可枚举对象,但是您对此不做任何事情。您需要将其分配回filePaths

首先,更改filePaths的类型。如果您将其保留为数组,则每次都必须对其进行调整(例如,调用ToArray),这非常昂贵。

IEnumerable<string> filePaths = Enumerable.Empty<string>();

然后,将每个新的可枚举分配回filePath。

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

最后,filePaths为IEnumerable<string>,因此您必须使用Count()而不是Length

System.Diagnostics.Debug.WriteLine(filePaths.Count());

...或者只是对其进行修正...

string[] finalFilePaths = filePaths.ToArray();
System.Diagnostics.Debug.WriteLine(finalFilePaths.Length);

答案 1 :(得分:5)

尝试

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

您忘记将concat的结果分配给同一源