![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как передать консоли конец цайла (EOF)? [D7, NT4, Win2k, WinXP]
Slym © (2004-02-12 19:04:00)По документации RAR имена архивируемых файлов может получать через StdIn...(rar a a.rar @) файл, перевод строки, файл перевод строки, конец файла... :
var
sa:TSecurityAttributes;
sd:TSecurityDescriptor;
si:TStartupInfo;
pi:TProcessInformation;
INWPipe,INRPipe:THandle;
begin
CmdLine:='rar a a.rar @';
sa.nLength:=SizeOf(TSecurityAttributes);
sa.lpSecurityDescriptor:=NIL;
sa.bInheritHandle:=true;
if CreatePipe(INRPipe,INWPipe,@sa,0) then
try
FillChar(si,SizeOf(si),#0);
si.cb:=Sizeof(si);
si.wShowWindow:=SW_HIDE;
si.dwFlags:=STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW;
si.hStdInput:=INRPipe;
if CreateProcess(nil,PChar(CmdLine),nil,nil,TRUE,0,nil,nil,si,pi) then
begin
CloseHandle(INRPipe);
WriteFile(INWPipe,a,Length(a),Writed,nil);
CloseHandle(INWPipe);//Что закрытие пайпа, что посылка #26#13#10 (eof) один хрен! не пашет!
if WaitForSingleObject(pi.hProcess,INFINITE)=WAIT_OBJECT_0 then
GetExitCodeProcess(pi.hProcess,res)
else res:=2;
CloseHandle(pi.hProcess);
end else Abort;
except
CloseHandle(INRPipe);
CloseHandle(INWPipe);
end;
Дык этот код не работает... Рар чего-то ждет...
Пробовал типа 'Copy con c:\1.txt' тоже не пашет...
Polevi (2004-02-17 09:37:00) [1]>Slym © (17.02.04 06:43) [5]
извини, но мне любопытно, в каких случаях нельзя сразу список файлов в командную строку передать ?
Slym (2004-02-17 06:43:00) [2]Так и есть закрываю пайп для записи в StdIn и Rar начинает паковать!
Тема закрыта!
Slym (2004-02-17 05:01:00) [3]Забираю свой последний пост...
Оказалось после закрытия программы архив всеже создавался!!!
Судя по всему после закрытия пайпов... всеже срабатывает "Конец файла"
Slym (2004-02-17 04:51:00) [4]Я тоже создал...
AddCommand('rar a z.rar unit1.pas unit1.dfm');
Но (читай первый пост), 'rar a z.rar @' - означает:
Rar получает имена не через Коммандную строку, а запрашивает их из STDIN (readln делает!), команда завершения ввода - конец файла (#26). прекращает запросы и приступает к архивированию.
Т.е. должно быть примерно так:
AddCommand('rar a z.rar @');
AddCommand('unit1.pas');
AddCommand('unit1.dfm');
AddCommand(#26);
Но не работает...
Polevi (2004-02-16 10:46:00) [5]ипользуя данный FAQ
http://www.delphimaster.ru/cgi-bin/faq.pl?look=1&id=1057316445&n=15
я создал архив вызовом
AddCommand('rar a z.rar unit1.pas unit1.dfm');
Slym (2004-02-16 04:56:00) [6]А данная прога вместо RAR работает... понимает и закрытие пайпа и #26#13#10 :
program Project2;
{$APPTYPE CONSOLE}
uses windows;
var a:array[0..1023] of char;
h:dword;
i:dword;
f:dword;
begin
h:=GetStdHandle(STD_INPUT_HANDLE);
ReadFile(h,a,1024,i,nil);
f:=CreateFile('c:\test.txt',GENERIC_READ or GENERIC_WRITE,0,nil,CREATE_ALWAYS,0,0);
WriteFile(f,a,i,i,nil);
CloseHandle(f);
end.
Как рару сообщить что ввод закончен?