nixp.ru v3.0

26 мая 2017,
пятница,
10:14:35 MSK

DevOps с компанией «Флант»
Uncle Theodore написал 4 апреля 2004 года в 01:41 (504 просмотра) Ведет себя неопределенно; открыл 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

Longobard

Я поспорю на что угодно, что на моей ext3 статус файла легко берется без смены диры. Про reiser ничего сказать не могу.

decvar

у меня работает без смены диры.

ext3

Uncle Theodore

Спасибо. Тогда еще просьба. У меня нет 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

anonymous

Функцию stat нужно вызывать с полным путевым именем файла, иначе

она вызывается для файлов относительно текущего каталога.

Uncle Theodore

Ага! Значит, делаем так:

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