Цикл всех системных файлов и папок с помощью C ++ CLI - PullRequest
0 голосов
/ 04 апреля 2011

Я обнаружил, что код 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 studio2010 \ 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: обработчик перехвата ожидал объявления исключения в скобках в скобках 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

Ответы [ 2 ]

2 голосов
/ 04 апреля 2011

Если вы удалите части этого кода на уровне рекурсии, у вас должно получиться то, что вы хотели. Вы упомянули 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);
}
};
0 голосов
/ 04 апреля 2011

Ради любви ко всему святому, пожалуйста, не используйте рекурсию. Я ответил на этот вопрос для C # здесь . Конвертация в C ++ / CLI проста. Если вы не хотите этого делать, скомпилируйте его в свою сборку (и, возможно, погрузите в свою).

...