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

Вниз

Удалять файлы в корзину без ошибок и тормозов.   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.034 c
6-49673
gedd
2003-11-16 18:11
2004.01.16
Определение имени активного DialUp соединения если их несколько?


1-49521
Dim-
2004-01-03 02:48
2004.01.16
MDI форма и возврат значений


3-49448
stem
2003-12-18 11:42
2004.01.16
dbloocuplistbox


14-49762
PVOzerski
2003-12-24 10:23
2004.01.16
Федорино горе, или о забавных нелепостях в названиях программ


8-49648
ChekhlatyAndrew
2003-09-15 20:29
2004.01.16
масштабирование и конвертирование в ч б