【问题标题】:How to get Directories name如何获取目录名称
【发布时间】:2014-10-14 15:35:00
【问题描述】:

我使用此代码获取目录名称:

void DirSearch(string sDir)
    {
        foreach (var d in System.IO.Directory.GetDirectories(sDir))
        {
            ListBox1.Items.Add(System.IO.Path.GetDirectoryName(d));
            DirSearch(d);
        }
    }

但它没有得到目录名称。例如:"NewFolder1",得到:"D:\aaa\bbbb\cccc\dddd\NewFolder1"

我只有目录名称。

【问题讨论】:

  • @Andrei,为此 OP 必须使用DirectoryInfo 类,目前Directory.GetDirectories 将返回一个string[],它将包含完整路径。

标签: c# asp.net


【解决方案1】:

这应该可行:

foreach (var d in System.IO.Directory.GetDirectories(@"C:\"))
        {
            var dir = new DirectoryInfo(d);
            var dirName = dir.Name;

            ListBox1.Items.Add(dirName);
        }

另外,你可以走捷径...

foreach (var d in System.IO.Directory.GetDirectories(@"C:\"))
        {
            var dirName = new DirectoryInfo(d).Name;
            ListBox1.Items.Add(dirName);
        }

我只是使用 C 的路由进行测试。

【讨论】:

    【解决方案2】:

    有一个简单的单行:

    Directory.GetDirectories(PathToFolder).Select(d => new DirectoryInfo(d).Name);
    

    【讨论】:

      【解决方案3】:

      当前您使用的是Directory.GetDirectories,它将返回一个string[],其中包含目录的完整路径。而是使用DirectoryInfo 类,稍后您可以使用属性DirectoryInfo.Name 获取目录的名称而不是完整路径,例如:

      void DirSearch(string sDir)
      {
          DirectoryInfo dirInfo = new DirectoryInfo(sDir);
          foreach (var d in dirInfo.GetDirectories("*", SearchOption.AllDirectories))
          {
              ListBox1.Items.Add(d.Name);
          }
      }
      

      您似乎也在尝试递归搜索所有子目录,您可以在代码中使用SearchOption.AllDirectories 来包含所有子目录。

      【讨论】:

        【解决方案4】:

        我们用小linq怎么样:

        ListBox1.Items.AddRange(System.IO.Directory.GetDirectories(@"C:\").Select(x => new DirectoryInfo(x).Name).ToArray());
        

        小菜一碟:D

        【讨论】:

          【解决方案5】:

          如果您不想创建有时会导致错误并引入额外开销的 DirectoryInfoFileInfo 类,您可以这样做:

          void DirSearch(string sDir)
          {
              foreach (var d in System.IO.Directory.GetDirectories(sDir))
              {
                  ListBox1.Items.Add(d.TrimEnd(Path.DirectorySeparatorChar).Split(Path.DirectorySeparatorChar).Last());
                  DirSearch(d);
              }
          }
          

          它也快一点,具体取决于您要搜索的目录的数量和大小......

          如果你不需要它是跨平台的/总能保证文件系统有斜线分隔符,你可以让它“更短”一些/不那么冗长。

          void DirSearch(string sDir)
          {
              foreach (var d in System.IO.Directory.GetDirectories(sDir))
              {
                  ListBox1.Items.Add(d.TrimEnd('\\').Split('\\').Last());
                  DirSearch(d);
              }
          }
          

          【讨论】:

            【解决方案6】:

            但它没有得到目录名称。例如:“NewFolder1”,获取:“D:\aaa\bbbb\cccc\dddd\NewFolder1”。

            GetDirectoryName 返回目录的完整路径(它也可用于文件),但您只需要最后一部分,所以在您的示例中是 NewFolder1

            你可以使用DirectoryInfo.Name

            string dir = @"D:\aaa\bbbb\cccc\dddd\NewFolder1";
            DirectoryInfo dirInfo = new DirectoryInfo(dir);
            string nameOfDirOnly = dirInfo.Name; // NewFolder1
            
            ListBox1.Items.Add(nameOfDirOnly);
            

            【讨论】:

              【解决方案7】:

              这里有一些对你有用的东西......

                  public IEnumerable<string> GetDirInfoFast(string dir, string pattern)
                  {
                      //you should put try catch here....
                      var di = new DirectoryInfo(dir);
                      var list = new List<string>();
                      //put in the pattern
                      var dirs = di.GetDirectories(pattern);
                      Parallel.ForEach(dirs, p => {
                          list.Add(p.Name);
                      });
                      return list;
                  }
              

              【讨论】:

              • Parallel.ForEach is not always faster。您还应该提及为什么这可以解决 OP 的问题。
              • 你说得好。然而,当我设计任何东西时,我总是想将一些东西放入可重用的库中,上面的模式很好,但我承认当有数千个目录时它会好得多。我昨天回答了一个问题,其中 OP 使用这种模式将处理减少了 4 倍。
              • 另外,我也是 LINQ 的粉丝。我尝试写这些类型的答案来向人们介绍 LINQ,因为它很棒!
              【解决方案8】:

              这也适用于我:

              var directoryName = Path.GetFileName(directoryPath);
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2010-09-06
                • 1970-01-01
                • 2014-07-26
                • 1970-01-01
                • 1970-01-01
                • 2011-12-08
                相关资源
                最近更新 更多