Форум: "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]
> *.extDeleteFile(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.49 MB
Время: 0.01 c