Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.12.23;
Скачать: CL | DM;

Вниз

Команда DOS (<B>copy</B>, <B>del</B>, ...) без окна?   Найти похожие ветки 

 
Влад2   (2002-12-10 16:28) [0]

Недавно я задавал подобный вопрос для распаковки архива. Мне хорошо помогли. Но для команд интерпретатора (через command.com) - copy, del и т.п. этот метод не работает.

Что нужно сделать, чтобы:
1. при выполнении ЭТИХ команд окно DOS не показывалось;
2. выполнение задачи не продолжалось, пока не выполнится команда DOS?

Вновь расчитываю на вашу помощь.
Спасибо.


 
Hooch ©   (2002-12-10 16:53) [1]

можно попробовать ShellExecute, если стартовать команду с флагом SW_HIDE, то окна не будет а зная HINSTANCE можно подождать окончания выполнения


 
Romkin ©   (2002-12-10 16:54) [2]

А что, CopyFile, DeleteFile не подходят?


 
Влад2   (2002-12-10 18:11) [3]

Уважаемый Hooch:

>> зная HINSTANCE можно подождать окончания выполнения

А как?

Уважаемый Romkin,
конечно, можно использовать CopyFile, DeleteFile. Но если Вам надо, например, удалить файлов 100, то гораздо быстрее сделать это по маске командой DOS.

Спасибо за ответы.


 
Smithson ©   (2002-12-10 18:18) [4]

WaitSingleObject


 
Влад2   (2002-12-10 18:27) [5]

Уважаемый Smithson,
если Вы имеете ввиду WaitSingleObject() после CreateProcess(), то в ответ на команду DOS del ... CreateProcess() ответит "не могу найти файл" (т.е. "исполняемый файл" del).
А если команду del поместить в файл.bat и запустить его с пом. CreateProcess(), то WaitSingleObject() будет висеть бесконечно долго.


 
Romkin ©   (2002-12-10 18:38) [6]

SHFileOperation прекрасно это сделает, быстро, и без всяких окон (если не захочешь) :-))


 
Smithson ©   (2002-12-10 18:41) [7]

Ну Romkin прав.
А насчет WaitSingleObject, то в бат-файл можно поместить не только команду del, но и команду exit - он и закроется.


 
Romkin ©   (2002-12-10 18:43) [8]

Выдрал из фака :-))

uses ShellAPI;

function DelFile( FileName : string ) : boolean;
var fos : TSHFileOpStruct;
begin
FillChar(fos, SizeOf(fos), 0);
with fos do begin
wFunc := FO_DELETE;
pFrom := PChar( FileName );
fFlags := FOF_NOCONFIRMATION or FOF_SILENT;
end;
Result := (0 = ShFileOperation(fos));
end;


 
oomneeq ©   (2002-12-10 19:31) [9]

>Влад2 (10.12.02 18:27)
>... в ответ на команду DOS del ... CreateProcess() ответит "не могу найти файл" (т.е. "исполняемый файл" del).

В том примере, что я давал, под XP надо в качестве исп. файла
указать
cmd.exe (или command.com для 9X)
a параметром-
/c del file.*

если неочевидно, почитай хелп по ключам коммандного процессора

удачи




 
Влад2   (2002-12-10 19:42) [10]

Спасибо Smithson и Romkin!
Наверное, я переработал :) Про exit совсем забыл. Пользуюсь bat-файлом (он работает для всех команд, включая архивацию).
А про SHFileOperation почти не знал (т.е. основательно забыл)


 
Влад2   (2002-12-10 20:15) [11]

oomneeq,
правильно ли я понимаю, что CreateProcess() будет выглядеть так:

CreateProcess("cmd", "/c del file.*",
nil, nil,
false,
CREATE_NO_WINDOW,
nil,
nil,
StartupInfo,
ProcessInfo)
?


 
Smithson ©   (2002-12-10 20:17) [12]

правильно


 
Влад2   (2002-12-10 21:16) [13]

Большое спасибо всем!
Использую
CreateProcess(nil, "cmd /c del file.*",
nil, nil,
false,
CREATE_NO_WINDOW,
nil,
nil,
StartupInfo,
ProcessInfo)

И маленький вопросик: как узнать, какая операционка (использовать cmd или command.com)?



 
oomneeq ©   (2002-12-11 01:34) [14]

>как узнать, какая операционка (использовать cmd или command.com)?

сусчествует чуева чуча способов, но тебе это не надо :)
тебе ведь надо в конце концов знать что запускать.
(логичное предположение что
9х значит command.com а NT,2K,XP - значит cmd.exe в общем случае может оказаться неправдой)

Вот это поможет тебе правильно определить действующий командный процессор (кто б он ни был):

function GetEnvVar(variable: string) : string;
begin
SetLength(result,MAX_PATH+1);
SetLength(result,GetEnvironmentVariable(pchar(variable),pchar(result),MAX_PATH));
end;
...
WhatToRun:=GetEnvVar("COMSPEC");
...
CreateProcess(WhatToRun .....


а если вдруг интересна теория, читай про переменные окружения ОС

успехов


 
Rouse_ ©   (2002-12-11 01:51) [15]

>как узнать, какая операционка
Есть очень хороший (полный) пример Игоря Шевченко в UBPFD
Есть очень хороший (полный) пример от Microsoft в MSDN

> в ответ на команду DOS del ... CreateProcess() ответит
> "не могу найти файл" (т.е. "исполняемый файл" del).
DOS = MAX, 8 символов+расширение = 12345678.123

Влад2:
По первому и второму вопросу есть полный ответ в FAQ

Желаю успехов


 
Юрий Зотов ©   (2002-12-11 08:57) [16]

> как узнать, какая операционка

А еще есть просто переменная Win32Platform. См. хелп и модуль SysUtils (там же - MajorVersion, MinorVersion).


 
Влад2   (2002-12-11 11:12) [17]

Юрий Зотов:
>> А еще есть просто переменная Win32Platform
Да, действительно, это показалось мне простым и, главное, работает.

Большое спасибо всем откликнувшимся!
Вы мне очень помогли.
Может быть, эта ветка будет полезной и другим.



Страницы: 1 вся ветка

Текущий архив: 2002.12.23;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.012 c
14-74922
Мазут Береговой
2002-12-01 06:12
2002.12.23
Я очень disapointed! Очень disapointed!


14-74990
JeanY
2002-12-02 17:26
2002.12.23
Где можно найти FREEWARE АУДИО - компоненты и библиотеки?


1-74826
harismatik
2002-12-11 20:46
2002.12.23
Ввод фрагмента HTML кода


3-74556
Брат
2002-12-04 11:56
2002.12.23
Вопрос по SQL: как разделить нацело?


14-74977
Anatoly Podgoretsky
2002-12-02 07:36
2002.12.23
Именинники 2 декабря