Как я рекурсивно создаю папку в Win32?

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

import re
s = '''Lun: 0 1 2 3 295 296 297 298'''
lun_validate_regex = re.compile(r'Lun:\s*((\d+)(\s\d+)*)')
match = lun_validate_regex.match(s)
if match:
    token_regex = re.compile(r"\d{1,3}")
    match_iterator = token_regex.finditer(match.group(1))
    for token_match in match_iterator:
        #do something brilliant
33
задан pauldoo 7 October 2009 в 10:28
поделиться

5 ответов

Примечание: этот ответ несколько быстрый и грязный, и не во всех случаях. Если вас это устраивает, читайте дальше. Если нет, рассмотрите возможность использования одного из других вариантов.


Вы можете использовать для этого старый добрый mkdir. Просто запустите

system("mkdir " + strPath);

и все готово.

Ну, почти. Есть еще случаи, о которых вам нужно позаботиться, например, сетевые ресурсы (которые могут не работать) и обратная косая черта. Но при использовании относительно безопасных путей вы можете использовать эту более короткую форму.

Еще одна вещь, которая может оказаться полезной для избавления от возможных неприятностей, - это _fullpath () , которая преобразует заданный путь в полный и чистый. Зная, что у вас чистый путь, у вас не должно возникнуть проблем с написанием довольно тривиальной рекурсивной функции, которая будет создавать папки одну за другой даже при работе с путями UNC.

-12
ответ дан 27 November 2019 в 07:05
поделиться

С C++ 17, это может быть сделано довольно легко с помощью std::filesystem::create_directories() .

Пример:

#include <filesystem>
...

const char* path = "C:\\foo\\bar";
std::filesystem::create_directories(path);
1
ответ дан 27 November 2019 в 07:05
поделиться

Из http://www.cplusplus.com/reference/string/string/find_last_of/ :

// string::find_last_of
#include <iostream>
#include <string>
using namespace std;

void SplitFilename (const string& str)
{
  size_t found;
  cout << "Splitting: " << str << endl;
  found=str.find_last_of("/\\");
  cout << " folder: " << str.substr(0,found) << endl;
  cout << " file: " << str.substr(found+1) << endl;
}

int main ()
{
  string str1 ("/usr/bin/man");
  string str2 ("c:\\windows\\winhelp.exe");

  SplitFilename (str1);
  SplitFilename (str2);

  return 0;

Это должно дать вам представление о том, как работать со строкой пути. Затем после этого все, что вам нужно сделать, это прокрутить пути, начиная с диска и заканчивая самой глубокой папкой. Проверьте, существует ли папка, и если нет, создайте ее.

-1
ответ дан 27 November 2019 в 07:05
поделиться

Функция SHCreateDirectory может это сделать. Но в документе указано, что в более поздних версиях Windows она может стать устаревшей.

Из MSDN

Примечание. Эта функция доступно через службу Windows XP Пакет 2 (SP2) и Microsoft Windows Server 2003. Он может быть изменен или недоступно в последующих версиях Windows.

5
ответ дан 27 November 2019 в 07:05
поделиться

Если вам не нужна поддержка версий Windows до Windows 2000, вы можете использовать для этого функцию SHCreateDirectoryEx . Учтите следующее:

int createDirectoryRecursively( LPCTSTR path )
{
    return SHCreateDirectoryEx( NULL, path, NULL );
}

// ...
if ( createDirectoryRecursively( T("C:\\Foo\\Bar\\Baz") ) == ERROR_SUCCESS ) {
   // Bingo!
} 

В случае, если использование такого API shell32.dll когда-либо станет проблемой, вы всегда можете повторно реализовать функцию createDirectoryRecursively, указанную выше, чем-нибудь другим (возможно, ручным циклом).

48
ответ дан 27 November 2019 в 07:05
поделиться
Другие вопросы по тегам:

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