IPB
ЛогинПароль:

> FPC, удаление директорий и файлов, было: Помогите с процедурой на FPC!
Билли Боб
сообщение 18.08.2011 22:54
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 47
Пол: Мужской

Репутация: -  0  +


Процедура удаляет папку со всеми файлами и подпапками.


procedure DELE (fd: string);
var
s: searchrec;
f: file;
delf,delfiles: string;

function STAT (fd: string): string;
var s: searchrec;
begin
stat:='';
findfirst(fd,anyfile,s); if doserror<>0 then exit;
if s.attr=VolumeID then findnext(s); if doserror<>0 then exit;
if (s.attr>=16)and(s.attr<=23) or (s.attr>=48)and(s.attr<=55)
then stat:='D' else stat:='F';
end;

begin
if stat(fd)='F' then begin assign(f,fd); setfattr(f,0); erase(f) end;
if stat(fd)='D' then
begin
delfiles:=fd+'\*.*';
findfirst(delfiles,anyfile,s);
while doserror=0 do
begin
delf:=fd+'\'+s.name;
if (s.name<>'.')and(s.name<>'..')and(s.name<>'') then
begin
if stat(delf)='F' then dele(delf);
if stat(delf)='D' then
begin
{$I-}rmdir(delf);{$I+}
if ioresult=5 then dele(delf)
end;
end;
findnext(s);
end;
rmdir(fd);
end;
end;



На TP работает, а вот на FPC как-то криво работает. Что-то удаляет,а что-то нет. Если указать просто пустой каталог, то даже его не удаляет.
В чем проблема?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
Lapp
сообщение 19.08.2011 5:15
Сообщение #2


Уникум
*******

Группа: Модераторы
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(Билли Боб @ 18.08.2011 23:54) *
На TP работает, а вот на FPC как-то криво работает. Что-то удаляет,а что-то нет. Если указать просто пустой каталог, то даже его не удаляет.
В чем проблема?

Проблема в том, что в FP поиск файлов устроен несколько иначе. Тебе нужно после использования FindFirst и FindNext сначала закрыть поиск процедурой FindClose(var f: SearchRec), а потом уже удалять директорию процедурой rmdir. В качестве параметра для FindClose используй ту самую запись, с которой ты делал поиск. Если ты этого не сделаешь, то вообще-то директория все равно удалится, но только после завершения программы (что неприемлемо во многих случаях), поскольку незакрытый поиск держит ее.

Даже если не удаляешь ничего - все равно закрывай поиск, это right thing to do.

А вообще, советую посмотреть еще раз на логику программы, она явно нуждается в улучшении. Например, эти две строки:
   if stat(fd)='F' then begin assign(f,fd); setfattr(f,0); erase(f) end;
if stat(fd)='D' then
Тут ты два раза вызываешь одну и ту же функцию с тем же параметром: stat(fd). Спрашивается - зачем? Можно, например, заменить на такое:
case stat(fd) of
'F': begin ... end;
'D': begin .. end;
end;

Далеко вглубь я не смотрел пока, исправь эти ошибки - тогда продолжим разбор, если хочешь.


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме
Билли Боб   FPC, удаление директорий и файлов   18.08.2011 22:54
Lapp   На TP работает, а вот на FPC как-то криво работает...   19.08.2011 5:15
Lapp   Тему переношу в раздел "32-битные компиляторы...   19.08.2011 11:56
Билли Боб   Благодарю! C FindClose все отлично работает, и...   20.08.2011 0:21
IUnknown   Билли Боб, не знаю, сделал ты это или нет, но при ...   20.08.2011 9:46
Билли Боб   так выходит ошибка: Incompatible types: got ...   20.08.2011 17:56
IUnknown   Как "так"? Почему у меня не выходит? us...   20.08.2011 18:27
Билли Боб   Оказывается надо было убрать модуль DOS после USES...   20.08.2011 19:04
Билли Боб   Почему программа зависает, когда я пишу: uses sysu...   20.08.2011 22:07
IUnknown   Хм... Интересно. Сама среда разработки зависает? А...   20.08.2011 22:33
Билли Боб   Не знаю, как это получилось, но еще зависало когда...   20.08.2011 22:41
Билли Боб   Как сделать курсор снова маленьким? а то после cur...   20.08.2011 23:48
Lapp   Как сделать курсор снова маленьким? а то после cur...   21.08.2011 11:27


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 2.07.2025 17:21
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"