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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.07.2011, 10:30   #11
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

согласен. Закрыть файл нужно обязательно!

Цитата:
возможна ли ситуация, что файл типа не успел записаться и не запустится?
1) а Вы попробуйте для начала просто запусить сохранённый файл (желательно на слабенькой машине, если есть возможность, или выберите запись на флешку - как более медленное устройство записи)...

2) Если просто так будут проблемы, тогда можно попробовать воткнуть задержку небольшую:
Код:
  CloseFile(dst);
  sleep(200);
  ShellExecute ...
3) ну и если не будет 100% срабатывания. Тогда можно сделать следующее.
сразу после записи открывать файл на чтение в эксклюзивном (ShareNone) режиме.. крутить открытие в цикле, пока не пройдёт заданное (большое число времени - выходить с ошибкой по таймауту), либо пока файл не открылся. Если удачно открылся. Тогда закрывать и запускать на выполнение.


p.s. всё это мои домыслы...
Для приближения к Истине надо пробовать разные варианты + погуглить..
возможно, что и без всех этих извращений всё будет тип-топ!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 11.07.2011, 10:34   #12
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

если файл закрыт, то есть программные буферы(то есть, то что организовано ЯП/программистом) сброшены в файл, то все будет нормально.
ибо ОС знает что у нее есть не записанные данные по файлу, она их(данные из дискового буфера/файлового кэша) и будет читать(хотя насколько я помню, старается всетаки записать как можно скорее).
Цитата:
или выберите запись на флешку - как более медленное устройство записи)...
если флэшка не работает через USB1.1, то флэшка быстрее.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 11.07.2011, 11:29   #13
Unconnected
Пользователь
 
Регистрация: 23.06.2008
Сообщений: 55
По умолчанию

Целое исследование Ну я ставил задержку 5 сек, с запасом) Но мне кажется, должно и без неё работать.. Проблема опять с этой записью в бинарник. Есть строка - AnsiString - и она точно содержит нужный файл, полностью совпадает с показаниями сниффера. Записываю его вышеприведенным методом, и exe получается нерабочий(
Код:
procedure str2exe(src,p:ansistring);
var
  Dst:File;
begin
  assignfile(dst,p);
  rewrite(dst,1);
  BlockWrite(dst, Pointer(Src)^, Length(Src));
  closefile(dst);
end;
Размер exe почти в 2 раза меньше оригинала. В чём может быть затык?

Последний раз редактировалось Unconnected; 11.07.2011 в 11:48.
Unconnected вне форума Ответить с цитированием
Старый 11.07.2011, 13:10   #14
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

что-то Вы, похоже, делаете не так (имхо, в строке у Вас всё таки НЕ ВСЕ символы)

для начала попробуйте посмотреть, сколько в строке символов:
Код:
  ....
  rewrite(dst,1);
  ShowMessage('Размер строки в байтах : '+IntToStr(Length(Src)));
  BlockWrite(dst, Pointer(Src)^, Length(Src));
  closefile(dst);
и посмотрите, какой размер строки и какой размер EXE получается.. совпадают ли данные числа...


p.s. проверил, как строчка пишется, если в ней непечатные символы. Как и следовало ожидать - всё работает абсолютно корректно.
Код:
procedure TForm1.Button2Click(Sender: TObject);
var s : AnsIString;
  i : integer;
begin
  s := '';
  for i:=0 to 255 do s := s + chr(i);
  str2exe(s, 'c:\test1.exe');
end;
создаётся файл размером 256 байт. Содержит все байты от нулевого и до #255

Так что - ищите ошибку в том месте, где Вы получаете Вашу бинарную строку.
Может при получении/передаче что-то похабится?!..

Последний раз редактировалось Serge_Bliznykov; 11.07.2011 в 13:16.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 11.07.2011, 13:17   #15
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

1)снифер мог не отобразить все символы, лучше всего такие бинарные строки записывать в код через #.
2)у вас АНСИ строки то?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 11.07.2011, 16:02   #16
Unconnected
Пользователь
 
Регистрация: 23.06.2008
Сообщений: 55
По умолчанию

Приём кривоватый, но вроде всё верно делает.

Код:
TGetRes=record
    stk:string;
    success:boolean;
  end;
var d: ansistring;

function TKOLhttpControl.gettxt(ur:string):TGetRes;
begin
  try
    get(ur);
    repeat
      applet.ProcessMessages;
    until readend or errorflag;
    result.stk:=d;                           //итоговая строка
    result.success:=not(errorflag);
    readend:=false;errorflag:=false;  
  except end;
end;

procedure TKOLhttpControl.OnRead;
var s:ansistring;
begin
  while fSoc.Count > 0 do begin
     s:=Wordn(fSoc.ReadLine(#10), #13, 1);
     d:=d+s;
     if pos('HTTP/1.', s) = 1 then begin
       fCod := str2int(wordn(s, ' ', 2));
       if ((inttostr(fcod)[1]<>'2') and (inttostr(fcod)[1]<>'3')) then errorflag:=true;
     end;
  end;
  if pos('endlab#',d)>0 then begin
    delete(d,1,pos('stlab#',d)+5);
    delete(d,pos('endlab#',d),length(d)-pos('endlab#',d)+1);
    readend:=true;
  end;
  if Assigned(fOnClos) then fOnClos(@self);
end;
В начале файла стоит метка stlab#, в конце endlab# (это мне так надо)). В аттаче текстовое представление upx-а, по версии сниффера. Размер вроде такой же, но попробовал записать - пасьянс не сошёлся..
Вложения
Тип файла: txt 1.txt (283.5 Кб, 148 просмотров)

Последний раз редактировалось Unconnected; 11.07.2011 в 16:05.
Unconnected вне форума Ответить с цитированием
Старый 11.07.2011, 17:36   #17
spamer
Software Developer
Старожил
 
Аватар для spamer
 
Регистрация: 19.12.2008
Сообщений: 2,070
По умолчанию

ТС, случаем не вот это нужно - Base64...
Модуль в Delphi - EncdDecd.pas
Будь проще и люди к тебе потянутся
spamer вне форума Ответить с цитированием
Старый 11.07.2011, 19:50   #18
Unconnected
Пользователь
 
Регистрация: 23.06.2008
Сообщений: 55
По умолчанию

Предлагаете Base64-энкодить файл на сервере, а на принимающей стороне обратно? Да, так решится проблема с нечитаемыми символами..
Unconnected вне форума Ответить с цитированием
Старый 12.07.2011, 01:31   #19
Unconnected
Пользователь
 
Регистрация: 23.06.2008
Сообщений: 55
По умолчанию

Оказывается, строка в моей проге в 2 раза короче, чем мозилла выдаёт.. Может, KOLовый компонент непечатаемые символы не жуёт. Нужно повтыкать везде AnsiString? Я имею в виду, внутренние функции работы компонента.. типа этой:

Код:
function TAsyncSocket.ReadData;
var n,
    r: integer;
    t:^TBufRecord;
    u:^TBufRecord;
    a:^TBArray;
begin
   if FList.count = 0 then begin
      result := 0;
      exit;
   end;
   n := 0;
   a := b;
   while (n < c) and (n < count) do begin
      r := c - n;
      t := FList.Items[0];
      if r > t^.i then r := t^.i;
      move(t^.p^, a^[n], r);
      n := n + r;
      if r = t^.i then begin
         FreeMem(t^.p, t^.i);
         FreeMem(t, SizeOf(TBufRecord));
         FList.Delete(0);
      end else begin
         GetMem(u, SizeOf(TBufRecord));
         u^.i := t^.i - r;
         GetMem(u^.p, u^.i);
         move(t^.p^[r], u^.p^, u^.i);
         FreeMem(t^.p, t^.i);
         FreeMem(t, SizeOf(TBufRecord));
         FList.Items[0] := u;
      end;
   end;
   result := n;
end;

Последний раз редактировалось Unconnected; 12.07.2011 в 01:39.
Unconnected вне форума Ответить с цитированием
Старый 12.07.2011, 02:13   #20
xrob
Форумчанин
 
Регистрация: 18.10.2010
Сообщений: 419
По умолчанию

несколько последних постов прочитать поленился...
у меня философские мысли по этому поводу.
а что вообще такое бинарник? ну что-то типа 0101101100011101, да?
к чему я это все говорю?
есть бит: 0-1 значений,
есть байт: 8 бит - 0-255, т.е. 256 значений - 2 в степени 8.
насколько я понимаю, ЛЮБОЙ файл состоит из символов, печатаемых-непечатаемых - не важно.
символ есть символ, 0-255.
и если вы получаете строку, строку чего вы получаете? символов.
строка есть строка, не важно что в ней записано и какими из 256 символами,
строка - это последовательность символов,
а коли так, то ее можно сохранить в файл элементарным Writeln(file,str);

более того, если не верите мне, проведите сами такой эксперимент:

Код:
begin
assignfile(test,'корректный.exe');
reset(test);
str:='';

while not(eof) do 
begin
read(test,a); // считываем файл посимвольно в строку
str:=str+a;
end;

closefile(test);

assignfile(test,'новый.exe'); rewrite(test);
write(test,str);  // сохраняем строку в новый файл

end;

получится копия исходного ехе, полностью работоспособная,



___________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE] (это кнопочка с решёточкой #)
Не забывайте об этом!
Модератор.

проверено.

Последний раз редактировалось Serge_Bliznykov; 12.07.2011 в 08:57.
xrob вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Запись в бинарник и access violation reading location Farrel Общие вопросы C/C++ 2 23.03.2011 20:13
компиляция в чистый бинарник Hell Knight Общие вопросы C/C++ 5 23.03.2011 19:50
файловый поток. Открыть\создать бинарник Darth.Vader Общие вопросы C/C++ 16 29.12.2009 22:04
txt в бинарник и обратно cowboy Общие вопросы Delphi 9 16.09.2009 10:54
Как выяснить каким образом обрабатывается бинарник yarilo Помощь студентам 1 22.04.2009 09:57