Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.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
在C#中枚举重分析点/连接时如何检测循环?_C#_.net - Fatal编程技术网

在C#中枚举重分析点/连接时如何检测循环?

在C#中枚举重分析点/连接时如何检测循环?,c#,.net,C#,.net,我正在使用目录.EnumerateFiles()枚举程序中的文件。枚举“应用程序数据””文件夹时出现问题(可从C:\Program Data\Application Data获得) EnumerateFiles()进入循环,因为“应用程序数据”文件夹中还有一个名为“应用程序数据”的快捷方式,并且在其中还有一个快捷方式,以此类推 经过几次迭代后,路径变得足够长,EnumerateFiles()将出现PathTooLongException 如何避免此循环并枚举剩余文件 代码: 编辑: 正如我发现的

我正在使用
目录.EnumerateFiles()
枚举程序中的文件。枚举“应用程序数据””文件夹时出现问题(可从C:\Program Data\Application Data获得)

EnumerateFiles()
进入循环,因为“应用程序数据”文件夹中还有一个名为“应用程序数据”的快捷方式,并且在其中还有一个快捷方式,以此类推

经过几次迭代后,路径变得足够长,
EnumerateFiles()
将出现
PathTooLongException

如何避免此循环并枚举剩余文件

代码:

编辑:
正如我发现的,我在这里所说的循环实际上被称为重分析点/连接。有时,这些点的目标具有此重分析点的副本,这会导致枚举过程中出现无休止的循环。

枚举文件有一个重载,您可以告诉它不要搜索子目录(第三个,searchOption参数):


即使在其文件夹/子文件夹中使用快捷方式(dir1快捷方式在dir1/dir快捷方式在it子文件夹中),我也能够获得没有任何问题的数据。以下是代码

static void Main(string[] args)
{
    string sourceDirectory = @"C:\dir1";
    string archiveDirectory = @"C:\dir2";

    try
    {
        var txtFiles = Directory.EnumerateFiles(sourceDirectory, "*.txt", SearchOption.AllDirectories);

        foreach (string currentFile in txtFiles)
        {
            string fileName = currentFile.Split("\\".ToCharArray()).Last();
            Directory.Move(currentFile, Path.Combine(archiveDirectory, fileName));
        }
    }
    catch (Exception e)
    {
        Console.WriteLine(e.Message);
    }
}

您可以共享您的代码吗?@Janupienaar:我不能忽略所有应用程序数据文件夹,因为用户可以创建自己的应用程序数据文件夹,该文件夹应正确枚举。请共享您的实际代码当它抛出
PathTooLongException
时的确切路径是什么?如果目录实际上是一个符号链接或连接;如果是,请停止枚举其子项。或者,更详细地说,检查您是否已经看到了它的“目标路径”,如果看到了,请停止。IIRC,不搜索子目录是默认行为-即
SearchOption。TopDirectoryOnly
是有效的默认问题。问题不在于搜索条件本身,而在于在哪里停止枚举,因为存在循环。即使使用
SearchOption.TopDirectoryOnly
逐个浏览目录,我仍然会遇到此问题。此外,该解决方案还必须适用于其他正常情况,用户可以使用相同的文件夹名称创建一些有效的层次结构,如C:\abc\abc\abc。请编辑您的问题,添加代码,以准确说明您是如何使用该方法的,谢谢。问题是您特别告诉它使用所有目录。将第三个参数更改为SearchOption.topDirectoryOnly或如果需要,下一个最佳选择可能是添加“if dir.Name!=”应用程序数据“if语句
static void Main(string[] args)
{
    string sourceDirectory = @"C:\dir1";
    string archiveDirectory = @"C:\dir2";

    try
    {
        var txtFiles = Directory.EnumerateFiles(sourceDirectory, "*.txt", SearchOption.AllDirectories);

        foreach (string currentFile in txtFiles)
        {
            string fileName = currentFile.Split("\\".ToCharArray()).Last();
            Directory.Move(currentFile, Path.Combine(archiveDirectory, fileName));
        }
    }
    catch (Exception e)
    {
        Console.WriteLine(e.Message);
    }
}