Uncle Theodore
написал 4 апреля 2004 года в 01:41 (1306 просмотров)
Ведет себя
неопределенно; открыл 58 тем в форуме, оставил 1537 комментариев на сайте.
Кто-нибудь может подтвердить или опровергнуть такой факт:
Чтобы правильно получить атрибуты файла из сяшного кода функцией stat, необходимо сначала перейти в директорию, где этот файл находится.
#include #include #include #include #include #include using namespace std; int main(int argc, char* argv[]) { string filenames[1000], dirnames[1000]; char *dirname = argv[1]; DIR * directory; struct dirent * direntry; struct stat fileentry; if((directory = opendir(dirname))==NULL) cout << "Error opening directory!\n"; int ifile = 0; int idir = 0; if(dirname != ".") chdir(dirname); // <- HERE!!! to be able to read file information... while(direntry = readdir(directory)) { stat(direntry->d_name, &fileentry); if(S_ISDIR(fileentry.st_mode)) dirnames[idir++] = direntry -> d_name; else filenames[ifile++] = direntry -> d_name; }; closedir(directory); cout << idir << " Directories:\n"; for(int i=0;i cout << dirnames[i] << endl; cout << ifile << " Files\n"; for(int i=0;i cout << filenames[i] << endl; return 0; };
Если я не сменю директорию на текущую, прога РАБОТАЕТ как ни в чем не бывало, но выдает ЧУШЬ! Файловая система reiserfs.
Good Luck,
UT
Последние комментарии
- OlegL, 17 декабря 2023 года в 15:00 → Перекличка 21
- REDkiy, 8 июня 2023 года в 9:09 → Как «замокать» файл для юниттеста в Python? 2
- fhunter, 29 ноября 2022 года в 2:09 → Проблема с NO_PUBKEY: как получить GPG-ключ и добавить его в базу apt? 6
- Иванн, 9 апреля 2022 года в 8:31 → Ассоциация РАСПО провела первое учредительное собрание 1
- Kiri11.ADV1, 7 марта 2021 года в 12:01 → Логи catalina.out в TomCat 9 в формате JSON 1
ecobeing.ru
Экология и вегетарианство на благо всем живым существам Планеты.
Я поспорю на что угодно, что на моей ext3 статус файла легко берется без смены диры. Про reiser ничего сказать не могу.
у меня работает без смены диры.
ext3
Спасибо. Тогда еще просьба. У меня нет ext3-раздела, но я себе состряпал 500M файл и примонтировал на директорию
dd if=/dev/zero of=dsk.img count=1000000
losetup /dev/loop1 dsk.img
mke2fs /dev/loop1
mount /dev/loop1 temp
Вот что я там насоздавал:
#ls t1
lost+found/ testdir1/ testfile2.txt testfile4.txt
readdirc* testdir2/ testfile3.txt
#cd t1
# ls testdir1
testfile1.txt
Теперь я комментарю переход в исследуемую директорию в проге и запускаю ея
# ./readdirc testdir1
3 Directories:
.
..
testfile1.txt
0 Files
Что есть очевидная чушь
# ./readdirc .
5 Directories:
.
..
lost+found
testdir1
testdir2
4 Files
testfile2.txt
testfile3.txt
testfile4.txt
readdirc
что есть правда (для текущей диры)
# cd ../
# ./readdirc t1
8 Directories:
.
..
lost+found
testdir1
testdir2
testfile2.txt
testfile3.txt
testfile4.txt
1 Files
readdirc
что есть чушь голимая.
Вывод: даже на ext2 моя прога глючит. Значит, глючит ПРОГА, а не файловая система. Не мог бы кто-нибудь проглядеть код и сказать, чтО именно я напортачил? У меня уже никаких идей просто нет.
Good Luck,
UT
Функцию stat нужно вызывать с полным путевым именем файла, иначе
она вызывается для файлов относительно текущего каталога.
Ага! Значит, делаем так:
string fullname;
string basename = dirname;
string filename;
while(direntry = readdir(directory))
{
filename = direntry->d_name;
fullname = basename + «/» + filename;
stat(fullname.c_str(), &fileentry);
if(S_ISDIR(fileentry.st_mode))
{
cout << «Directory: » << direntry -> d_name << endl;
}
else
{
cout << direntry -> d_name << endl;
};
};
Ура!! Заработало!!!!
Большое спасибо! А то я почти все оставшиеся волосы на голове повыдирал…
Good Luck,
UT