Здравствуйте.
пишу на 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 -- т.е. юникод символ заменен на "?"
что же не так?
Как же все-таки переименовать этот файл? всю голову уже сломал(
Помогите, кто сможет.