我的应用程序是 C# 3.5,在 64 位 Windows 7 Ultimate 上运行。它会遍历所有文件夹子文件夹来执行其工作。然而,如果针对名称只有一个符号(#255)的文件夹运行,它会失败(陷入无限循环,直到 StackOverflow.com 异常)。
要重现,您可以执行以下操作:
- 运行 Windows 资源管理器在此文件夹中创建 C:\Temp 文件夹
- 创建新文件夹并使用 Alt-255 重命名(使用数字键盘)
- 在那里创建子文件夹“第一”和“第二”
- 在 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(使用前将#替换为@)