Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Файловая система
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 21.11.2013, 07:42
mrpit mrpit вне форума
Прохожий
 
Регистрация: 21.11.2013
Сообщения: 2
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию переименование файла в имени которого есть иерголифы

Здравствуйте, уважаемые форумчане!
Обращаюсь к вам за помощью, очень надеюсь на то, что поможете решить проблему.

Задача: Есть файлы, в именах которые присутствуют левые символы неправильной кодировки. Половина символов - русские буквы, но с ними вроде не возникает проблема, а есть один символ "─" (тире длинное). Вот когда это тире присутствует в файле, программа не может его переименовать и выдает ошибку: "Не удается найти указанный файл".

Код которым переименовываю:
Код:
  procedure TForm1.Button3Click(Sender: TObject);
  var path, filename: String;
  begin
  path := 'D:\test\';
  filename := '00000.XML_─шЁхъ_юЁ';
 
  if not(RenameFile(path+filename, path+'1.txt')) then
  showMessage(SysErrorMessage(GetLastError));
  end;

Если убираю это тире то нормально переименовывает. Пробовал UTF8Decode:
Код:
RenameFile(UTF8Decode(path+filename), UTF8Decode(path+'1.txt'))
всё равно не помогает.

Помогите, пожалуйста, советом. Погуглить пытался ничего не нашел, может плохо искал, конечно.
Заранее спасибо!
Ответить с цитированием
  #2  
Старый 21.11.2013, 09:57
Аватар для Decoding
Decoding Decoding вне форума
Местный
 
Регистрация: 03.06.2006
Адрес: Почту найдете на моем сайте
Сообщения: 576
Версия Delphi: D10.2
Репутация: 214
По умолчанию

Цитата:
Сообщение от mrpit
Код которым переименовываю:
Код:
  procedure TForm1.Button3Click(Sender: TObject);
  var path, filename: String;
  begin
  path := 'D:\test\';
  filename := '00000.XML_─шЁхъ_юЁ';
 
  if not(RenameFile(path+filename, path+'1.txt')) then
  showMessage(SysErrorMessage(GetLastError));
  end;

Код работоспособный, проверил в XE (Win7 x64).

Как альтернативу, могу предложить такой вариант

Код:
function AddAccentToFilename( Path, OldName, NewName: WideString ): Boolean;
begin
   Result := MoveFileW( Pointer( Path + OldName ), Pointer( Path + NewName ) );
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
   if not AddAccentToFilename( 'D:\test\', '00000.XML_─шЁхъ_юЁ', '1.txt' ) then
      ShowMessage( SysErrorMessage( GetLastError ) );
end;
Ответить с цитированием
  #3  
Старый 21.11.2013, 12:31
mrpit mrpit вне форума
Прохожий
 
Регистрация: 21.11.2013
Сообщения: 2
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Да код работоспособный, но проблема именно с файлом если есть иероглиф. Причем если просто русские буквы или тире он работает отлично.
Прикладываю для примера проблемный файл:
incorrect_file.rar

Он даже в архив не хотел запаковываться, сначала в папку пришлось положить.
Ответить с цитированием
  #4  
Старый 21.11.2013, 13:51
Аватар для Decoding
Decoding Decoding вне форума
Местный
 
Регистрация: 03.06.2006
Адрес: Почту найдете на моем сайте
Сообщения: 576
Версия Delphi: D10.2
Репутация: 214
По умолчанию

Цитата:
Сообщение от mrpit
Да код работоспособный, но проблема именно с файлом если есть иероглиф. Причем если просто русские буквы или тире он работает отлично.
Прикладываю для примера проблемный файл:
Вложение 4133

Он даже в архив не хотел запаковываться, сначала в папку пришлось положить.

О каком иероглифе идет речь? Имя файла в архиве выглядит так



верно?

Если так, то и твой вариант, и вариант приведенный мной, отлично справляются и переименовывают файл...
Ответить с цитированием
  #5  
Старый 21.11.2013, 14:59
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от mrpit
Да код работоспособный, но проблема именно с файлом если есть иероглиф. Причем если просто русские буквы или тире он работает отлично.
Редактор кода в Delphi 7 не поддерживает юникод, поэтому нужно писать примерно так:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  ws: WideString;
begin
  ws := WideString('D:\test\00000.XML_') + #$2500 + WideString('шЁхъ_юЁ');
  if MoveFileW(Pointer(ws), 'D:\test\1.txt') then
    ShowMessage('OK')
  else
    RaiseLastOSError;
end;
В новых версиях Delphi можно писать юникодные строки прямо исходном коде.
Цитата:
Сообщение от mrpit
Он даже в архив не хотел запаковываться, сначала в папку пришлось положить.
С архивацией этого файла ни в rar ни в 7z у меня проблем не возникло.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 23:55.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter