GetDirectories 无法枚举名称为 #255 的文件夹的子文件夹

2023-12-09

我的应用程序是 C# 3.5,在 64 位 Windows 7 Ultimate 上运行。它会遍历所有文件夹子文件夹来执行其工作。然而,如果针对名称只有一个符号(#255)的文件夹运行,它会失败(陷入无限循环,直到 StackOverflow.com 异常)。

要重现,您可以执行以下操作:

  1. 运行 Windows 资源管理器在此文件夹中创建 C:\Temp 文件夹
  2. 创建新文件夹并使用 Alt-255 重命名(使用数字键盘)
  3. 在那里创建子文件夹“第一”和“第二”
  4. 在 Temp 下创建子文件夹“1”和“2”

所以你现在有:

  • C:\1
  • C:\2
  • C:\ \第一
  • C:\ \第二个

对于这样的 C:\Temp 文件夹,其子文件夹名称为 #255(或更多 #255 符号),代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

class Program
{
  public static string[] GetDirectories(string pathToTraverse)
  {
    List<string> result = new List<string>();

    foreach (DirectoryInfo subFolder in new DirectoryInfo(pathToTraverse).GetDirectories())
    {
      result.Add(subFolder.FullName);
    }
    return result.ToArray();
  }

  public static void TraverseFolders(string folderToTraverse)
  {
    foreach (string subFolder in GetDirectories(folderToTraverse))
    {
      Console.WriteLine(subFolder);

      TraverseFolders(subFolder);
    }
  }

  static void Main(string[] args)
  {
    TraverseFolders(@"C:\Temp");
  }
}

永远不会结束,会给你这样的结果:

C:\温度\
C:\Temp\1
C:\Temp\2
C:\温度\
C:\Temp\1
C:\Temp\2
C:\温度\
C:\Temp\1
C:\Temp\2
C:\温度\

那么如何正确枚举此类文件夹子文件夹呢?


以下程序运行完美,不会导致堆栈溢出错误。

using System;
using System.Text;
using System.IO;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string pathToTraverse = @"C:\Desktop";
            foreach (DirectoryInfo subFolder in new DirectoryInfo(pathToTraverse).GetDirectories())
            {
                System.Console.WriteLine(subFolder);
            }
        }
    }
}

它产生以下输出:

chaff
Python
__history
 
ÿ

倒数第二个看似空白的行实际上是名为 Alt+255 的目录。

因此,我相信您的问题与您所显示的代码无关,实际上是在您尚未向我们提供的某些代码的其他地方。

我在 Windows 7 上运行,VS 2010 Express 面向 .net 3.5。


现在您的更新显示了所有代码,我可以看到发生了什么。 .net 代码可能正在修剪目录,因此带有空格的文件夹会丢失。

So @"C:\Temp\ "被修剪为@"C:\Temp\".

我发现以下简单的修改避免了无限循环:

TraverseFolders(subFolder+@"\");

添加尾部路径分隔符会停止对 DirectoryInfo 的调用中出现的修剪。在上面的例子中,这意味着@"C:\Temp\ \"被传递给 DirectoryInfo,它会产生预期的结果。

我想您可能应该使用一个例程,仅添加尾随路径分隔符(如果尚不存在)。您可能希望避免将 @"\" 硬编码为路径分隔符,但现在您知道问题的根本原因是什么,就需要解决这个问题了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GetDirectories 无法枚举名称为 #255 的文件夹的子文件夹 的相关文章

随机推荐