【问题标题】:Looping through all system files & folders using C++ CLI使用 C++ CLI 遍历所有系统文件和文件夹
【发布时间】:2011-04-04 10:28:59
【问题描述】:

我发现 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;
}

经过一些修改(还是有一些错误):

using namespace System;
using namespace System::IO;

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);
}

int main(array<System::String ^> ^args) {
    try {
        ScanMyDir("C://Windows"); 
    }
    catch {
        Console::WriteLine("Some Denied files or Folders");
    }
    return 0;
}

这些是错误:

错误 1 ​​错误 C2059:语法错误:'{' c:\Users\Ahmed\documents\visual studio 2010\Projects\eeee\eeee\eeee.cpp 31

错误 6 错误 C2059:语法错误:'}' c:\Users\Ahmed\documents\visual studio 2010\Projects\eeee\eeee\eeee.cpp 37

错误 8 错误 C2059:语法错误:'}' c:\Users\Ahmed\documents\visual studio 2010\Projects\eeee\eeee\eeee.cpp 37

错误 5 错误 C2059:语法错误:'return' c:\Users\Ahmed\documents\visual studio 2010\Projects\eeee\eeee\eeee.cpp 36

错误 4 错误 C2061:语法错误:标识符 'WriteLine' c:\Users\Ahmed\documents\visual studio 2010\Projects\eeee\eeee\eeee.cpp 32

错误 7 错误 C2143:语法错误:缺少 ';'在'}'之前 c:\Users\Ahmed\documents\visual studio 2010\Projects\eeee\eeee\eeee.cpp 37

错误 2 错误 C2309:catch 处理程序需要带括号的异常声明 c:\Users\Ahmed\documents\visual studio 2010\Projects\eeee\eeee\eeee.cpp 31

错误 3 错误 C2319:'catch' 必须后跟复合语句。缺少'{' c:\Users\Ahmed\documents\visual studio 2010\Projects\eeee\eeee\eeee.cpp 32

【问题讨论】:

    标签: c# .net filesystems c++-cli


    【解决方案1】:

    如果您删除该代码的递归级别部分,您应该得到您想要的。您提到了 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);
    }
    };
    

    【讨论】:

    • 出现“在 mscorlib.dll 中发生类型为 'System.UnauthorizedAccessException' 的未处理异常附加信息:对路径 'c:\found.000\' 的访问被拒绝”的问题。以及代码如何管理循环的结束!什么时候停止!
    • 错误捕获总是一个好主意,像这样的一些文件夹是受保护的,所以你要做的是尝试调用 ScanMyDir,如果失败,你希望它尝试下一个.至于它是如何停止的,它会在文件和目录用完时停止,这就是你想要的(或者至少我是这么读的)
    • 我不太熟悉如何处理错误捕获和异常。如果你能分享你的知识来解决问题,我会很高兴
    • 尝试 { ScanMyDir(subdir); } catch { // 添加有用的代码来显示不可读的目录等} 如果你这样做,如果对该目录的调用失败,它将继续
    • 但是我正在使用 C++ CLI ...我的意思是我知道在抛出 C++ CLI 异常时我们需要一个句柄。我尝试了您建议的“try\catch”块,但它显示了很多错误! (语法)。
    【解决方案2】:

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

    【讨论】:

    • 递归优雅地解决了树递归问题。通过比较代码大小很容易看到。反正这不是他的问题。
    • 现代文件系统不是树,它们是有向图,可能带有循环。正确的代码绝对不是微不足道的。
    • 汉斯,你写你的递归代码,我会给你一个磁盘,它不会让我崩溃。愿意下注吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-26
    • 1970-01-01
    相关资源
    最近更新 更多