C# 为什么该方法不从主目录返回文件,如何指定多个扩展名?

C# 为什么该方法不从主目录返回文件,如何指定多个扩展名?,c#,winforms,C#,Winforms,这是我的方法中的代码: t = Environment.GetFolderPath(Environment.SpecialFolder.Personal); string[] textfiles = ApplyAllFiles(t, "*.txt", ProcessFile).ToArray(); 然后我也做了: s = Environment.GetFolderPath(Environment.SpecialFolder.Personal); string[] textfiles = App

这是我的方法中的代码:

t = Environment.GetFolderPath(Environment.SpecialFolder.Personal);
string[] textfiles = ApplyAllFiles(t, "*.txt", ProcessFile).ToArray();
然后我也做了:

s = Environment.GetFolderPath(Environment.SpecialFolder.Personal);
string[] textfiles = ApplyAllFiles(s, "*.jpg", ProcessFile).ToArray();
以及ApplyAllFiles方法:

static void ProcessFile(string path) {/* ... */}

static IEnumerable<string> ApplyAllFiles(string folder, string searchPattern, Action<string> fileAction)
{
     IEnumerable<string> files = Directory.GetFiles(folder, searchPattern);
     foreach (string file in files)
     {
         fileAction(file);
     }

     foreach (string subDir in Directory.GetDirectories(folder))
     {
         try
         {
             files = files.Concat(ApplyAllFiles(subDir, searchPattern, fileAction));
         }
         catch
         {
              // swallow, log, whatever
         }
      }

      return files;
}
staticvoidprocessfile(字符串路径){/*…*/}
静态IEnumerable应用程序文件(字符串文件夹、字符串搜索模式、操作文件操作)
{
IEnumerable files=Directory.GetFiles(文件夹,搜索模式);
foreach(文件中的字符串文件)
{
文件操作(文件);
}
foreach(Directory.GetDirectories(文件夹)中的字符串subDir)
{
尝试
{
files=files.Concat(ApplyAllFiles(subDir、searchPattern、fileAction));
}
抓住
{
//燕子,圆木,随便什么
}
}
归还文件;
}
  • 它不从主目录获取文件,例如,第一个主目录是: C:\Users\bout0\u 000\Documents 我在这个目录中有一些文本文件。它将从sub获取所有文本文件
    文档中的目录,但它永远不会获取C:\Users\bout0\u 000\Documents中的文本文件

  • 我怎样才能得到一个以上的扩展名,例如我做了“*.jpg”,但我也想得到bmp文件png文件和gif文件

  • 你为什么不直接用它呢?这样就不需要
    Concat
    或递归。你可以说

    static void ApplyAllFiles(string folder, string searchPattern, Action<string> fileAction)
    {
        foreach (string file in Directory.GetFiles(folder, searchPattern, SearchOption.AllDirectories))
            fileAction(file);
    }
    
    你为什么不直接用它呢?这样就不需要
    Concat
    或递归。你可以说

    static void ApplyAllFiles(string folder, string searchPattern, Action<string> fileAction)
    {
        foreach (string file in Directory.GetFiles(folder, searchPattern, SearchOption.AllDirectories))
            fileAction(file);
    }
    

    有关多个扩展名和
    Directory.GetFiles()
    的一些信息,请看这篇文章:我在我的系统上运行了你的代码,代码没有改变,它成功地从“main”文件夹返回了TXT文件,这意味着我的
    文档
    文件夹。David文本文件正在工作,但这个s=Environment.GetFolderPath(Environment.SpecialFolder.CommonPictures);给我:C:\\Users\\Public\\Pictures,但我希望它像文本文件一样给我变量t:C:\\Users\\bout0\u 000\\Documents so Environment.GetFolderPath(Environment.SpecialFolder.CommonPictures);我想让它给我:C:\\Users\\bout0\u 000\\Pictures我该怎么做?
    Environment.SpecialFolder.MyPictures
    将为给定用户提供正确的文件路径,而不是公共共享文件夹。我不确定我是否理解您刚才在评论中提出的问题,但我想我可能会理解。请尝试使用
    Environment.SpecialFolder.CommonPictures
    而不是
    Environment.SpecialFolder.MyPictures
    希望能有所帮助。有关多个扩展名和
    Directory.GetFiles()
    的一些信息,请看这篇文章:我在我的系统上未做任何更改地运行了你的代码,它成功地从“主”文件夹返回了TXT文件,意思是我的
    文档
    文件夹。David文本文件正在工作,但这个s=Environment.GetFolderPath(Environment.SpecialFolder.CommonPictures);给我:C:\\Users\\Public\\Pictures,但我希望它像文本文件一样给我变量t:C:\\Users\\bout0\u 000\\Documents so Environment.GetFolderPath(Environment.SpecialFolder.CommonPictures);我想让它给我:C:\\Users\\bout0\u 000\\Pictures我该怎么做?
    Environment.SpecialFolder.MyPictures
    将为给定用户提供正确的文件路径,而不是公共共享文件夹。我不确定我是否理解您刚才在评论中提出的问题,但我想我可能会理解。请尝试使用
    Environment.SpecialFolder.CommonPictures
    而不是
    Environment.SpecialFolder.MyPictures
    希望这会有所帮助。harpo我不想使用SearchOption.AllDirectory的原因是,例如,在我妻子的笔记本电脑上,我在文档中的一些子目录上遇到异常访问被拒绝,我看到了解决方案不是使用SearchOption.AllDirectory,而是使用递归。所以我根本不想使用SearchOption.AllDirectories。如果您的访问被拒绝,那么使用哪种方法都无关紧要。如果需要有选择地省略某些目录,可以使用类似于第二个示例的方法,在该示例中单独测试文件扩展名。(或者,您可以让您的妻子授予您的帐户访问权限:)harpo我不想使用SearchOption.AllDirectories的原因是,例如,在我妻子的笔记本电脑上,我对文档中的某些子目录的访问被拒绝,我发现解决方案不是使用SearchOption.AllDirectories,而是使用递归。所以我根本不想使用SearchOption.AllDirectories。如果您的访问被拒绝,那么使用哪种方法都无关紧要。如果需要有选择地省略某些目录,可以使用类似于第二个示例的方法,在该示例中单独测试文件扩展名。(或者,您可以让您的妻子授予您的帐户访问权限:)