Переименуйте файл в Win32, чтобы он назывался только с разницей в заглавных

Кто-нибудь знает чистое решение Win32 для переименования файла и только изменения его заглавных букв, которое не включает промежуточное переименование в другое имя или специальные привилегии (например, резервное копирование, восстановление).

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

4 ответа

Решение

Тестовая программа, которую я сделал с MoveFile API, кажется, работает. Так же как и rename команда в cmd.exe. Что вы пробовали и какую ошибку вы получаете?

Это не актуально, но дальнейшее тестирование показывает, что переименование длинного имени файла таким способом работает, но изменит короткое имя файла (чередуя ~1 а также ~2 например), кстати.

Просто используйте обычный API MoveFile. Этот вызов, вероятно, просто превращается в ZwSetInformationFile(..., FileRenameInformation,...). Документы для FILE_RENAME_INFORMATION утверждают, что вам необходим доступ DELETE, и файл не может быть заблокирован и т. Д., Но эти ограничения, вероятно, будут применяться и к другим решениям.

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

Если вы хотите перейти на нативный слой, вы можете создать файл с помощью NtCreateFile и InitializeObjectAttributes без OBJ_CASE_INSENSITIVE, или вы можете дополнить конец дополнительными пробелами (если вы дополняете дополнительными пробелами, файл не будет доступен из путей Win32 dos). Смотрите здесь: http://www.osronline.com/ddkx/kmarch/k109_66uq.htm. Я почти уверен, что вы уже знали, но я включил его, если вы не знали.

Пока ваш файл не нужен сразу другой программе, вы можете использовать мое решение.

Когда вы переименуете файл, используйте заглавные буквы и удалите последнюю букву. Затем переименуйте снова и верните письмо.

:)

Другие вопросы по тегам