C# 循环浏览所有系统文件&;使用C++;CLI

C# 循环浏览所有系统文件&;使用C++;CLI,c#,.net,filesystems,c++-cli,C#,.net,Filesystems,C++ Cli,我发现C#代码可以在我们指定的任何目录中循环,我尝试将其转换为C++/CLI,并使其在所有系统文件和文件夹中循环。问题是代码让你确定需要扫描的深度级别!我需要的是让它循环所有文件和文件夹,而不管深度如何。。。这就是我所做的。。。有一些例外 #include "stdafx.h" using namespace System; using namespace System::IO; ref class Scan { public: static int MaxPat

我发现C#代码可以在我们指定的任何目录中循环,我尝试将其转换为C++/CLI,并使其在所有系统文件和文件夹中循环。问题是代码让你确定需要扫描的深度级别!我需要的是让它循环所有文件和文件夹,而不管深度如何。。。这就是我所做的。。。有一些例外

#include "stdafx.h"

using namespace System;
using namespace System::IO;

ref class Scan {
public:
    static int MaxPath=260000000;

    static void ScanMyDir( String^ SourceDir,int RecursiveLevel) {
        if(RecursiveLevel<=MaxPath) {
            array <String^> ^fileEntries = Directory::GetFiles(SourceDir);
            for each (String^ fileName in fileEntries) {
                Console::WriteLine(fileName);
            }
        }
        array<String^> ^SubDirEntries = Directory::GetDirectories(SourceDir);
        for each (String^ subdir in SubDirEntries)
            if ((File::GetAttributes(subdir) & FileAttributes::ReparsePoint)!= FileAttributes::ReparsePoint)
                ScanMyDir(subdir,RecursiveLevel+1);
    }
};

int main(array<System::String ^> ^args) {
    Scan::ScanMyDir("c://",1);
    Console::Read();
    return 0;
}
#包括“stdafx.h”
使用名称空间系统;
使用名称空间系统::IO;
参考类扫描{
公众:
静态int MaxPath=260000000;
静态void ScanMyDir(字符串^SourceDir,int RecursiveLevel){

如果(RecursiveLevel如果你删除了代码中的RecursiveLevel部分,你应该得到你想要的。你提到了3个例外,但我看不到任何东西澄清它们是什么

static void ScanMyDir( String^ SourceDir)
{
array <String^> ^fileEntries = Directory::GetFiles(SourceDir);
for each  (String^ fileName in fileEntries)
{
Console::WriteLine(fileName);
}
array<String^> ^SubDirEntries = Directory::GetDirectories(SourceDir);
for each (String^ subdir in SubDirEntries)
if ((File::GetAttributes(subdir) & FileAttributes::ReparsePoint)!= FileAttributes::ReparsePoint)
            ScanMyDir(subdir);
}
};
static void ScanMyDir(字符串^SourceDir)
{
数组^fileEntries=Directory::GetFiles(SourceDir);
对于每个(文件项中的字符串^fileName)
{
控制台::WriteLine(文件名);
}
数组^SubDirEntries=Directory::GetDirectories(SourceDir);
对于每个(子目录中的字符串^subdir)
if((File::GetAttributes(subdir)&FileAttributes::ReparsePoint)!=FileAttributes::ReparsePoint)
ScanMyDir(subdir);
}
};

出于对所有神圣事物的热爱,请不要使用递归。
我回答。到C++/CLI的转换是直接进行的。如果您不想这样做,请将其编译到自己的程序集中(并可以选择将其合并到您的程序集中)。

有一个问题mscorlib.dll中发生“System.UnauthorizedAccessException”类型的未处理异常。其他信息:对路径“c:\found.000”的访问被拒绝。"此外,代码如何管理循环结束!何时停止!错误捕获始终是一个好主意,一些文件夹(如受保护的文件夹)因此,您要做的是在调用ScanMyDir时重试,如果失败,您希望它尝试下一次。至于如何停止,它在文件和目录用完时停止,这是您想要的ed(或者至少我是这样理解的)我不太熟悉如何处理错误捕获和异常。如果你能分享你的知识来解决这个问题,我将非常高兴{ScanMyDir(subdir);}catch{//添加有用的代码来显示不可读的目录等}如果你这样做,如果对那个目录的调用将继续,但我使用C++ CLI…我的意思是,我知道当我们抛出C++ CLI异常时需要一个句柄。我尝试了你建议的“尝试\ catch”块,但是它显示了很多错误。.Recursion优雅地解决了树递归问题。通过比较代码大小很容易看出。无论如何,这不是他的问题。现代文件系统不是树,它们是有向图,可能有循环。正确的代码显然是不平凡的。Hans,你编写递归代码,我会给你发送一个磁盘,让它崩溃,而不会让我的崩溃.愿意打赌吗?
static void ScanMyDir( String^ SourceDir)
{
array <String^> ^fileEntries = Directory::GetFiles(SourceDir);
for each  (String^ fileName in fileEntries)
{
Console::WriteLine(fileName);
}
array<String^> ^SubDirEntries = Directory::GetDirectories(SourceDir);
for each (String^ subdir in SubDirEntries)
if ((File::GetAttributes(subdir) & FileAttributes::ReparsePoint)!= FileAttributes::ReparsePoint)
            ScanMyDir(subdir);
}
};