Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net GetDirectory无法枚举名称为255的文件夹的子文件夹_.net_File Io_Special Characters - Fatal编程技术网

.net GetDirectory无法枚举名称为255的文件夹的子文件夹

.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:\

我的应用程序是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文件夹,请使用以下代码:

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。