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

Вниз

DeleteFile   Найти похожие ветки 

 
Vova   (2008-11-12 14:21) [0]

Подскажите пожалуйста новичку,
Я пытаюсь удалить файл функцией DeleteFile
Всё нормально, но когда атрибут файла "только для чтения" функция не хочет его удалять и выдает ошибку #5,
В windows можно ведь любые файлы удалять и "только для чтения" и с другими атрибутами, как мне это сделать?


 
clickmaker ©   (2008-11-12 14:25) [1]

сначала сбрось атрибут


 
Vova   (2008-11-12 15:10) [2]


> сначала сбрось атрибут


Сделал так как Вы посоветовали - работает, спасибо!
(
if GetFileAttributes(PChar(fileName)) = 33 then
           SetFileAttributes(PChar(fileName), 32);
)


 
Поросенок Винни-Пух ©   (2008-11-12 15:18) [3]

неверно.


 
clickmaker ©   (2008-11-12 15:52) [4]

> [2] Vova   (12.11.08 15:10)

а если у файла окажутся еще атрибуты кроме 32 и 1?


 
Anatoly Podgoretsky ©   (2008-11-12 16:44) [5]

> Vova  (12.11.2008 15:10:02)  [2]

Неправильно, но для простейшего случая, тем более для удаления пойдет.


 
Anatoly Podgoretsky ©   (2008-11-12 16:44) [6]

> clickmaker  (12.11.2008 15:52:04)  [4]

Ничего страшного, удалятся только часть файлов.


 
Vova   (2008-11-13 00:45) [7]


> Неправильно, но для простейшего случая, тем более для удаления
> пойдет.


Надо сделать правильно, как сделать правильно?


 
Palladin ©   (2008-11-13 08:53) [8]


> Надо сделать правильно, как сделать правильно?

изучить, что такое биты и как с ними работать. операции or, and
ну и xor и not до кучи. понять что такое атрибуты файла, как они хранятся.

и тогда ты сможешь сделать правильно.


 
Рамиль ©   (2008-11-13 08:57) [9]

Атрибут файла это dword, каждый бит отвечает за какой либо атрибут (или зарезервирован). Соот. надо сбросить биты readonly, hidden, system.

http://msdn.microsoft.com/en-us/library/aa915578.aspx


 
Vayrus   (2008-11-21 10:06) [10]

function DeleteFileMain(ABWG: String): Boolean;
begin
RESULT := SetFileAttributes(PChar(ABWG), 0);
if RESULT then
begin
RESULT := DeleteFile(PChar(ABWG));
Application.ProcessMessages;
Sleep(500);
Application.ProcessMessages;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
if DeleteFileMain("test.exe") then
ShowMessage("Done") else
ShowMessage("Error");
end;


 
Riply ©   (2008-11-21 11:14) [11]

> [10] Vayrus   (21.11.08 10:06)

А можно пояснить код ?


 
Anatoly Podgoretsky ©   (2008-11-21 11:27) [12]


> Vayrus   (21.11.08 10:06) [10]

Еще один, которые не читал http://www.podgoretsky.com/OtherParts/DM/BadWill.aspx №4


 
Anatoly Podgoretsky ©   (2008-11-21 11:29) [13]


> А можно пояснить код ?

Психотренировку пройти хочешь?


 
Riply ©   (2008-11-21 11:34) [14]

> [13] Anatoly Podgoretsky ©   (21.11.08 11:29)

> Психотренировку пройти хочешь?

Неа. Просто интересно :)


 
Anatoly Podgoretsky ©   (2008-11-21 11:42) [15]

> Riply  (21.11.2008 11:34:14)  [14]

Тогда ты рисковый игрок :-)


 
Palladin ©   (2008-11-21 11:50) [16]


> А можно пояснить код ?

пояснения просты: откуда то содрано :)


 
clickmaker ©   (2008-11-21 12:05) [17]

DeleteFileMain наводит на мысль, что должна быть еще функция для не главных файлов


 
Anatoly Podgoretsky ©   (2008-11-21 12:30) [18]

А может не главная?


 
Vayrus   (2008-11-21 14:20) [19]


> Еще один, которые не читал http://www.podgoretsky.com/OtherParts/DM/BadWill.
> aspx №4


Реклама?


> пояснения просты: откуда то содрано :)


Наглая лож, не всем же откуда то сдирать


> DeleteFileMain наводит на мысль, что должна быть еще функция
> для не главных файлов


Ни на че не наводит, взято на абум


> А может не главная?


Не надоело до слов докапываться?


 
Vayrus   (2008-11-21 14:28) [20]


> А можно пояснить код ?


Сначало скидываем все атрибуты файла и если все получилось, то пытаемся удалить, пауза выставлена потому, что функция DeleteFile возвращает результат до того как фактически удалит файл, то есть мы даем, скажем так, дополнительное время для функции. А так как использование ПАУЗЫ подвешивает приложение (или если ты будешь удалять несколько файлов), то пришлось позаботиться и об этом - ProcessMessages.

Если ТРУЕ то все пучком, иначе что то пошло не так.


 
Palladin ©   (2008-11-21 14:28) [21]


> Vayrus   (21.11.08 14:20) [19]

а самое главное это конечно sleep и Application.ProcessMessages :) без этого ничего не заработает


 
Vayrus   (2008-11-21 14:29) [22]


> а самое главное это конечно sleep и Application.ProcessMessages
> :) без этого ничего не заработает


Заработает для мелковесных файлов



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

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

Наверх




Память: 0.51 MB
Время: 0.011 c
8-1188577736
hahol
2007-08-31 20:28
2009.01.04
DirectShow


4-1203344424
Cj
2008-02-18 17:20
2009.01.04
SetFileSecurity


15-1226250463
aKor
2008-11-09 20:07
2009.01.04
Компонент ShellListView только такой чтобы работал с http


8-1188126179
Dr. Andrew
2007-08-26 15:02
2009.01.04
Как нарисовать спираль Fermat с отрисовкой в писелах?


15-1225451619
KSergey
2008-10-31 14:13
2009.01.04
Беда с компьютером: винчестер постоянно занят