![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Здравствуйте, очень нужна помощь знающих программистов.
Дело такое. Я делаю диплом на делфи. Программа получается огромная, работает отлично, от всевозможных ошибок пользователей я её уже оградил. Программа работает с импровизированной "базой данных", которая из себя представляет просто папки с файлами внутри каталога программы. Так вот, есть в этой программе место(модуль) где пользователь с административными правами может удалить не нужные папки из базы данных, без возни в файловой системе. До сегодняшнего дня этот модуль отлично удалял папки, каждая папка удалялась вот такой функцией: Код:
function MyRemoveDir(sDir : string) : Boolean; var iIndex: Integer; SearchRec: TSearchRec; sFileName: string; begin Result := False; sDir := sDir + '\*.*'; iIndex := FindFirst(sDir, faAnyFile, SearchRec); while iIndex = 0 do begin sFileName := ExtractFileDir(sDir)+'\'+SearchRec.name; if SearchRec.Attr = faDirectory then begin if (SearchRec.name <> '' ) and (SearchRec.name <> '.') and (SearchRec.name <> '..') then MyRemoveDir(sFileName); end else begin if SearchRec.Attr <> faArchive then FileSetAttr(sFileName, faArchive); if not DeleteFile(sFileName) then ShowMessage('Невозможно удалить ' + sFileName); end; iIndex := FindNext(SearchRec); end; FindClose(SearchRec); RemoveDir(ExtractFileDir(sDir)); Result := True; end; Но сегодня у меня в плане было добавить большой функционал программе. Этот функционал косвенно связан с изображениями. Добавил я этот функционал, и начал заново проверять все модули программы. Всё работает отлично, кроме удаления папок! Папки, в которых лежат изображения, не удаляются. Ну никак не удаляются. Но при этом они удаляются после того как программа закрывается. Т.е. запрос на удаление ждёт своей очереди до тех пор, пока программа не перестанет работать. Но во время работы программы, папка не удаляется, а надо чтоб удалялось именно во время работы программы. Напишу примерно, что мы имеем. Представьте, что при нажатии на Button1, в Image1 грузится картинка из определенной папки: Код:
procedure TForm1.Button1Click(Sender: TObject); begin Image1.Picture.LoadFromFile(ExtractFilePath(Application.ExeName)+'img\no_image.jpg'); end; А потом нажимаете Button2, пытаясь удалить папку с картинкой, с помощью той функции, которую я написал выше. Код:
procedure TForm1.Button2Click(Sender: TObject); begin Image1.Picture.Free; MyRemoveDir(ExtractFilePath(Application.ExeName)+'img'); end; я сюда не вставляю свой код так как он большой и там много мелочей но главный смысл - в этом. Грузится картинка в компонент TImage, а потом мне вдруг вот захотелось удалить папку, откуда была загружена картинка. Папка не удаляется, она остаётся в системе, но к ней теряется доступ и вообще с ней нельзя ничего сделать, пока не выйдеш из программы. А как выйдешь из программы, она наконец удалится. Но такая схема работы не очень устраивает. Я уже пробовал и по всякому очищать компонент с изображением(Free, Nil, Assign(nil) ). Ничего не помогает. я знаю 100% что папка не удаляется изза того, что я добавил в программу работу с изображениями. Т.к. в программе остался обычный текстовый режим, и если с папками работать в текстовом режиме - они спокойно удаляются, как и раньше, как и год назад. что сделать, чтобы папка удалялась? помогите, этому проекту уже два года и он много значит для меня и для моего отделения |
#2
|
|||
|
|||
![]() перед удалением папки, попробуй сделать ChDir, смени директорию на другую, что бы не занимать текущую.
взялся из неоткуда, ничего не прошу, помогаю просто так ICQ: 593977748 - стучать в случае КРАЙНЕЙ необходимости, ну, или если вы со Ставрополя ![]() |
#3
|
|||
|
|||
![]() спасибо, но не получается
попробовал ChDir('C:\Program Files\'); ![]() MyRemoveDir(ExtractFilePath(Application.ExeName)+' img\examples\intro1\ugkp.jpg'); всё равно не удаляется(прога у меня на диске E:\); ========================================== господи боже, извините меня ради всего святого. я нашёл свою ошибку и она вообще в другом месте! не знаю почему, но я её нашёл только после того как задал здесь вопрос! совершенно в другом модуле, который загружает изображения, два раза открывается FindFirst, а закрывается один раз. Вот один незакрытый FindFirst и привёл к такому результату. Ещё раз извиняюсь за тему, проглядел что-то видимо. Последний раз редактировалось Johny1992, 18.03.2011 в 15:37. |
#4
|
|||
|
|||
![]() карочи нифига не пойму как оно у тебя работает ))
взялся из неоткуда, ничего не прошу, помогаю просто так ICQ: 593977748 - стучать в случае КРАЙНЕЙ необходимости, ну, или если вы со Ставрополя ![]() Последний раз редактировалось Assistant, 18.03.2011 в 15:44. |
#5
|
|||
|
|||
![]() Цитата:
![]() взялся из неоткуда, ничего не прошу, помогаю просто так ICQ: 593977748 - стучать в случае КРАЙНЕЙ необходимости, ну, или если вы со Ставрополя ![]() |
#6
|
||||
|
||||
![]() Ну все в принципе понятно, рекурсивный обход каталогов с удалением всех файлов, и последующим удалением самого каталога. Но вот я не понял зачем сначала менять аттрибут файла а затем этот файл удалять? Зачем вообще меняется аттрибут?
И потом, есть уже готовый модуль работы с файловой системой IOUtils, а в нем для TDirectory есть метод Delete(const Path: string; const Recursive: Boolean); Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |