.net GetDirectory无法枚举名称为255的文件夹的子文件夹
我的应用程序是C 3.5,运行在Windows 7 Ultimate 64位上。它遍历所有文件夹子文件夹以执行其任务。但是,如果对名称仅为一个符号(255)的文件夹运行,则它会失败并落入无限循环,直到StackOverflow.com异常 要复制,可以执行以下操作: 运行Windows资源管理器在此文件夹中创建C:\Temp文件夹 创建新文件夹并使用数字键盘将其重命名为Alt-255 先创建子文件夹,然后再创建子文件夹 在临时文件夹下创建子文件夹1和2 所以你现在有: C:\1 C:\2 C:\\first C:\\秒 对于具有255个或更多255个符号的子文件夹的C:\Temp文件夹,请使用以下代码:.net GetDirectory无法枚举名称为255的文件夹的子文件夹,.net,file-io,special-characters,.net,File Io,Special Characters,我的应用程序是C 3.5,运行在Windows 7 Ultimate 64位上。它遍历所有文件夹子文件夹以执行其任务。但是,如果对名称仅为一个符号(255)的文件夹运行,则它会失败并落入无限循环,直到StackOverflow.com异常 要复制,可以执行以下操作: 运行Windows资源管理器在此文件夹中创建C:\Temp文件夹 创建新文件夹并使用数字键盘将其重命名为Alt-255 先创建子文件夹,然后再创建子文件夹 在临时文件夹下创建子文件夹1和2 所以你现在有: C:\1 C:\2 C:\
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:\Temp\
C:\Temp\1
C:\Temp\2
C:\Temp\
C:\Temp\1
C:\Temp\2
C:\Temp\
C:\Temp\1
C:\Temp\2
C:\Temp\
那么如何正确枚举此类文件夹子文件夹呢?Windows不完全支持ASCII字符255。为了直观起见,它将此字符转换为u字符 原因是什么? ASCII 255字符显示为不可见字符,但占用一个字符空间,因此,此字符与ASCII 32空格字符之间存在混淆。如果我没弄错的话,这个字符只适用于Windows 98及更低版本,包括所有DOS版本 编辑:Windows7现在对一些扩展字符进行了一些修复。如果在该操作系统上运行,则代码应得到良好处理 解决方案是什么? 不要将此字符用作文件和文件夹名称,因为您的程序 或 让程序在无限循环之前检查扩展字符并跳过它们(如果存在) 允许程序删除带有扩展字符的文件夹,但如果它连续循环,请放置一个代码,该代码将跳过该文件夹并移动到下一个文件夹项 您的代码应该与Vista和Windows 7配合使用,这是您的程序要求
Windows不完全支持ASCII字符255。为了直观起见,它将此字符转换为u字符 原因是什么? ASCII 255字符显示为不可见字符,但占用一个字符空间,因此,此字符与ASCII 32空格字符之间存在混淆。如果我没弄错的话,这个字符只适用于Windows 98及更低版本,包括所有DOS版本 编辑:Windows7现在对一些扩展字符进行了一些修复。如果在该操作系统上运行,则代码应得到良好处理 解决方案是什么? 不要将此字符用作文件和文件夹名称,因为您的程序 或 让程序在无限循环之前检查扩展字符并跳过它们(如果存在) 允许程序删除带有扩展字符的文件夹,但如果它连续循环,请放置一个代码,该代码将跳过该文件夹并移动到下一个文件夹项 您的代码应该与Vista和Windows 7配合使用,这是您的程序要求
你到底为什么有一个叫做u的文件夹?这根本不是描述性的。。文件夹的概念是,您可以在该文件夹中包含所有相关文件,并可能使用子文件夹对其进行更多分组;文件夹名称通常应该是描述性的——例如,许多网站都有一个名为css或样式表的文件夹。。我怀疑我需要解释一下它们的用途,因为它们是不言自明的。。一、 就个人而言,我想不出有哪种情况我会使用1个符号作为文件夹名。在我看来,最好坚持使用字母数字字符,很少使用符号。这样更安全,因为在任何操作系统上都不会遇到这种情况 你到底为什么有一个名为u的文件夹?这根本不是描述性的。。文件夹的概念是,您可以在该文件夹中包含所有相关文件,并可能使用子文件夹对其进行更多分组;文件夹名称通常应该是描述性的——例如,许多网站都有一个名为css或样式表的文件夹。。我怀疑我需要解释一下它们的用途,因为它们是不言自明的。。一、 就个人而言,我想不出有哪种情况我会使用1个符号作为文件夹名。在我看来,最好坚持使用字母数字字符,很少使用符号。这样更安全,因为在任何操作系统上都不会遇到这种情况 以下程序运行正常,不会导致堆栈溢出错误
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的目录
因此,我相信您的问题与您所展示的代码无关,事实上是您未向我们展示的某些代码中的其他部分
我在Windows7上运行VS2010Express,目标是.NET3.5
现在,您的更新显示了所有代码,我可以看到发生了什么。net代码可能正在修剪目录,因此文件夹将被删除
第二个空白区域丢失了
因此@C:\Temp\被修剪为@C:\Temp\
我发现以下琐碎的修改避免了无限循环:
TraverseFolders(subFolder+@"\");
添加尾随路径分隔符将停止调用DirectoryInfo时出现的修剪。在上面的示例中,这意味着@C:\Temp\\s被传递给DirectoryInfo,从而产生预期的结果
我想您可能应该使用一个例程,该例程只在没有尾随路径分隔符的情况下添加尾随路径分隔符。您可能希望避免硬编码@\as路径分隔符,但现在您已经知道问题的根本原因,您需要解决这个问题。以下程序运行良好,不会导致堆栈溢出错误
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的目录
因此,我相信您的问题与您所展示的代码无关,事实上是您未向我们展示的某些代码中的其他部分
我在Windows7上运行VS2010Express,目标是.NET3.5
现在,您的更新显示了所有代码,我可以看到发生了什么。net代码可能正在修剪目录,因此带有空白的文件夹将丢失
因此@C:\Temp\被修剪为@C:\Temp\
我发现以下琐碎的修改避免了无限循环:
TraverseFolders(subFolder+@"\");
添加尾随路径分隔符将停止调用DirectoryInfo时出现的修剪。在上面的示例中,这意味着@C:\Temp\\s被传递给DirectoryInfo,从而产生预期的结果
我想您可能应该使用一个例程,该例程只在没有尾随路径分隔符的情况下添加尾随路径分隔符。您可能希望避免将@\as路径分隔符硬编码,但现在您知道问题的根本原因后,就需要解决这个问题。谢谢您的回答,但不幸的是,我无法阻止我的程序用户避免使用此字符。我正在寻找一种方法来列举这样的文件夹内容。例如,Windows资源管理器本身、FAR和其他工具完美地显示了此类文件夹的内容,那么为什么.NET Framework不这样做呢?这似乎有点奇怪,而不是我观察到的。您正在运行Windows 98或某些非Unicode版本的Windows。在我的Windows 7安装中,我没有看到任何uu。Vista和Windows 7已经用扩展字符解决了这一问题和其他一些问题,现在可以处理这些问题。因此,理论上,代码应该可以在这些系统上运行。感谢你的回答-似乎David的解决方案只需添加斜杠就可以了。谢谢你的回答,然而不幸的是,我不能阻止我的程序的用户避免这个字符。我正在寻找一种方法来列举这样的文件夹内容。例如,Windows资源管理器本身、FAR和其他工具完美地显示了此类文件夹的内容,那么为什么.NET Framework不这样做呢?这似乎有点奇怪,而不是我观察到的。您正在运行Windows 98或某些非Unicode版本的Windows。在我的Windows 7安装中,我没有看到任何uu。Vista和Windows 7已经修复了这个问题以及其他一些使用扩展字符的问题,现在可以从字面上处理它们,理论上是这样,代码应该可以在这些系统上运行。谢谢你的回答-似乎David的简单添加斜杠的解决方案有效。很抱歉,这不是我问题的答案。我不需要关于如何使用文件系统的建议。我正在编写一个软件,该软件旨在枚举用户驱动器上的所有文件夹,即使他们想用名称中的特殊符号等技巧隐藏信息。而仅仅因为不喜欢文件夹名称而导致应用程序崩溃是不可接受的。这不是由应用程序来决定用户如何命名他的文件夹。好吧,如果你在最初的问题中解释了这一点,那么我就不会发布了。因此,我不认为我的答案是公平的,因为有一些信息我不知道。据我所知,它可能是一个网站,在这种情况下,你可以控制文件夹名称。请再次投票给我的帖子…好的,当系统允许的时候就可以了。这不能再投票给同一个答案了。我记得在你投票之前我必须编辑它。现在应该可以了。顺便说一句,这并不意味着有任何冒犯-对我来说,如何命名文件夹是显而易见的,我错误地认为这是一个你可以控制文件夹的应用程序。很抱歉,这不是我问题的答案。我不需要关于如何使用文件系统的建议。我正在编写一个软件,该软件旨在枚举用户驱动器上的所有文件夹,即使他们想用名称中的特殊符号等技巧隐藏信息。而仅仅因为不喜欢文件夹名称而导致应用程序崩溃是不可接受的。这不是由应用程序来决定用户如何命名他的文件夹。好吧,如果你在最初的问题中解释了这一点,那么我就不会发布了。因此,我不这样认为
I don’我认为投票是公平的,因为有些信息我不知道。据我所知,它可能是一个网站,在这种情况下,你可以控制文件夹名称。请再次投票给我的帖子…好的,当系统允许的时候就可以了。这不能再投票给同一个答案了。我记得在你投票之前我必须编辑它。现在应该可以了。顺便说一句,这并不意味着冒犯——对我来说,如何命名文件夹是显而易见的,我错误地认为这是一个你可以控制文件夹的应用程序。你以后可能会遇到的另一个问题是某种递归链接。使用硬链接、符号链接、连接、重分析点……我建议您发布完整的代码,或者发布一个演示问题的精简版本,看看是否有其他人可以复制它。您所描述的似乎不可信。@David,它是否正确地给出了所有子文件夹?对我来说,它给了我与pathToTraverse相同的子文件夹。@CodeInChaos,是的,但幸运的是有FileAttributes.ReparsePoint属性可用。我相信在Windows 7和Vista上运行该代码会使它正常工作。你以后可能会遇到的另一个问题是某种递归链接。使用硬链接、符号链接、连接、重分析点……我建议您发布完整的代码,或者发布一个演示问题的精简版本,看看是否有其他人可以复制它。您所描述的似乎不可信。@David,它是否正确地给出了所有子文件夹?对我来说,它给了我与pathToTraverse相同的子文件夹。@CodeInChaos,是的,但幸运的是有FileAttributes.ReparsePoint属性可用。我相信在Windows 7和Vista上运行该代码会使其正常工作。请参阅我的代码和上面更新的解释。255文件夹本身显示良好,但尝试枚举其内容会导致无限循环。请尝试在Vista和Windows 7上运行该程序。我想他们已经解决了ASCII和ANSI标准的一些问题。@Alex我已经解决了您的问题,并将其包含在答案的更新中。谢谢,David,这很有效。嗯,我总是可以使用PATH.DistRyDealTeaTracar来避免硬编码。而且BTW对我来说很奇怪。NET假设255是空白符号-看起来像一个bug。请看上面的代码和更新的解释。255文件夹本身显示良好,但尝试枚举其内容会导致无限循环。请尝试在Vista和Windows 7上运行该程序。我想他们已经解决了ASCII和ANSI标准的一些问题。@Alex我已经解决了您的问题,并将其包含在答案的更新中。谢谢,David,这很有效。嗯,我总是可以使用PATH.DistRyTealAtdiar来避免硬编码。而且BTW对我来说很奇怪。NET假设255是空白符号-看起来像是一个bug。