Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Удаление файлов и папок

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2

Открыть новую тему     Написать ответ в эту тему

kryn

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Кто подскажет как  при помощи DELFI  удалить папку вместе с файлами и другими папками (можете назвать их каталоги, директории). Через win API у меня идет несовмещение с другимм OS. Пожалуйста приведите примеры. Буду рад любой помощи

Всего записей: 5 | Зарегистр. 03-11-2003 | Отправлено: 08:54 06-11-2003
MetroidZ



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
 
 Q: Как удалить папку со всем содержимым?
A: 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;
 

 
из http://www.delphi.dax.ru/?faq&sid=0&mid=1
P.S. вопрос из FAQ.

Всего записей: 1795 | Зарегистр. 12-07-2003 | Отправлено: 11:30 06-11-2003
phi1

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
kryn
У меня эта проц-ра ищет и пихает в stringlist все файлы bmp в данной директории и всех ее субдиректориях. Непомню уже, откуда списАл.

Код:
 
procedure GET_FILES(var flslist:TStringList;dir:string);
var subdir:string;
    SrecDir:TSearchRec;
begin
if SysUtils.FindFirst(dir+'\*.bmp',faAnyfile,Srec)=0 then
  REPEAT
  flslist.Add(dir+'\'+Srec.Name);
  UNTIL SysUtils.FindNext(Srec)<>0;  //Srec
  SysUtils.FindClose(Srec);   //flslist.count
SrecDir.ExcludeAttr:=not faDirectory;
if SysUtils.FindFirst(dir+'\*',faDirectory,SrecDir)=0 then
  REPEAT
  if (SrecDir.Name<>'.') and (SrecDir.name<>'..')
    and ((SrecDir.Attr and FaDirectory) <> 0) then
    begin
    subdir:=dir+'\'+SrecDir.name;
    GET_FILES(flslist,subdir);
    end;
  UNTIL SysUtils.FindNext(SrecDir)<>0;
  SysUtils.FindClose(SrecDir);
END;
 

 

Всего записей: 531 | Зарегистр. 19-03-2003 | Отправлено: 12:57 06-11-2003
redp

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
может все еще проще - заюзать метод DeleteFolder системного OLE объекта FileSystemObject ?

Всего записей: 514 | Зарегистр. 16-06-2003 | Отправлено: 17:39 06-11-2003
merlkerry

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
redp

Цитата:
может все еще проще - заюзать метод DeleteFolder системного OLE объекта FileSystemObject ?

 
может, но тогда накидай все это в виде кода на Дельфях

----------
Вокруг одни враги.
Я испытываю естественный скептицизм по поводу чистоты человеческих намерений.

Всего записей: 1521 | Зарегистр. 16-09-2002 | Отправлено: 18:33 07-11-2003
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
DELFI

Во-первых, Delphi. . Надо знать на чем программируешь.
Во-вторых, под какими еще ОС отличными от Вынь, ты собираешься юзать проект? И как?
В-третьих, все примеры, которые тебе привели все равно юзают АПИ. Кто не верит, посмотрите реализацию FindFirst FindNext они в конечном итоге вызывают стандартные FindFirstFile FindNextFile. Если хочешь делать кроссплатформенную удалялку файлов юзай Ansi С и в нем используй любой рекурсивный алгоритм удаления папки(директории etc.) Только тогда будет переносимость под разные ОСИ.
А под Вынь можно использовать стандартный вызов функции ПолуПроводника
 

Цитата:
 
Performs a copy, move, rename, or delete operation on a file system object.  
 
WINSHELLAPI int WINAPI SHFileOperation(
 
    LPSHFILEOPSTRUCT lpFileOp
   );
 

Но имеется ряд ограничений. Попробуй поймешь. Так что определись где твоя прога должна работать и юзай что надо.

----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 01:05 10-11-2003
kryn

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Спасибо за помощь! Желательно чтобы программа работала под Win 9*/2000/XP. Не мог бы ты ShivADest привести более подробный пример, например уделение всех файлов и подкаталогов в папке Test и папке Test2, но при этом  местонахождение данных папок на винте неизвестно.

Всего записей: 5 | Зарегистр. 03-11-2003 | Отправлено: 09:23 10-11-2003
MetroidZ



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Желательно чтобы программа работала под Win 9*/2000/XP

function DeleteDir будет работать на всех перечисленных! Можно и под DOS если немного изменить.
Куда же подробнее можно расписать DeleteDir ? Ну разве то, что добавить удаление не смотря на атрибуты файла.
Вызывать стандартный диалог удаления иногда оказывается несолидно

Цитата:
 но при этом  местонахождение данных папок на винте неизвестно

Так надо их сначала найти! А если их несколько/нет ?

Всего записей: 1795 | Зарегистр. 12-07-2003 | Отправлено: 09:34 10-11-2003
kryn

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Мне нужно чтоб данные папки искались по всему винту и файлы как ты правильно заметил удалялись бы не смотря на атрибуты. Распиши мне пожалуйста поподробнее. Я только начинаю осваивать Delphi.
 
 
 

Всего записей: 5 | Зарегистр. 03-11-2003 | Отправлено: 10:08 10-11-2003
ironwit

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
kryn
 
не проще ли сказать конечную задачу, чтобы было проще отвечать?

----------
Don't drink, and drive. Smoke and fly.

Всего записей: 1892 | Зарегистр. 11-10-2002 | Отправлено: 10:17 10-11-2003
kryn

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Конечная задача такова:
Необходимо чтобы при нажатии на пустой форме кнопки "Удалить" - удалялись бы паример файлы и подкаталоги из папок Test и Test2 не смотря на атрибуты и при этом данные папки должны автоматом искаться по всему винту.

Всего записей: 5 | Зарегистр. 03-11-2003 | Отправлено: 10:27 10-11-2003
Sleepwalker



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
нифига се.. искаться по всему винту...
рекурсивная функция c findfirst/findnext...

----------
...или я ничего не понимаю в этой жизни... или понимаю слишком хорошо...

Всего записей: 1957 | Зарегистр. 19-10-2002 | Отправлено: 10:54 10-11-2003
ironwit

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Sleepwalker

Цитата:
рекурсивная функция c findfirst/findnext...  

 
не полностью
 
получить список дисков
пока список не закончился
прочитать рекурсивно список каталогов, при нахождении нового каталога проверять что она равен test или test2, если да занести в список (для простоты)
список дисков закончился
 
удалить все каталоги из списка( по моему есть какая то функция windows для этого, или опять же польузясь рекурсивным алгоритмом).
 
Для поиска (чтобы не замарачиватся) можно применить компонент teasyfilesearch (google.com) Там есть события onfoundfile и onfounddir (кажется)  
 
Вот в общих чертах алгоритм (ИМХО)

----------
Don't drink, and drive. Smoke and fly.

Всего записей: 1892 | Зарегистр. 11-10-2002 | Отправлено: 15:48 10-11-2003
sawamail



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
kryn
Можно попробовать использовать из shell32.dll ф-ю
int SHFileOperation(LPSHFILEOPSTRUCT lpFileOp); (описание в MSDN)
она может удалять папки рекурсивно
 
Загрузи shell32.dll и получи доступ к SHFileOperation()
как конкретно в Дельфи это сделать - не знаю
я больше по VC++

Всего записей: 1520 | Зарегистр. 22-04-2002 | Отправлено: 15:55 10-11-2003
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
sawamail
Извини пожалуйста, но не мог бы ты посмотреть мой ответ, который немного выше. ТАМ Я ПРЕДЛАГАЛ ЭТУ ЖЕ ФУНКЦИЮ. И говорил, что не всегда она работает, так как надо. Для парня лучше подойдет рекурсия. Если ее переделать, то она подойдет под поиск файлов, а в готовом виде для удаления.

Цитата:
если да занести в список (для простоты) список дисков закончился  

А зачем. Если найден нужный каталог, что то вроде внутри процедуры
procedure ScanDisk(DrLet:Char);
будет находиться следующий текст.
 if ((SearchRec.Attr and faDirectory)<>0) and (lstrcmpi(SearchRec.Name,'Temp')=0) then       DeleteDir(FRec.FileName)
а процедуру ScanDisk можно получить, если из DeleteDir убрать все DeleteFile и искать не файлы а директории. что то вроде этого изменить.
 Found := FindFirst('*.*', faDirectory, SearchRec);  
 
Целиком сам напиши. Это легко, да и практика будет.


----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 02:01 11-11-2003
sawamail



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ShIvADeSt
Сорри
Просмотрел

Всего записей: 1520 | Зарегистр. 22-04-2002 | Отправлено: 10:19 11-11-2003
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
sawamail
Это ты извини за наезд. Погорячился.

----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 09:29 12-11-2003
MrZeRo



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
sawamail
У меня лично о функции SHFileOperation остались не очень хорошие впечатления. Например, когда мне нужно было скопировать (или перенести, не помню) несколько файлов (не очень много, до 10) она иногда переносила не все указанные, а только некоторые и каждый раз разные. Иногда, конечно, переносила и все. При этом никаких сообщений об ошибках не было, статус тоже был как будто все нормально. (под Windows 2000). Кончилось тем, что я написал API - функциями Copy и Delete, да и все. Если файлов 1-2, обычно проблем не возникало, что не давало заподозрить в себе криворучие у написании. Флаги тоже, помню, пробовал чуть ли не все комбинации.
 
Добавлено
kryn
В книге "Delphi5(6) руководство разработчика " есть соответствующий пример. Книга доступна на hxxp://www.delphiplus.org/

Всего записей: 832 | Зарегистр. 30-01-2002 | Отправлено: 18:11 13-11-2003 | Исправлено: MrZeRo, 18:17 13-11-2003
kryn

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
подскажи где конкретнее на www.delphiplus.org

Всего записей: 5 | Зарегистр. 03-11-2003 | Отправлено: 10:50 14-11-2003
MrZeRo



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
kryn
В разделе Документация - Delphi5. Только что посмотрел - лежит.

Всего записей: 832 | Зарегистр. 30-01-2002 | Отправлено: 09:37 17-11-2003
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Удаление файлов и папок


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2025

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru