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

Вниз

как удалить файл   Найти похожие ветки 

 
not The Vizit0r!   (2003-12-17 17:17) [0]

Народ! А как удалить файл так, чтобы был виндовый запрос на удаление?


 
Anatoly Podgoretsky ©   (2003-12-17 17:20) [1]

Используй MessageBox с должными флагами


 
not The Vizit0r!   (2003-12-17 17:22) [2]

а по другому... нельзя?... в смысле на иконку красивую(для диалога удаления) ресурсов трать влом...


 
not The Vizit0r!   (2003-12-17 17:23) [3]

а типа... еще... а как вообще можно удалить файл в корзинУ?


 
Anatoly Podgoretsky ©   (2003-12-17 17:24) [4]

ShFileOperation


 
serge   (2003-12-17 17:33) [5]

Взято с Королевства ...

Разумеется, вам нужно вставить в секцию uses модуль ShellAPI, в котором определена функция SHFileOperation.

Рассмотрим самое простое - удаление файлов.

procedure TForm1.Button1Click(Sender: TObject);
var
SHFileOpStruct : TSHFileOpStruct;
From : array [0..255] of Char;
begin
SetCurrentDirectory( PChar( "C:\" ) );
From := "Test1.tst" + #0 + "Test2.tst" + #0 + #0;
with SHFileOpStruct do
begin
Wnd := Handle;
wFunc := FO_DELETE;
pFrom := @From;
pTo := nil;
fFlags := 0;
fAnyOperationsAborted := False;
hNameMappings := nil;
lpszProgressTitle := nil;
end;
SHFileOperation( SHFileOpStruct );
end;

Обратите внимание, что ни один из флагов не установлен. Если вы хотите не просто удалить файлы, а переместить их в корзину, должен быть установлен флаг FOF_ALLOWUNDO.

Для удобства дальнейших экспериментов напишем функцию, создающую из массива строк буфер для передачи его в качестве параметра pFrom. После каждой строки в буфер вставляется нулевой байт, в конце списка - два нулевых байта.
type TBuffer = array of Char;

procedure CreateBuffer( Names : array of string; var P : TBuffer );
var I, J, L : Integer;
begin
for I := Low( Names ) to High( Names ) do
begin
L := Length( P );
SetLength( P, L + Length( Names[ I ] ) + 1 );
for J := 0 to Length( Names[ I ] ) - 1 do
P[ L + J ] := Names[ I, J + 1 ];
P[ L + J ] := #0;
end;
SetLength( P, Length( P ) + 1 );
P[ Length( P ) ] := #0;
end;

Выглядит ужасно, но работает. Можно написать красивее, просто лень.

И, наконец, функция, удаляющая файлы, переданные ей в списке Names. Параметр ToRecycle определяет, будут ли файлы перемещены в корзину или удалены. Функция возвращает 0, если операция выполнена успешно, и ненулевое значение, если руки у кого-то растут не из того места, и этот кто-то всунул функции имена несуществующих файлов.
function DeleteFiles( Handle : HWnd; Names : array of string; ToRecycle : Boolean ) : Integer;
var
SHFileOpStruct : TSHFileOpStruct;
Src : TBuffer;
begin
CreateBuffer( Names, Src );
with SHFileOpStruct do
begin
Wnd := Handle;
wFunc := FO_DELETE;
pFrom := Pointer( Src );
pTo := nil;
fFlags := 0;
if ToRecycle then fFlags := FOF_ALLOWUNDO;
fAnyOperationsAborted := False;
hNameMappings := nil;
lpszProgressTitle := nil;
end;
Result := SHFileOperation( SHFileOpStruct );
Src := nil;
end;

Обратите внимание, что мы освобождаем буфер Src простым присваиванием значения nil. Если верить документации, потери памяти при этом не происходит, а напротив, происходит корректное уничтожение динамического массива. Каким образом, правда - это рак мозга :-).

Проверяем :
procedure TForm1.Button1Click(Sender: TObject);
begin
DeleteFiles( Handle, [ "C:\Test1", "C:\Test2" ], True );
end;

Вроде все работает.

Кстати, обнаружился забавный глюк - вызовем процедуру DeleteFiles таким образом:
procedure TForm1.Button1Click(Sender: TObject);
begin
SetCurrentDirectory( PChar( "C:\" ) );
DeleteFiles( Handle, [ "Test1", "Test2" ], True );
end;

Файлы "Test1" и "Test2" удаляются совсем, без помещения в корзину, несмотря на установленный флаг FOF_ALLOWUNDO. Мораль: при использовании функции SHFileOperation используйте полные пути всегда, когда это возможно.
Ну, с удалением файлов разобрались.



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

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

Наверх




Память: 0.49 MB
Время: 0.013 c
8-99655
Ilya_
2003-08-27 04:53
2003.12.30
Не могу открыть сохранённый в Delphi 3 bmp файл


1-99603
Виталя
2003-12-17 12:48
2003.12.30
Соскакивающее TMEMO


1-99632
Gloomer
2003-12-16 12:26
2003.12.30
Отслеживание изменения файлов


6-99672
Melcor
2003-10-31 14:54
2003.12.30
Как отправлять пакеты по сети?


1-99547
Ivolg
2003-12-16 11:18
2003.12.30
Конвертация!