Другим подходом было бы использовать регулярное выражение, которое вы должны проверить ваши данные, а затем использовать более определенное регулярное выражение, предназначенное для каждого элемента, который вы хотите извлечь, используя итератор соответствия.
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
Примечание: этот ответ несколько быстрый и грязный, и не во всех случаях. Если вас это устраивает, читайте дальше. Если нет, рассмотрите возможность использования одного из других вариантов.
Вы можете использовать для этого старый добрый mkdir. Просто запустите
system("mkdir " + strPath);
и все готово.
Ну, почти. Есть еще случаи, о которых вам нужно позаботиться, например, сетевые ресурсы (которые могут не работать) и обратная косая черта. Но при использовании относительно безопасных путей вы можете использовать эту более короткую форму.
Еще одна вещь, которая может оказаться полезной для избавления от возможных неприятностей, - это _fullpath () , которая преобразует заданный путь в полный и чистый. Зная, что у вас чистый путь, у вас не должно возникнуть проблем с написанием довольно тривиальной рекурсивной функции, которая будет создавать папки одну за другой даже при работе с путями UNC.
С C++ 17, это может быть сделано довольно легко с помощью std::filesystem::create_directories()
.
Пример:
#include <filesystem>
...
const char* path = "C:\\foo\\bar";
std::filesystem::create_directories(path);
Из 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;
Это должно дать вам представление о том, как работать со строкой пути. Затем после этого все, что вам нужно сделать, это прокрутить пути, начиная с диска и заканчивая самой глубокой папкой. Проверьте, существует ли папка, и если нет, создайте ее.
Функция SHCreateDirectory может это сделать. Но в документе указано, что в более поздних версиях Windows она может стать устаревшей.
Из MSDN
Примечание. Эта функция доступно через службу Windows XP Пакет 2 (SP2) и Microsoft Windows Server 2003. Он может быть изменен или недоступно в последующих версиях Windows.
Если вам не нужна поддержка версий 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, указанную выше, чем-нибудь другим (возможно, ручным циклом).