![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как удалить файл зная только его расширение [D7, Win95/98, WinXP]
LEXX_55 © (2005-05-30 07:43:00)Здравствуйте господа знатоки. Подскажите пожалуйста. Я знаю как удалить файл зная его имя. А вот с удалением файла, у которого известно только его расширение у меня проблемы. Как удалить файл или группу файлов по расширению, или вообще очистить директорию?
Antonn (2005-05-31 06:43:00) [1]LEXX_55 (31.05.05 6:29) [20]
пересмотри алгоритм работы
LEXX_55 (2005-05-31 06:29:00) [2]Знатоки!!! Помогите. Почему же на одном компе работает, а на другом нет? На обоих стоит XP.
LEXX_55 (2005-05-30 15:18:00) [3]
> Anatoly Podgoretsky © (30.05.05 15:14) [18]
разве
if FileExists(StaticText1.Caption + '\*.rar') then
не исключает дальнейшую ошибку в нахождении архива?
Anatoly Podgoretsky (2005-05-30 15:14:00) [4]Не будем копать, а то до истины докопаемся.
Antonn (2005-05-30 15:13:00) [5]Anatoly Podgoretsky © (30.05.05 15:10) [16]
Дас, ни одной проверки на ошибке в коде, это самоуверенность или как?
это оптимизм
:)
Anatoly Podgoretsky (2005-05-30 15:10:00) [6]Дас, ни одной проверки на ошибке в коде, это самоуверенность или как?
LEXX_55 (2005-05-30 15:01:00) [7]
> WaitForSingleObject(ProcInfo.hProcess, INFINITE)
тоже самое.
begin...end (2005-05-30 14:47:00) [8]> LEXX_55 (30.05.05 14:38) [13]
> WaitForSingleObject(ProcInfo.hProcess, 10000)
А почему только 10 секунд ждёте? Попробуйте так:
WaitForSingleObject(ProcInfo.hProcess, INFINITE)
LEXX_55 (2005-05-30 14:38:00) [9]
if FileExists(StaticText1.Caption + '\*.rar') then
begin
FillChar(StartInfo, SIZEOF(StartInfo), #0);
StartInfo.cb := SIZEOF(StartInfo);
CreateProcess(nil, PChar('' + StaticText5.caption + '\WINRAR X -o+ -x*.txt ' + StaticText1.caption + '\*.RAR ' + StaticText2.caption + '\' + ''), nil, nil, False, HIGH_PRIORITY_CLASS, nil, nil, StartInfo, ProcInfo);
if WaitForSingleObject(ProcInfo.hProcess, 10000) = WAIT_OBJECT_0 then
CloseHandle(ProcInfo.hProcess);
CreateProcess(nil, PChar('' + StaticText5.caption + '\WINRAR X -o+ ' + StaticText1.caption + '\*.RAR *.txt ' + StaticText3.caption + '\' + ''), nil, nil, False, HIGH_PRIORITY_CLASS, nil, nil, StartInfo, ProcInfo);
if WaitForSingleObject(ProcInfo.hProcess, 10000) = WAIT_OBJECT_0 then
begin
CloseHandle(ProcInfo.hProcess);
// Удаление
FillChar(Op, sizeof(Op), 0);
Op.Wnd := Handle;
Op.wFunc := FO_DELETE;
Op.pFrom := PChar('' + StaticText1.Caption + '\*.rar' + '');
Op.fFlags := FOF_NOCONFIRMATION or FOF_SILENT;
SHFileOperation(Op);
end;
из StaticText беруться пути к файлам и архиватору
begin...end (2005-05-30 14:36:00) [10]> LEXX_55 (30.05.05 14:31) [11]
Приведите полный код (включая запуск распаковщика, ожидание его завершения и удаление).
LEXX_55 (2005-05-30 14:31:00) [11]
> begin...end © (30.05.05 09:41) [9]
Спасибо, все работает. Но только на моей машине. При тестирование на другом компе архивы удаляет не распаковав и вадает ошибку не найден архив. В чем причина? Может кто занет?
LEXX_55 (2005-05-30 13:35:00) [12]Удалено модератором
begin...end (2005-05-30 09:41:00) [13]> LEXX_55 (30.05.05 09:38) [8]
Т.е. с помощью какого-то внешнего разархиватора? Тогда можно вызывать его не через WinExec, а через CreateProcess, ждать завершения работы процесса (WaitForSingleObject), и только после этого вызывать SHFileOperation.
LEXX_55 (2005-05-30 09:38:00) [14]
> begin...end © (30.05.05 09:35) [7]
winExec, в два подхода (снчала TXT, потом каталоги).
Сразу.
begin...end (2005-05-30 09:35:00) [15]> LEXX_55 (30.05.05 09:29) [6]
Как распаковываются архивы? Чем? По одному, или все сразу?
LEXX_55 (2005-05-30 09:29:00) [16]
> begin...end © (30.05.05 09:03) [5]
Спасибо, работает.
Только выдает кучу сообщений что файл занят. Но в конце концов удаляет. Я удаляю архивы, которые перед этим распаковываю. Видно удаление начинается до окончания распаковки. Как бы и это обойти?
begin...end (2005-05-30 09:03:00) [17]> LEXX_55 (30.05.05 07:43)
См. в справке описание API-функции SHFileOperation.
Пример удаления файлов с расширением txtв папке C:\MyFolder:
uses ShellAPI;
procedure TForm1.Button1Click(Sender: TObject);
var
Op: TSHFileOpStruct;
begin
FillChar(Op, sizeof(Op), 0);
Op.Wnd := Handle;
Op.wFunc := FO_DELETE;
Op.pFrom := 'C:\MyFolder\*.txt';
Op.fFlags := FOF_NOCONFIRMATION or FOF_SILENT;
SHFileOperation(Op)
end.
Antonn (2005-05-30 08:43:00) [18]к [3]
function NormalDir(const DirName: string): string;
begin
Result := DirName;
if (Result <> '') and
{$IFDEF RX_D3}
not (AnsiLastChar(Result)^ in [':', '\']) then
{$ELSE}
not (Result[Length(Result)] in [':', '\']) then
{$ENDIF}
begin
if (Length(Result) = 1) and (UpCase(Result[1]) in ['A'..'Z']) then
Result := Result + ':\'
else Result := Result + '\';
end;
end;
Antonn (2005-05-30 08:43:00) [19]выдрал из проекта, лишнее сам уберешь:
function TF_PlayList.AddFile_m(name: string): integer;
var
Ext: string;
begin
Result := -1;
ext := lowercase(ExtractFileExt(name));
if pos(ext, lowercase('*.wav;*.pls;*.m3u;') ) > 0 then begin
//тут добавляешь файлы, прошедшие маску
end;
end;
function TF_PlayList.adddir(Path: string; Recursive: Bool): integer;
var Dirs: TSearchRec;
Res: integer;
begin
Result := -1;
Res := FindFirst(NormalDir(Path) + '*.*', faReadOnly + faHidden + faArchive + faDirectory, Dirs);
while Res = 0 do
begin
if ((Dirs.Attr and faDirectory) <> 0) and (Recursive)
then begin
if not ((Dirs.Name = '.') or (Dirs.Name = '..'))
then begin
if Result < 0
then Result := adddir(NormalDir(Path) + Dirs.Name, True)
else
adddir(NormalDir(Path) + Dirs.Name, True);
end
end
else begin
if Result < 0
then
Result := AddFile_m(NormalDir(Path) + Dirs.Name)
else
AddFile_m(NormalDir(Path) + Dirs.Name);
end;
Res := FindNext(Dirs);
end;
FindClose(Dirs);
end;
Пол-дела сделано, теперь удаляй
LEXX_55 (2005-05-30 08:41:00) [20]
> TUser © (30.05.05 08:39) [1]
> *.ext
DeleteFile(StaticText1.Caption + '\*.ext')
так?