Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.07.2008, 09:07   #1
Hell'ena
 
Регистрация: 11.07.2008
Сообщений: 6
Печаль Нужна помощь с кодом оО

Добрый день)

Ситуация такая: есть много файликов типа *.pal, названия которых записаны во внешнем текстовом файле (в виде имя_файла*желаемое_имя).
Нужно обрезать у файлов первые 24 байта и переименовать в соответствии со списком. Задача тривиальная, но вызывает ступор))
Не очень понятно, как кодом научить дельфи хексать. Единственное, что приходит в голову - вставлять ассемблерный код, но самостоятельно я его вряд ли напишу, ибо опыт общения с ним небогатый))

Надеюсь на вашу помощь... Заранее спасибо ^.^"

Последний раз редактировалось Hell'ena; 11.07.2008 в 09:19.
Hell'ena вне форума Ответить с цитированием
Старый 11.07.2008, 09:25   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Код:
var f:file;
begin
assignfile(f,'file1.txt');reset(f,1);
seek(f,5);
Truncate(f);
CloseFile(f);
end;
Здесь фал будет урезан до пятого байта.

Или нужно наоборот убрать первые а остальные подтянуть к началу?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 11.07.2008, 09:30   #3
Hell'ena
 
Регистрация: 11.07.2008
Сообщений: 6
По умолчанию

>>Или нужно наоборот убрать первые а остальные подтянуть к началу?

Да, именно так)
Hell'ena вне форума Ответить с цитированием
Старый 11.07.2008, 09:35   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Тогда так:
Код:
const qw=3;
var f:file;a:array of byte;sz:cardinal;
begin
assignfile(f,'file1.txt');reset(f,1);
sz:=FileSize(f);
seek(f,qw);
setlength(a,sz-qw);
blockread(f,a[0],sz-qw);
seek(f,0);
blockwrite(f,a[0],sz-qw);
seek(f,sz-qw);
truncate(f);
CloseFile(f);
end;
Здесь qw указывает сколько символов спереди выдрать. Соответственно конец подтягивается
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 11.07.2008, 09:41   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Нужно обрезать у файлов первые 24 байта и переименовать в соответствии со списком.
А я бы предложил записывать результат в новый файл с новым именем. Так надёжнее. А старые файлы и потом можно удалить...
И, кстати, я бы делал через TFileStream
Serge_Bliznykov вне форума Ответить с цитированием
Старый 11.07.2008, 09:51   #6
Hell'ena
 
Регистрация: 11.07.2008
Сообщений: 6
По умолчанию

Stilet, спасибо)) Еще один вопрос - если мне потом надо вставить известную строку байтов обратно, то запихивать их по одному?))
Serge_Bliznykov, дело в том, что эти файлы потом переименовываются по списку. Конечно, можно внести изменения во внешний список... Но это какой-то окружной путь))
Hell'ena вне форума Ответить с цитированием
Старый 11.07.2008, 10:25   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
дело в том, что эти файлы потом переименовываются по списку
И тем не менее Серж предложил еще один хороший вариант.
Действительно зачем переписывать один файл а потом его переименовывать, если можно создать уже переименованную покоцанную как надо кего копию.
Цитата:
если мне потом надо вставить известную строку байтов обратно, то запихивать их по одному?
Ну зачем же. Запихивай скопом.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 11.07.2008, 16:14   #8
Hell'ena
 
Регистрация: 11.07.2008
Сообщений: 6
По умолчанию

Просто эти функции в программе подвешены на разные кнопки... Впрочем, я подумаю над этим вариантом еще))
Мм... Еще один глупый вопрос - если скопом, то как их прописывать? Запихнуть в массив, и оттуда по ячейке копировать циклом?))
Hell'ena вне форума Ответить с цитированием
Старый 12.07.2008, 16:42   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

сначала малюсенький ликбез - (типа живой хэлп пришёл к Вам в гости.. ;-))

всё будем делать через потоки:
Код:
var  FS, FRez : TFileStream;
скопировать файл F1.EXT в файл F2.DAT (без проверок и защит...):
Код:
            try
              FS := TFileStream.Create('F1.EXT', fmOpenRead );
              FRez := TFileStream.Create('F2.DAT', fmCreate );
              FRez.CopyFrom(FS, FS.Size);
            finally
              FreeAndNil(FS);
              FreeAndNil(FRez);
            end;
скопировать файл F1.EXT в файл F2.DAT начиная с 25 байта (т.е. "выкинуть" первые 24 байта:

Код:
            try
              FS := TFileStream.Create('F1.EXT', fmOpenRead );
              FRez := TFileStream.Create('F2.DAT', fmCreate );
              FS.Seek(24,soFromBeginning);
              FRez.CopyFrom(FS, FS.Size - 24 );
            finally
              FreeAndNil(FS);
              FreeAndNil(FRez);
            end;
и последнее,
в выходной файл вставить строчку символов:
Код:
var s : shortstring;
....
              s := 'Киса - ку-ку';
              FRez.WriteBuffer(s[1], Length(s));
или массив 100 байт:
Код:
var
    Buf : array[1..100] of byte; {буфер}
...
   for i:=1 to 100 do Buf[i]:=i;
   FRez.WriteBuffer(Buf, 100);
Serge_Bliznykov вне форума Ответить с цитированием
Старый 12.07.2008, 16:46   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Hell'ena, А теперь — подарок: код, который делает всё, что Вы просили в первом посте (попутно создаётся логфайл (протокол работы)
(список файлов для переименования берётся из текстового файла fRenList.txt):
Код:
procedure TForm1.btStartClick(Sender: TObject);
var
  TS : TstringList;
  fLog : TextFile;
  k    : integer;
  s, FName1, FName2 : shortstring;
  FS, FRez : TFileStream;
begin
  try
   TS := TstringList.Create;
   AssignFile(fLog,'FRen.log');
   if FileExists('fRen.log') then System.Append(fLog)
     else System.Rewrite(fLog);
   WriteLn(fLog,'------------- Program MultiFileCutRenamer v1.0 start at '
                +dateToStr(Now)+' '+TimeToStr(Now)+' ---------------------');

   TS.LoadFromFile('fRenList.txt');
   for k:=0 to TS.Count-1 do begin
     s:=Trim(TS.Strings[k]);
     if s<>'' {пустые строчки пропускаем, непустые- обрабатываем} then begin
       if Pos('*',s)>0 then begin
          FName1 := Copy(s,1,Pos('*',s)-1);
          FName2 := Copy(s,Pos('*',s)+1,255);
          // WriteLn(fLog,'rename '+FName1+' -> '+FName2);
          if FileExists( FName1 ) then begin
            try
              FS := TFileStream.Create(FName1, fmOpenRead );
              FRez := TFileStream.Create(FName2, fmCreate );
              FS.Seek(24,soFromBeginning);
              FRez.WriteBuffer(s[1], Length(s));
              FRez.CopyFrom(FS, FS.Size - 24 );
              WriteLn(fLog,'Успешно скопирован '+FName1+' -> '+FName2);
            finally
              FreeAndNil(FS);
              FreeAndNil(FRez);
            end;
          end
          else
            WriteLn(fLog,'#Error: файл '+FName1+' не найден.');
       end
       else
         WriteLn(fLog,'#Error: в строке ',(k+1):1,' ошибка - нет разделителя *. '+
           'Исходная строка '+s);
     end;
   end;

   WriteLn(fLog,'------------- Program finished at '
                +dateToStr(Now)+' '+TimeToStr(Now)+' ---------------------')
   finally
     CloseFile(FLog);
     FreeAndNil(TS);
   end;
   Application.MessageBox('Программа завершила работу',
      'Информация', MB_ICONWARNING or MB_OK);
end;

Последний раз редактировалось Serge_Bliznykov; 12.07.2008 в 16:55.
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вывод байта в двоичном пердставлении (С++) trollik Помощь студентам 6 01.09.2008 23:55
Первые шаги в VBA :) rustam_colpal Microsoft Office Excel 12 30.05.2008 09:27
как переименовать samosval Общие вопросы .NET 1 19.12.2007 21:40
Image1 и Rgn.. как обрезать? Yogik™ Помощь студентам 7 28.09.2007 17:07