Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2005.07.25;
Скачать: [xml.tar.bz2];

Вниз

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

 
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 вся ветка

Форум: "WinAPI";
Текущий архив: 2005.07.25;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.011 c
1-1120819580
1+Random(9999)
2005-07-08 14:46
2005.07.25
Сокеты


4-1117110559
DimN
2005-05-26 16:29
2005.07.25
Узнать цвет точки на экране


4-1117524392
chili
2005-05-31 11:26
2005.07.25
Подскажите как определить имя пользователя которому пренадлежит п


1-1120448700
Kacnep
2005-07-04 07:45
2005.07.25
Присвоение в вариантном многомерном массиве.


3-1118820940
d_oleg
2005-06-15 11:35
2005.07.25
TClientDataSet - параметры полей





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский