Цель состоит в том, чтобы кодировать утилиту на C ++, используя функцию:
BOOL WINAPI CreateDirectoryW(_In_ LPCTSTR lpPathName, _In_opt_LPSECURITY_ATTRIBUTES lpSecurityAttributes)
Единственная успешная попытка, обнаруженная до сих пор, Perl скрипт, но получать что работать это другой вопрос. Этот скрипт пробует префикс
my $path = '\\\\?\\'
но в других местах было замечено, что использование «\\? \ UNC \» более надежно.
Любые блоки кода будут приветствоваться.
Изменить: Кроме того, как указано в оригинальном заголовке вопроса, проблема заключается в перемещении папки в другое место (кроме относительного пути). Может ли этот путь быть перемещен с MoveFileEx?
Следующее из документации MSDN на Функция CreateDirectory.
Существует ограничение размера строки по умолчанию для путей длиной 248 символов. Это ограничение связано с тем, как функция CreateDirectory анализирует пути.
Чтобы расширить это ограничение до 32 767 широких символов, вызовите версию функции Unicode и добавьте «\? \» К пути. Для получения дополнительной информации см. Наименование файла.
Обратите внимание, что в C ++, как и в Perl, необходимо экранировать символы \ в исходном коде, если вы не используете необработанные строковые литералы. Таким образом, это будет
«\\? \» в исходном коде.
Вот быстрый пример того, как это сделать.
BOOL CreatDirWithVeryLongName()
{
BOOL ret = ::CreateDirectoryW(L"\\\\?\\C:\\This is an example directory that has an extreemly long name that is more than 248 characters in length to serve as an example of how to go beyond the normal limit - Note that you will not be able to see it in Windows Explorer due to the fact that it is limited to displaying files with fewer than 260 characters in the name", NULL);
return ret;
}
это создает и удаляет вложенные длинные пути, но не перемещает их.
Перемещение по существу подразумевает создание нового дерева, в котором основная проблема кодирования связана с путями, которые имеют разные разрешения или атрибуты.