599 / 237 / 69
Регистрация: 08.08.2015
Сообщений: 1,637
|
|||||||||||
1 | |||||||||||
Работа stat+dirent в цикле22.10.2015, 13:25. Показов 9589. Ответов 8
Метки нет (Все метки)
Добрый день!
Наверно голову уже всем пробил этими функциями но все же спрошу! Код:
Функция открывает и читает директорию с файлами, для того чтобы отличить файл от директории использую stat в моей системе ответ stat на файл =16384 на папку 32768 (Хотя в описании другие значения, но не концептуально потому что пробывал на большом количестве объектов суть е меняется), так вот в теории все хорошо, но на практике как только первый раз stat получил путь к файлу/папке он его не меняет. в чем может быть трабла я уже мозг сломал(((( Вот вывод:
PS Там идет ругонь на имена переменных, я об этом знаю, поправлю потом. Так что в это носом чур не тыкать меня)
0
|
22.10.2015, 13:25 | |
Ответы с готовыми решениями:
8
Компилятор не знает dirent.h Метода chdir нет в dirent.h Работа с файлами в цикле. Работа с указателями в цикле |
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
|
|
22.10.2015, 13:40 | 2 |
Mesteriis, скорее всего функция stat фейлится. Возвращает ошибку (которую ты успешно не проверяешь). Поэтому заполненный единожды буфер
более не меняется.
Добавлено через 3 минуты Mesteriis, я даже знаю почему она фейлится. Потому что не содержит в себе полный путь (или путь относительно текущего каталога программы), который нужен stat. Там содержится только имя файла в заданном каталоге.
0
|
599 / 237 / 69
Регистрация: 08.08.2015
Сообщений: 1,637
|
|
22.10.2015, 13:53 [ТС] | 3 |
DrOffset, Ну подожди (ent->d_name) возвращяет полное имя (то есть name.ext) , естественно относительно заданного каталога (открытый DIR *dir = opendir(Target) соответсвенно для нее этого должно хватать вполне, или ей все таки надо передавать полный путь? я чой то запутался в конец(
0
|
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
|
|
22.10.2015, 14:01 | 4 |
Давай на пальцах:
1) Программа сидит в каталоге /prog 2) Каталог, который сканируется - такой /prog/mydir 3) Имя файла в /prog/mydir возвращается, например, test.txt 4) Пихаем test.txt в stat, что получаем? Правильно, поиск в каталоге /prog. А там такого файла нет. Мораль: нельзя забивать на обработку ошибок. Даже в тестовых примерах.
0
|
599 / 237 / 69
Регистрация: 08.08.2015
Сообщений: 1,637
|
|
22.10.2015, 14:10 [ТС] | 5 |
DrOffset, Вот теперь понял, мерси, тоесть что бы все это работало, мне глобально надо менять рабочие каталоги? ну или передавать stat полные пути
0
|
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
|
|
22.10.2015, 14:14 | 6 |
Не надо.
Да, либо использовать пути относительно текущего каталога программы (он не обязательно всегда будет совпадать с каталогом, где программа находится физически).
0
|
599 / 237 / 69
Регистрация: 08.08.2015
Сообщений: 1,637
|
|
22.10.2015, 14:18 [ТС] | 7 |
А в чем опасность? разве не проще перенести рабочий каталог нежели чем сначала просчитывать (/Users/mesteriis/Downloads + namefile) полный путь к каждому файлу а потом передавать эту махину с каждым проходом в stat?
PS Это пока пишу он простенький и не особо много файлов, планируется в конечном счете работа с директориями где их (файлов) 10к
0
|
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
|
||||||
22.10.2015, 14:38 | 8 | |||||
Сообщение было отмечено Mesteriis как решение
Решение
В общем случае в том, что это глобальный ресурс, который надо защищать при использовании многопоточности. Ну и забыть вернуть как было можно, поломав другие части программы, которые на это завязались.
Тут проще всего вообще от функции stat уйти. Вот примерно что-то такое (в windows не будет работать):
1
|
599 / 237 / 69
Регистрация: 08.08.2015
Сообщений: 1,637
|
|
22.10.2015, 15:43 [ТС] | 9 |
DrOffset, Мерси, в винде и не работаю уже лет так 5) спс за пример, буду думать дальше
0
|
22.10.2015, 15:43 | |
22.10.2015, 15:43 | |
Помогаю со студенческими работами здесь
9
работа с циклом и условием в цикле Работа с динамической памятью в цикле Работа с оператором switch в цикле Некорректная работа ф-ции getch() в цикле Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |