Форум: "Основная";
Текущий архив: 2004.01.16;
Скачать: [xml.tar.bz2];
ВнизУдалять файлы в корзину без ошибок и тормозов. Найти похожие ветки
← →
Denis group (2004-01-03 16:36) [0]Удалять файлы в корзину без ошибок и тормозов.
Например в Win ХР файлы "NTUSER.DAT", "ntuser.dat.LOG" удалить нельзя и они вызывают ошибку или тормоза смотря как удалять. По какому признаку можно отличить эти блокированные файлы ?
Вот как я удаляю.
unit Unit1;
interface
uses ShellAPI,
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
function Recycle(const FileName: string; Wnd: HWND = 0): Boolean;
var
FileOp: TSHFileOpStruct;
begin
FillChar(FileOp, SizeOf(FileOp), 0);
if Wnd = 0 then Wnd := Application.Handle;
FileOp.Wnd:=Wnd;
FileOp.wFunc:=FO_DELETE;
FileOp.pFrom:=PChar(FileName);
FileOp.fFlags:=FOF_ALLOWUNDO or FOF_NOERRORUI or FOF_SILENT;
Result:=(SHFileOperation(FileOp) = 0) and (not FileOp.fAnyOperationsAborted);
end;
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
Recycle(Edit1.Text, Handle);
end;
end.
← →
CYBERWOLF (2004-01-03 16:44) [1]попробуй просто перемещать файлы в папку C:\Recycled. так проще и без изврата.
← →
Denis group (2004-01-03 17:49) [2]А восстановить их потом можно ?
← →
CYBERWOLF (2004-01-03 18:00) [3]естественно можно.
ты попробуй открыть эту папку и сверь ее содержимое с содержимым корзины. вообще-то, корзина - это и есть C:\Recycled или D:\Recycled итд.
хинт: эта директория скрытая, поэтому просто набери путь C:\Recycled.
← →
DDA (2004-01-03 18:32) [4]Дак Попробуй открыть эти файлы
procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
begin
i:=FileOpen("D:\Documents and Settings\DDA.DDA-DDA\ntuser.dat.LOG",fmOpenRead);
ShowMessage(SysErrorMessage(GetLastError)+" "+inttostr(i));
end;
и проверяй - есть ли ошибка при открытии
если I:=-1 тогда ShowMessage(SysErrorMessage(GetLastError)+" "+inttostr(i)); выдаст тебе ошибку
все файлы которые вернули ошибку не удаляешь в корзину и все
← →
Denis group (2004-01-03 18:42) [5]DDA
Ша проверю.
CYBERWOLF
А просто перемещать чёто неполучилось.
← →
CYBERWOLF (2004-01-03 18:57) [6]там вроде апишная функция (MoveFile вроде) - попробуй.
возможно перемещать не получается потому что эти файлы как раз блокированные. попробуй другие.
я сам это не проверял, но по идее должно работать.
← →
Denis group (2004-01-03 19:28) [7]
HandleFile:=FileOpen(PChar("Names"),fmOpenRead);
if HandleFile<>-1 then
begin
FileClose(HandleFile);
Recycle(PChar("Names"),Handle);см. выше
end;
Удаляются быстро и без ошибок но не все т.е. некоторые раньше удалялись теперь не хотят.
← →
DDA (2004-01-03 20:03) [8]CYBERWOLF © (03.01.04 18:57) [6]
как они переместяться если к ним закрыт доступ
тут только открытием можно(наверное) проверить
Denis group © (03.01.04 19:28) [7]
как это монимать :
т.е. некоторые раньше удалялись теперь не хотят.
← →
DDA (2004-01-03 20:12) [9]попробуй не просто открывать а открывать на чтение и запись и fmShareExclusive
i:=FileOpen("c:\dda.dda",fmOpenReadWrite or fmShareExclusive);
если будет доступ после этого - тогда точно можно будет удалить
← →
Denis group (2004-01-03 20:13) [10]Я сначала пробую открыть, потом закрываю, если не закрыть файл то вобще не чё не удалить вот так то.
DDA
как это монимать :
DeleteFile их удаляет. Recycle тоже только если сначала не проверять(FileOpen), но тогда прога страшно тормазит.
Главно поместить в корзинку а как не имеет значения.
← →
имя (2004-01-03 22:25) [11]Удалено модератором
← →
Denis group (2004-01-04 10:47) [12]Ну кто самый умный ?
Кто ещё подскажет ?
← →
Palladin (2004-01-04 11:28) [13]Ты наверное самый умный... умнее нет никого...
← →
Denis group (2004-01-04 13:26) [14]Palladin
А ты сам попробуй.
ЗЫ
← →
Denis group (2004-01-04 14:23) [15]Далеко не самый изящный вариант, но…
procedure TForm1.Button1Click(Sender: TObject);
var F: TextFile;
begin AssignFile(F, "1.exe");
{$I-} Append(F);
if IOResult = 0 then begin ShowMessage("Файл свободен");
CloseFile(F);
end
else ShowMessage("Файл занят");
{$I+}
end;
Так можно проверить на блокировку...
Уже проверяю...
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.01.16;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.01 c