Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 18.03.2011, 14:57
Johny1992 Johny1992 вне форума
Прохожий
 
Регистрация: 18.03.2011
Сообщения: 2
Репутация: 10
Злость Не удаётся удалить папку

Здравствуйте, очень нужна помощь знающих программистов.

Дело такое. Я делаю диплом на делфи. Программа получается огромная, работает отлично, от всевозможных ошибок пользователей я её уже оградил. Программа работает с импровизированной "базой данных", которая из себя представляет просто папки с файлами внутри каталога программы. Так вот, есть в этой программе место(модуль) где пользователь с административными правами может удалить не нужные папки из базы данных, без возни в файловой системе. До сегодняшнего дня этот модуль отлично удалял папки, каждая папка удалялась вот такой функцией:

Код:
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  
Старый 18.03.2011, 15:12
Assistant Assistant вне форума
Продвинутый
 
Регистрация: 20.02.2011
Адрес: там где правят идиоты
Сообщения: 603
Версия Delphi: 7
Репутация: выкл
По умолчанию

перед удалением папки, попробуй сделать ChDir, смени директорию на другую, что бы не занимать текущую.
__________________
взялся из неоткуда, ничего не прошу, помогаю просто так
ICQ: 593977748 - стучать в случае КРАЙНЕЙ необходимости, ну, или если вы со Ставрополя
Ответить с цитированием
  #3  
Старый 18.03.2011, 15:22
Johny1992 Johny1992 вне форума
Прохожий
 
Регистрация: 18.03.2011
Сообщения: 2
Репутация: 10
По умолчанию

спасибо, но не получается

попробовал
ChDir('C:\Program Files\');
MyRemoveDir(ExtractFilePath(Application.ExeName)+' img\examples\intro1\ugkp.jpg');

всё равно не удаляется(прога у меня на диске E:\);

==========================================

господи боже, извините меня ради всего святого. я нашёл свою ошибку и она вообще в другом месте! не знаю почему, но я её нашёл только после того как задал здесь вопрос!

совершенно в другом модуле, который загружает изображения, два раза открывается FindFirst, а закрывается один раз. Вот один незакрытый FindFirst и привёл к такому результату. Ещё раз извиняюсь за тему, проглядел что-то видимо.

Последний раз редактировалось Johny1992, 18.03.2011 в 15:37.
Ответить с цитированием
  #4  
Старый 18.03.2011, 15:38
Assistant Assistant вне форума
Продвинутый
 
Регистрация: 20.02.2011
Адрес: там где правят идиоты
Сообщения: 603
Версия Delphi: 7
Репутация: выкл
По умолчанию

карочи нифига не пойму как оно у тебя работает ))
__________________
взялся из неоткуда, ничего не прошу, помогаю просто так
ICQ: 593977748 - стучать в случае КРАЙНЕЙ необходимости, ну, или если вы со Ставрополя

Последний раз редактировалось Assistant, 18.03.2011 в 15:44.
Ответить с цитированием
  #5  
Старый 18.03.2011, 15:50
Assistant Assistant вне форума
Продвинутый
 
Регистрация: 20.02.2011
Адрес: там где правят идиоты
Сообщения: 603
Версия Delphi: 7
Репутация: выкл
По умолчанию

Цитата:
господи боже, извините меня ради всего святого
а вот и не извеним, покупай нам ящик пива теперь
__________________
взялся из неоткуда, ничего не прошу, помогаю просто так
ICQ: 593977748 - стучать в случае КРАЙНЕЙ необходимости, ну, или если вы со Ставрополя
Ответить с цитированием
  #6  
Старый 18.03.2011, 16:00
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Ну все в принципе понятно, рекурсивный обход каталогов с удалением всех файлов, и последующим удалением самого каталога. Но вот я не понял зачем сначала менять аттрибут файла а затем этот файл удалять? Зачем вообще меняется аттрибут?
И потом, есть уже готовый модуль работы с файловой системой IOUtils, а в нем для TDirectory есть метод Delete(const Path: string; const Recursive: Boolean);
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 01:39.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025