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

Вниз

Как удалить файл зная только его расширение   Найти похожие ветки 

 
LEXX_55   (2005-05-30 07:43) [0]

Здравствуйте господа знатоки. Подскажите пожалуйста. Я знаю как удалить файл зная его имя. А вот с удалением файла, у которого известно только его расширение у меня проблемы. Как удалить файл или группу файлов по расширению, или вообще очистить директорию?


 
TUser ©   (2005-05-30 08:39) [1]

*.ext


 
LEXX_55   (2005-05-30 08:41) [2]


> TUser ©   (30.05.05 08:39) [1]
> *.ext


     DeleteFile(StaticText1.Caption + "\*.ext")

так?


 
Antonn ©   (2005-05-30 08:43) [3]

выдрал из проекта, лишнее сам уберешь:

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;

Пол-дела сделано, теперь удаляй


 
Antonn ©   (2005-05-30 08:43) [4]

к [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;


 
begin...end ©   (2005-05-30 09:03) [5]

> 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.


 
LEXX_55   (2005-05-30 09:29) [6]


> begin...end ©   (30.05.05 09:03) [5]

Спасибо, работает.
Только выдает кучу сообщений что файл занят. Но  в конце концов удаляет. Я удаляю архивы, которые перед этим распаковываю. Видно удаление начинается до окончания распаковки. Как бы и это обойти?


 
begin...end ©   (2005-05-30 09:35) [7]

> LEXX_55   (30.05.05 09:29) [6]

Как распаковываются архивы? Чем? По одному, или все сразу?


 
LEXX_55   (2005-05-30 09:38) [8]


> begin...end ©   (30.05.05 09:35) [7]

winExec, в два подхода (снчала TXT, потом каталоги).
Сразу.


 
begin...end ©   (2005-05-30 09:41) [9]

> LEXX_55   (30.05.05 09:38) [8]

Т.е. с помощью какого-то внешнего разархиватора? Тогда можно вызывать его не через WinExec, а через CreateProcess, ждать завершения работы процесса (WaitForSingleObject), и только после этого вызывать SHFileOperation.


 
LEXX_55   (2005-05-30 13:35) [10]

Удалено модератором


 
LEXX_55   (2005-05-30 14:31) [11]


> begin...end ©   (30.05.05 09:41) [9]

Спасибо, все работает. Но только на моей машине. При тестирование на другом компе архивы удаляет не распаковав и вадает ошибку не найден архив. В чем причина? Может кто занет?


 
begin...end ©   (2005-05-30 14:36) [12]

> LEXX_55   (30.05.05 14:31) [11]

Приведите полный код (включая запуск распаковщика, ожидание его завершения и удаление).


 
LEXX_55   (2005-05-30 14:38) [13]

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:47) [14]

> LEXX_55   (30.05.05 14:38) [13]

> WaitForSingleObject(ProcInfo.hProcess, 10000)

А почему только 10 секунд ждёте? Попробуйте так:

WaitForSingleObject(ProcInfo.hProcess, INFINITE)


 
LEXX_55   (2005-05-30 15:01) [15]


> WaitForSingleObject(ProcInfo.hProcess, INFINITE)

тоже самое.


 
Anatoly Podgoretsky ©   (2005-05-30 15:10) [16]

Дас, ни одной проверки на ошибке в коде, это самоуверенность или как?


 
Antonn ©   (2005-05-30 15:13) [17]

Anatoly Podgoretsky ©   (30.05.05 15:10) [16]
Дас, ни одной проверки на ошибке в коде, это самоуверенность или как?

это оптимизм
:)


 
Anatoly Podgoretsky ©   (2005-05-30 15:14) [18]

Не будем копать, а то до истины докопаемся.


 
LEXX_55   (2005-05-30 15:18) [19]


> Anatoly Podgoretsky ©   (30.05.05 15:14) [18]

разве
if FileExists(StaticText1.Caption + "\*.rar") then
не исключает дальнейшую ошибку в нахождении архива?


 
LEXX_55   (2005-05-31 06:29) [20]

Знатоки!!! Помогите. Почему же на одном компе работает, а на другом нет? На обоих стоит XP.


 
Antonn ©   (2005-05-31 06:43) [21]

LEXX_55   (31.05.05 6:29) [20]
пересмотри алгоритм работы



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

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

Наверх




Память: 0.52 MB
Время: 0.038 c
4-1117461224
volser
2005-05-30 17:53
2005.07.25
Отрисовка невидимого окна.


3-1118124442
KotJunior
2005-06-07 10:07
2005.07.25
Как изменить размер поля базы данных...


8-1111865107
seregka
2005-03-26 22:25
2005.07.25
TMemoryStream и bitmap


3-1118566441
0123
2005-06-12 12:54
2005.07.25
Упаковка таблиц Paradox


4-1117339254
dEd
2005-05-29 08:00
2005.07.25
Как очистить очередь сообщений приложения?