работа с файлами через fp в win, path -> SearchRec |
работа с файлами через fp в win, path -> SearchRec |
compiler |
9.04.2008 21:43
Сообщение
#1
|
Человек Группа: Пользователи Сообщений: 1 050 Пол: Мужской Реальное имя: Станислав Репутация: 3 |
Добрый день!
Надо написать утилитку на работу с файлами, но никак не получается ... Вопрос в следующем: как имея адрес файла получить его "SearchRec", в частности Attr... заранее благодарен. OS: winXP. компилятор: fpc 2.2.0, mode objfpc. библиотеки: dos. -------------------- Спасибо!
Удачи! |
volvo |
9.04.2008 21:50
Сообщение
#2
|
Гость |
Ты про это:
{$mode objfpc}? |
compiler |
9.04.2008 22:17
Сообщение
#3
|
Человек Группа: Пользователи Сообщений: 1 050 Пол: Мужской Реальное имя: Станислав Репутация: 3 |
Ты про это ? да, спасибо... только у меня возникает постоянно DosError = 18 Из-за чего это может быть? ps я тут еще нашел GetFAttr, которая должна делать это же, но ситуация аналогична... о GetFAttr в html инфу нашел в /fpcDoc/rtl/dos/getfattr.html (доки к прошлой версии) Сообщение отредактировано: compiler - 9.04.2008 22:57 -------------------- Спасибо!
Удачи! |
volvo |
9.04.2008 22:49
Сообщение
#4
|
Гость |
DosError = 18 - значит "искомые файлы (при поиске по шаблонам) исчерпаны"
|
compiler |
9.04.2008 23:05
Сообщение
#5
|
Человек Группа: Пользователи Сообщений: 1 050 Пол: Мужской Реальное имя: Станислав Репутация: 3 |
Огромное спасибо!
-------------------- Спасибо!
Удачи! |
compiler |
10.04.2008 16:21
Сообщение
#6
|
Человек Группа: Пользователи Сообщений: 1 050 Пол: Мужской Реальное имя: Станислав Репутация: 3 |
вобщем написать то я написал и даже откомпилировал
но вот не задача она работает не как я хочу( , а я хочу всего-лишь найти все файлы которые не удается прочитать начиная с рабочей директории... то, что у меня получилось:
заранее благодарен. upd прошу прощение за комментарии на английском, сейчас тестирую несколько новых IDE, поэтому дабы избежать проблем с кодировкой... upd2 добавлены комментарии по алгоритму.. Сообщение отредактировано: compiler - 10.04.2008 17:32 -------------------- Спасибо!
Удачи! |
volvo |
10.04.2008 17:14
Сообщение
#7
|
Гость |
Так... А теперь подробнее - что именно у тебя не получается? Твоя программа должна компилироваться, насколько я вижу, уточни, что именно тебя в ней не устраивает.
|
compiler |
10.04.2008 17:23
Сообщение
#8
|
Человек Группа: Пользователи Сообщений: 1 050 Пол: Мужской Реальное имя: Станислав Репутация: 3 |
Так... А теперь подробнее - что именно у тебя не получается? Твоя программа должна компилироваться, насколько я вижу, уточни, что именно тебя в ней не устраивает. я хочу что б программа нашла все файлы которые не удается прочитать начиная с рабочей директории...запускаю программу в на диске D:(где у меня установлен windows) и вместо списка недоступных файлов(например, D:\WINDOWS\system32\config\SAM) получаю непонятно что... -------------------- Спасибо!
Удачи! |
volvo |
10.04.2008 17:34
Сообщение
#9
|
Гость |
Что значит "не удается прочитать"? Те файлы, при попытке чтения которых возникает ошибка ввода/вывода, или те, для которых ошибка возникает уже при открытии?
Мне твоя программа вообще ничего не выдает кстати, она просто тихо валится с Segmentation Fault вот на этой строке: ... , и правильно делает... Кто будет инициализировать workd? |
compiler |
10.04.2008 17:47
Сообщение
#10
|
Человек Группа: Пользователи Сообщений: 1 050 Пол: Мужской Реальное имя: Станислав Репутация: 3 |
Что значит "не удается прочитать"? Те файлы, при попытке чтения которых возникает ошибка ввода/вывода, или те, для которых ошибка возникает уже при открытии? не понял разницы.. Мне твоя программа вообще ничего не выдает кстати, она просто тихо валится с Segmentation Fault, и правильно делает... Кто будет инициализировать workd? чесно говоря я не понял зачем этот параметр, для того что б иметь рабочии директории на каждом устройстве? тогда надо забивать туда ноль? -------------------- Спасибо!
Удачи! |
volvo |
10.04.2008 18:33
Сообщение
#11
|
Гость |
Цитата я не понял зачем этот параметр У тебя GetDir возвращает текущую директорию... ГДЕ? На каком диске? Это и указывается первым параметром процедуры... При передаче 0 ты получишь текущую папку на диске, с которого запускалась программа, чтобы получить это для D:, надо передать 4...Хм... Так тебе что, рекурсивный поиск по всему диску с проверкой всех файлов, надо? Тогда поправляй процедуры вот так: // здесь readln-ы я убрал, чтоб не щелкать по enter-у постоянно... |
compiler |
10.04.2008 21:14
Сообщение
#12
|
Человек Группа: Пользователи Сообщений: 1 050 Пол: Мужской Реальное имя: Станислав Репутация: 3 |
Хм... Так тебе что, рекурсивный поиск по всему диску с проверкой всех файлов, надо? да, только не по всему, а начиная с текущей директории... несколько вопросов по процедурам: зачем if (sr.name <> '.') and (sr.name <> '..') then begin? где можна прочитать о сравнивании attr с directory? я об этом (sr.attr and directory = directory)наверно ifdir() тоже надо переписывать.. да, а с str баг получился) -------------------- Спасибо!
Удачи! |
volvo |
10.04.2008 22:02
Сообщение
#13
|
Гость |
да, только не по всему, а начиная с текущей директории... Ну, это не имеет значения в данном случае, рекурсия будет работать, начиная с того пути, который ты туда передашь, хоть корень диска, хоть что... Главное - чтобы параметр, передаваемый в getunread завершался слэшем...зачем
Затем, чтобы не перемещаться бесконтрольно по папкам туда-сюда... Ну, не ограничишь ты перемещение по '.', так и будешь ходить постоянно в одной и той же папке - это ж ссылка из папки на саму себя. И зачем тебе опять возвращаться в папку уровнем выше (через '..'), если ты только что оттуда пришел? Лишние действия убираем...if (sr.name <> '.') and (sr.name <> '..') then begin? где можна прочитать о сравнивании 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;, а ниже - ..., опять же, не надо делать одну и ту же работу дважды, ты ж уже знаешь, папка это или нет, зачем еще раз проверять??? Добавлено через 13 мин. А можно пойти еще дальше, и вообще не вызывать ifread нигде, кроме как в ветке Else после проверки, папка ли это... Тогда тебе не надо ни функции ifdir(), ни дополнительного параметра... Если уж пришел в ifread() - значит, это файл. Сразу проверяй его и все... |
compiler |
10.04.2008 22:38
Сообщение
#14
|
Человек Группа: Пользователи Сообщений: 1 050 Пол: Мужской Реальное имя: Станислав Репутация: 3 |
огромное спасибо, всё тайное стало явным... или не совсем всё..
Затем, чтобы не перемещаться бесконтрольно по папкам туда-сюда... Ну, не ограничишь ты перемещение по '.', так и будешь ходить постоянно в одной и той же папке - это ж ссылка из папки на саму себя. И зачем тебе опять возвращаться в папку уровнем выше (через '..'), если ты только что оттуда пришел? Лишние действия убираем... забавно, а откуда берутся такие папки? такие ссылки помещаются в каждую директорию и скрываются от глаз пользователя или это есть что - то виртуальное?А можно пойти еще дальше ну это уже потом...-------------------- Спасибо!
Удачи! |
volvo |
10.04.2008 23:05
Сообщение
#15
|
Гость |
Цитата а откуда берутся такие папки? такие ссылки помещаются в каждую директорию и скрываются от глаз пользователя или это есть что - то виртуальное? Ты никогда в консоли не набирал DIR, и не видел '.' и '..' (в самом начале) в результате выполнения?cd .. для перехода в родительскую папку тоже не делал? Очень удобно... Да и одинарной точкой тоже иногда приходилось пользоваться... |
compiler |
12.04.2008 18:34
Сообщение
#16
|
Человек Группа: Пользователи Сообщений: 1 050 Пол: Мужской Реальное имя: Станислав Репутация: 3 |
Ты никогда в консоли не набирал DIR, и не видел '.' и '..' (в самом начале) в результате выполнения? никогда не пользовался этой командой, как я понял, это аналог ls в никсах... Но ls скрывает эти папки(без ключа -a или --all) и я их никогда не видел...cd .. для перехода в родительскую папку тоже не делал? cd делал, но не имел представления о механизме...Да и одинарной точкой тоже иногда приходилось пользоваться... особенно если текущий каталог не прописан в окружение -------------------- Спасибо!
Удачи! |
Текстовая версия | 29.04.2024 18:23 |