Переименуйте файл в 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. Я почти уверен, что вы уже знали, но я включил его, если вы не знали.
Пока ваш файл не нужен сразу другой программе, вы можете использовать мое решение.
Когда вы переименуете файл, используйте заглавные буквы и удалите последнюю букву. Затем переименуйте снова и верните письмо.
:)