Используя дополнительные методы C# от управляемого С++ / CLI

К сожалению, стандарт C++ не определяет стандартный способ работать с файлами и папками таким образом.

С тех пор нет никакого кросс-платформенного пути, лучший кросс-платформенный путь состоит в том, чтобы пользоваться библиотекой такой как модуль файловой системы повышения .

Кросс-платформенный метод повышения:

следующая функция, учитывая путь к каталогу и имя файла, рекурсивно ищет каталог и его подкаталоги для имени файла, возвращая bool, и, если успешный, путь к файлу, который был найден.

bool find_file(const path & dir_path,         // in this directory,
               const std::string & file_name, // search for this name,
               path & path_found)             // placing path here if found
{
    if (!exists(dir_path)) 
        return false;

    directory_iterator end_itr; // default construction yields past-the-end

    for (directory_iterator itr(dir_path); itr != end_itr; ++itr)
    {
        if (is_directory(itr->status()))
        {
            if (find_file(itr->path(), file_name, path_found)) 
                return true;
        }
        else if (itr->leaf() == file_name) // see below
        {
            path_found = itr->path();
            return true;
        }
    }
    return false;
}

Источник от страницы повышения упомянут выше.

Для основанных на Unix/Linux систем:

можно использовать opendir / readdir / closedir.

Пример кода, который ищет каталог запись ''имя'':

len = strlen(name);
dirp = opendir(".");
while ((dp = readdir(dirp)) != NULL)
        if (dp->d_namlen == len && !strcmp(dp->d_name, name)) {
                (void)closedir(dirp);
                return FOUND;
        }
(void)closedir(dirp);
return NOT_FOUND;

Исходный код из вышеупомянутых страниц справочника.

Для основанные на окнах системы:

можно использовать Win32 API FindFirstFile / FindNextFile / функции FindClose.

следующий пример C++ показывает Вам минимальное использование FindFirstFile.

#include 
#include 
#include 

void _tmain(int argc, TCHAR *argv[])
{
   WIN32_FIND_DATA FindFileData;
   HANDLE hFind;

   if( argc != 2 )
   {
      _tprintf(TEXT("Usage: %s [target_file]\n"), argv[0]);
      return;
   }

   _tprintf (TEXT("Target file is %s\n"), argv[1]);
   hFind = FindFirstFile(argv[1], &FindFileData);
   if (hFind == INVALID_HANDLE_VALUE) 
   {
      printf ("FindFirstFile failed (%d)\n", GetLastError());
      return;
   } 
   else 
   {
      _tprintf (TEXT("The first file found is %s\n"), 
                FindFileData.cFileName);
      FindClose(hFind);
   }
}

Исходный код от вышеупомянутых страниц MSDN.

10
задан Matt Davis 28 August 2009 в 22:23
поделиться

1 ответ

Вы должны просто вызвать его как статический метод:

IPAddressExtensions::GetSubnetMask(address);

Метод «расширения» - это скорее уловка компилятора, чем разница в CLR.

14
ответ дан 3 December 2019 в 23:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: