Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Удалении директории при удалении записи [D7, Access]


Страницы:   1 2

любитель ©   (2006-11-09 18:51:00) 

Во время добавлении записи в базу помещаю путь добавленного файла (поле Dir )и создаю папку (формата 200611091628)куда этот файл копируеться, как мне при удалении этой записи удалить и папку с этим файлом


Любитель   (2006-11-14 16:05:00) [1]

Все спасиба вроде решил

if ADOQuery1.FieldByName('Dir').AsString=''  then
Showmessage('Запись удаленна')
 else
  if DirectoryExists(ExtractFilePath(Application.EXEName)+ 'Files\' + (fmain.ADOQuery1.FieldValues['Dir'])) then
   begin
RecurseDeleteFolder(ExtractFilePath(Application.EXEName) + 'Files\' + (fmain.ADOQuery1.FieldValues['Dir'])+ '\') ;
   Showmessage('Запись удаленна вместе с вложенными файлами');
   end;


если в поле Dir пусто то просто удаляем строку
иначе
если существует дириктория указанная в поле Dir
то удаляем ее


Anatoly Podgoretsky   (2006-11-14 15:52:00) [2]

> Любитель  (14.11.2006 15:47:28)  [28]

Удалять не папку, а содержимое папки


Любитель   (2006-11-14 15:47:00) [3]

Спасиба ANB
а вот как сделать что бы дириктории Files не удалялась хотя в ней и нечего нет


ANB   (2006-11-13 18:39:00) [4]


> Любитель   (13.11.06 18:19) [26]

Дык так и должно быть, если у тебя в поле Dir пусто. Поставь проверки на :
1. Отсутствие папки на диске
2. Пустоте в поле Dir.
ЗЫ. Кстати, доступ к полю БД не самая шустрая операция. Да и код длиннее. Скопируй его значение в обычную переменную.
ЗЫЫ. Лучше юзать FieldByName('Dir').AsString. Оно понадежнее как то. Хотя ИМХО это.


Любитель   (2006-11-13 18:19:00) [5]

и еще если в дириктории Files нет нечего то полностью удаляеться она


Любитель   (2006-11-13 17:37:00) [6]

Тут возник у меня такой баг

procedure TFmain.ADOQuery1BeforeDelete(DataSet: TDataSet);
begin
     bRun:=true;
   if DirectoryExists(ExtractFilePath(Application.EXEName)+ 'Files\' + (fmain.ADOQuery1.FieldValues['Dir'])) then
   begin
RecurseDeleteFolder(ExtractFilePath(Application.EXEName) + 'Files\' + (fmain.ADOQuery1.FieldValues['Dir'])+ '\') ;
   Showmessage('Запись удаленна вместе с вложенными файлами');
       end
else
   Showmessage('Запись удаленна')
end;

когда удаляешь строчку в которой нет директории то через раз выдает
process cannot access the file because it is being used by another proccess
( процесс не может получить доступ к файлу, потому что это используется другим proccess)
похоже это возникает после того как удалил строку с директорией а потом строку без директории и удаление директории происходит только после закрытия самой программы


Любитель   (2006-11-13 16:48:00) [7]

Все спасиба всем за помощь и терпение особенно ANB
изменил ADOQuery1AfterDelete на ADOQuery1BeforeDelete
и сделал как сказал ANB  [20] все заработал


ANB   (2006-11-13 16:10:00) [8]


> Amoeba ©   (13.11.06 15:09) [21]

Если честно - ее чаще клинит. Я уже пробовал ее, но рекурсивно чистить оказалось надежнее. Хотя очень заманчиво - все одним оператором да еще и в корзину.


Anatoly Podgoretsky   (2006-11-13 15:25:00) [9]

> А если посмотреть в сторону функции SHFileOperation?

Ну это слишком просто и тривиально.


Amoeba   (2006-11-13 15:09:00) [10]

А если посмотреть в сторону функции SHFileOperation?
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=91


ANB   (2006-11-13 14:48:00) [11]


> Любитель   (13.11.06 14:09) [18]

Возьми заново мою функцию и замени в ней WriteToLogRes на ShowMessage
и опять убери bRun. Впрочем, еще лучше заведи переменную или свойство формы с таким именем bRun : Boolean; Перед запуском процедуры установи его в True;


Anatoly Podgoretsky   (2006-11-13 14:30:00) [12]

> Любитель  (13.11.2006 13:57:17)  [17]

Это что основание? :-)

--


Любитель   (2006-11-13 14:09:00) [13]

хорошо попробую
>Кстати, а причем тут базы данных ?
ADOQuery1.FieldValues['Dir']

Бред какой-то

procedure RecurseDeleteFolder(sFrom: String);
var SearchRec: TSearchRec;
  FileAttrs, rc, Err : Integer;
  sName, sFullNameFrom, sErrMsg : String;
begin
{Рекурсивный поиск списка папок}
   FileAttrs := 1 + faDirectory
+faHidden+faArchive+faAnyFile;
rc:= SysUtils.FindFirst(sFrom + '*.*', FileAttrs, SearchRec);
if (rc = 0) then begin
repeat
 sName := SearchRec.Name;
 if ((sName <> '.') and (sName <> '..'))
 then begin
  sFullNameFrom := sFrom + sName;
  if ((SearchRec.Attr and faDirectory) <> 0) then begin
   // Папки
   // Вызовем сами себя рекурсивно
   RecurseDeleteFolder(IncludeTrailingPathDelimiter(sFullNameFrom));
  end else begin
   // Файлы удалим
   // Сбросим флаги
   if (not SetFileAttributes(PChar(sFullNameFrom), 0))
   then begin
    Err := GetLastError;
    sErrMsg := SysErrorMessage(Err);
            end;
   // Удалим
   if (not DeleteFile(PChar(sFullNameFrom)))
   then begin
    Err := GetLastError;
    sErrMsg := SysErrorMessage(Err);
    Exit;
   end;
  end;
 end;
      until FindNext(SearchRec) <> 0;
FindClose(SearchRec);
end;
// Удалим папку
// Уберем из имени слеш
sFullNameFrom :=  ExcludeTrailingPathDelimiter(sFrom);
if (not RemoveDirectory(PChar(sFullNameFrom)))
then begin
Err := GetLastError;
sErrMsg := SysErrorMessage(Err);
end;
end;

procedure TFmain.ADOQuery1AfterDelete(DataSet: TDataSet);
begin

   if DirectoryExists(ExtractFilePath(Application.EXEName)+ 'Files\' + (fmain.ADOQuery1.FieldValues['Dir'])) then
RecurseDeleteFolder(ExtractFilePath(Application.EXEName) + 'Files\' + (fmain.ADOQuery1.FieldValues['Dir'])+'\')


>ЗЫ. Возьми мою процедуру, подкрути и не парься. Она не сможет удалить только в случае, если директория занята. Но при этом ругнется.

Все тоже самое удаляет строку а директорию не трогает


Любитель   (2006-11-13 13:57:00) [14]

хорошо попробую
>Кстати, а причем тут базы данных ?
ADOQuery1.FieldValues['Dir']


ANB   (2006-11-13 12:51:00) [15]

Кстати, а причем тут базы данных ?


ANB   (2006-11-13 12:51:00) [16]

Непустую директорию удалить низзя. Почитай описание команды RmDir.
И как ты проверял наличие ошибки ?
ЗЫ. Возьми мою процедуру, подкрути и не парься. Она не сможет удалить только в случае, если директория занята. Но при этом ругнется.


Любитель   (2006-11-13 12:42:00) [17]

Нету ни какой ошибки просто удаляеться запись а директория остаеться

Да директория не пустая


ANB   (2006-11-13 11:34:00) [18]


> Любитель   (13.11.06 11:28) [12]

Посмотри на код ошибки. Скорее всего у тебя дирректория не пустая. Или занята какой то программой.


Любитель   (2006-11-13 11:28:00) [19]

пОМОГИТЕ РАЗОБРАТЬСЯ, использую такую функцию
в базу записываеться такого формата Dir ( 200611131003)

 function DeleteDir(Dir  : string)  : boolean;
Var
Found  : integer;
SearchRec : TSearchRec;
begin
 result:=false;
 if IOResult<>0 then ;
 ChDir(Dir);
 if IOResult<>0 then begin
  ShowMessage('Не могу войти в каталог: '+Dir); exit;
 end;
 Found := FindFirst('*.*', faAnyFile, SearchRec);
 while Found = 0 do
 begin
  if (SearchRec.Name<>'.')and(SearchRec.Name<>'..') then
   if (SearchRec.Attr and faDirectory)<>0 then begin
    if not DeleteDir(SearchRec.Name) then exit;
   end else
    if not DeleteFile(SearchRec.Name) then begin
     ShowMessage('Не могу удалить файл: '+SearchRec.Name); exit;
    end;
   Found := FindNext(SearchRec);
 end;
 FindClose(SearchRec);
 ChDir('..'); RmDir(Dir);
 result:=IOResult=0;
end;

procedure TFmain.ADOQuery1AfterDelete(DataSet: TDataSet);
begin
   if DirectoryExists(ExtractFilePath(Application.EXEName)+ 'Files\' + (fmain.ADOQuery1.FieldValues['Dir'])) then
DeleteDir(ExtractFilePath(Application.EXEName) + 'Files\' + (fmain.ADOQuery1.FieldValues['Dir']))
else
Showmessage('Директория не существеут или уже удаленна')
end;


НЕ удаляет директорию а поторобвал просто в ручную вписать 200611131003
все нормально удаляет


ANB   (2006-11-10 18:10:00) [20]


> Любитель   (10.11.06 17:07) [9]

Путь желательно подавать полный. С относительным я не проверял. Для приклейки слеша в конце есть специальная функция - она делает это аккуратнее (пример есть в моем коде).


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо