|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Не могу переименовать файл в имени которого есть юникод-символ...
Здравствуйте.
пишу на Delphi 7 (вынужден. перейти на другую не могу) пытаюсь переименовать файл: Код:
if renamefile(fname1,fname2) then ShowMessage('Файл успешно переименован!') else ShowMessage('Ошибка! Вот ее код: '+IntToStr(GetLastError)); появляется код ошибки: 123. Все от того, что в имени файла есть юникод символы (национальные буквы которых нет в ASCII). когда читаю их в проге вместо этих букв показывает "?". Почитал, что в этом случае нужно использовать для манипуляций с файлами WinAPI функции с постфиксом W (unicode) т.к. в Delphi 7 используются вызовы WinAPI функций с постфиксом A - для ANSI. Также нельзя использовать обычный FindFirst, т.к. он имя файла тоже в ANSI отдает. нужно использовать FindFirstFileW() из WinAPI. в итоге написал следующее: Код:
var H: THandle; D: TWIN32FindDataW; StrDir,FileName,NewFileName: widestring; aDir: string; begin aDir:='D:\BagName'; // в этой папке лежит единственный файл с юникод-символом в имени. StrDir := IncludeTrailingBackslash(aDir); // просто добавляем "\" если нужно H:= FindFirstFileW(pwidechar(StrDir+'*.*'),D); repeat if (H<>INVALID_HANDLE_VALUE) and (D.cFileName <> widestring('.')) and(D.cFileName<>widestring('..')) then begin FileName:=d.cFileName; // тут уже должно быть Исходное имя в Юникоде, ведь используется TWIN32FindDataW NewFileName:=aDir+'test.mp3'; // переименовать нужно просто в test.mp3 if MoveFileW(PWideChar(FileName),PWideChar(NewFileName)) then begin ShowMessage('Файл перемещен!') end else begin ShowMessage('Ошибка: '+IntToStr(GetLastError)+' '+SysErrorMessage(GetLastError)); end; end; until not FindNextFileW(H,D); Windows.FindClose(H); Результат выполнения ---> "ошибка 2: Не удается найти указанный файл!" а все потому, что не смотря на все манипуляции --- имя файла в d.cFileName - все равно почему-то в ANSI -- т.е. юникод символ заменен на "?" что же не так? Как же все-таки переименовать этот файл? всю голову уже сломал( Помогите, кто сможет. |
#2
|
|||
|
|||
Неужели никто ничего не знает? Даже мыслей никаких на этот счет нет?..
или в этом разделе (а может и форуме) нет компетентных людей, тут отвечают только на вопросы типа - как поменять цвет метки?.. |
#3
|
||||
|
||||
Вы переименовываете файл с указанием только его имени, без указания пути до фала. Поэтому найти его функция и не может.
Код:
... repeat if (H<>INVALID_HANDLE_VALUE) and (D.cFileName <> widestring('.')) and(D.cFileName<>widestring('..')) then begin NewFileName:= StrDir+'test.txt'; if MoveFileW(PWideChar(StrDir + d.cFileName), PWideChar(NewFileName)) then begin ShowMessage('OK!') end else begin ShowMessage('Error: '+ GetLastError+ d.cFileName+ ' '+SysErrorMessage(GetLastError)); end; end; until not FindNextFileW(H,D); ... Грамотно поставленный вопрос содержит не менее 50% ответа. Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть. |
#4
|
|||
|
|||
Цитата:
Спасибо Вам, добрый человек! Все так! Вопрос решен! Тема закрыта. p.s. целые сутки убил из-за своей невнимательности... (( |