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

> 

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

> работа с файлами через fp в win, path -> SearchRec
сообщение
Сообщение #1


Человек
*****

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

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


Добрый день!
Надо написать утилитку на работу с файлами, но никак не получается ...
Вопрос в следующем: как имея адрес файла получить его "SearchRec", в частности Attr...
заранее благодарен.


OS: winXP.
компилятор: fpc 2.2.0, mode objfpc.
библиотеки: dos.


--------------------
Спасибо!
Удачи!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Гость






Цитата
я не понял зачем этот параметр
У тебя 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));

end;

FindNext(sr);

end;
end;

 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Человек
*****

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

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


Цитата(volvo @ 10.04.2008 18:33) *
Хм... Так тебе что, рекурсивный поиск по всему диску с проверкой всех файлов, надо?
да, только не по всему, а начиная с текущей директории...

несколько вопросов по процедурам:
зачем
 if (sr.name <> '.') and (sr.name <> '..') then begin
?
где можна прочитать о сравнивании attr с directory? я об этом
 (sr.attr and directory = directory) 
наверно ifdir() тоже надо переписывать..

да, а с str баг получился)


--------------------
Спасибо!
Удачи!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






Цитата(compiler @ 10.04.2008 21:14) *
да, только не по всему, а начиная с текущей директории...
Ну, это не имеет значения в данном случае, рекурсия будет работать, начиная с того пути, который ты туда передашь, хоть корень диска, хоть что... Главное - чтобы параметр, передаваемый в 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() - значит, это файл. Сразу проверяй его и все...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Человек
*****

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

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


огромное спасибо, всё тайное стало явным... или не совсем всё..
Цитата(volvo @ 10.04.2008 22:02) *
Затем, чтобы не перемещаться бесконтрольно по папкам туда-сюда... Ну, не ограничишь ты перемещение по '.', так и будешь ходить постоянно в одной и той же папке - это ж ссылка из папки на саму себя. И зачем тебе опять возвращаться в папку уровнем выше (через '..'), если ты только что оттуда пришел? Лишние действия убираем...
забавно, а откуда берутся такие папки? такие ссылки помещаются в каждую директорию и скрываются от глаз пользователя или это есть что - то виртуальное?
Цитата(volvo @ 10.04.2008 22:02) *
А можно пойти еще дальше
ну это уже потом...




--------------------
Спасибо!
Удачи!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме
compiler   работа с файлами через fp в win   10.04.2008 1:43
volvo   Ты про это: {$mode objfpc} uses dos; var Fi…   10.04.2008 1:50
compiler   Ты про это ?да, спасибо... только у меня возникает…   10.04.2008 2:17
volvo   DosError = 18 - значит "искомые файлы (при по…   10.04.2008 2:49
compiler   Огромное спасибо!   10.04.2008 3:05
compiler   вобщем написать то я написал и даже откомпилировал…   10.04.2008 20:21
volvo   Так... А теперь подробнее - что именно у тебя не п…   10.04.2008 21:14
compiler   Так... А теперь подробнее - что именно у тебя не п…   10.04.2008 21:23
volvo   Что значит "не удается прочитать"? Те фа…   10.04.2008 21:34
compiler   Что значит "не удается прочитать"? Те фа…   10.04.2008 21:47
volvo   У тебя GetDir возвращает текущую директорию... ГДЕ…   10.04.2008 22:33
compiler   Хм... Так тебе что, рекурсивный поиск по всему дис…   11.04.2008 1:14
volvo   да, только не по всему, а начиная с текущей директ…   11.04.2008 2:02
compiler   огромное спасибо, всё тайное стало явным... или не…   11.04.2008 2:38
volvo   Ты никогда в консоли не набирал DIR, и не видел …   11.04.2008 3:05
compiler   Ты никогда в консоли не набирал DIR, и не видел …   12.04.2008 22:34


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

 





- Текстовая версия 3.05.2024 16:40
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name