Добрый день! Надо написать утилитку на работу с файлами, но никак не получается ... Вопрос в следующем: как имея адрес файла получить его "SearchRec", в частности Attr... заранее благодарен.
У тебя GetDir возвращает текущую директорию... ГДЕ? На каком диске? Это и указывается первым параметром процедуры... При передаче 0 ты получишь текущую папку на диске, с которого запускалась программа, чтобы получить это для D:, надо передать 4...
Хм... Так тебе что, рекурсивный поиск по всему диску с проверкой всех файлов, надо? Тогда поправляй процедуры вот так:
// здесь readln-ы я убрал, чтоб не щелкать по enter-у постоянно... function ifread(const str:string):boolean; var f: file; begin ifread:=false; if not ifdir(str) then begin assign(f, str); // Почему у тебя была СТРОКА 'str', а не ее содержимое? {$I-} reset(f); {$I+} if IOResult <> 0 then begin writeln('-', str); end else begin ifread := true; writeln('+', str); end; end; end;
procedure getunread(const fw: string); var sr: SearchRec; begin ifread(fw); chdir(fw);
FindFirst('*.*', AnyFile, sr); while DosError = 0 do begin
if (sr.name <> '.') and (sr.name <> '..') then begin
if (sr.attr and directory = directory) then begin getunread(fw + sr.name + slash); end else ifread(fw + getname(sr));
да, только не по всему, а начиная с текущей директории...
Ну, это не имеет значения в данном случае, рекурсия будет работать, начиная с того пути, который ты туда передашь, хоть корень диска, хоть что... Главное - чтобы параметр, передаваемый в getunread завершался слэшем...
Цитата(compiler @ 10.04.2008 21:14)
зачем
if (sr.name <> '.') and (sr.name <> '..') then begin
?
Затем, чтобы не перемещаться бесконтрольно по папкам туда-сюда... Ну, не ограничишь ты перемещение по '.', так и будешь ходить постоянно в одной и той же папке - это ж ссылка из папки на саму себя. И зачем тебе опять возвращаться в папку уровнем выше (через '..'), если ты только что оттуда пришел? Лишние действия убираем...
Цитата(compiler @ 10.04.2008 21:14)
где можна прочитать о сравнивании attr с directory? я об этом
(sr.attr and directory = directory)
наверно ifdir() тоже надо переписывать..
А это не сравнивание... Никто не обещал, что в поле Attr будет храниться Directory в чистом виде (то есть, поле Attr не должно быть равно $10), в этом байте просто будет установлен бит xxx1xxxx, а как проверяется, установлен ли бит? Правильно,
if value and mask = mask then ...
Что и было сделано...
А насчет ifdir - я просто не заметил его, да, там тоже надо менять, хотя по-моему было бы проще заменить функцию на дополнительный параметр для ifread:
function ifread(const str:string; const ifdir: boolean = true): boolean; var f: file; begin ifread:=false; if not ifdir then begin ...
, а ниже -
... if (sr.attr and directory = directory) then begin getunread(fw + sr.name + slash); end else ifread(fw + getname(sr), false); // <--- ...
, опять же, не надо делать одну и ту же работу дважды, ты ж уже знаешь, папка это или нет, зачем еще раз проверять???
Добавлено через 13 мин. А можно пойти еще дальше, и вообще не вызывать ifread нигде, кроме как в ветке Else после проверки, папка ли это... Тогда тебе не надо ни функции ifdir(), ни дополнительного параметра... Если уж пришел в ifread() - значит, это файл. Сразу проверяй его и все...
огромное спасибо, всё тайное стало явным... или не совсем всё..
Цитата(volvo @ 10.04.2008 22:02)
Затем, чтобы не перемещаться бесконтрольно по папкам туда-сюда... Ну, не ограничишь ты перемещение по '.', так и будешь ходить постоянно в одной и той же папке - это ж ссылка из папки на саму себя. И зачем тебе опять возвращаться в папку уровнем выше (через '..'), если ты только что оттуда пришел? Лишние действия убираем...
забавно, а откуда берутся такие папки? такие ссылки помещаются в каждую директорию и скрываются от глаз пользователя или это есть что - то виртуальное?