Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как удалить файл зная только его расширение [D7, Win95/98, WinXP]


Страницы:   1 2

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')

так?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо