测试目录S_ISDIR行为不一致

时间:2010-05-15 19:56:01

标签: c++ file

我正在对目录中的所有文件进行简单测试。 但出于某种原因,有时候,他们的行为是错误的? 我的代码有什么不好?

using namespace std;

int main() {
 string s = "/home/";
   struct dirent *file;
   DIR *dir = opendir(s.c_str());

   while ((file = readdir(dir)) != NULL){
    struct stat * file_info = new (struct stat);

    stat(file->d_name,file_info);
    if ((file_info->st_mode & S_IFMT) == S_IFDIR)
     cout << "dir" << endl;
    else
     cout << "other" << endl;
   }
   closedir(dir);
}

2 个答案:

答案 0 :(得分:4)

你犯了一些错误,最重要的是在不检查其返回值的情况下调用stat()。我将你的程序修改为:

#include <cstdio>
#include <dirent.h>
#include <iostream>
#include <string>
#include <sys/stat.h>

using namespace std;

int main() {
  string s = "/home/";
  struct dirent *file;
  DIR *dir = opendir(s.c_str());

  while ((file = readdir(dir)) != NULL) {
    struct stat file_info;

    if (stat(file->d_name, &file_info) == -1) {
      perror("stat");
      return 1;
    }

    if (S_ISDIR(file_info.st_mode))
      cout << "dir " << file->d_name << endl;
    else
      cout << "other " << file->d_name << endl;
  }
  closedir(dir);
}

当我运行它时,我得到了这个输出:

$ ./a.exe
dir .
dir ..
stat: No such file or directory

现在我看到stat被调用的文件名为roland,在我当前的工作目录中不存在。您必须在文件名前加上目录名称。

你的第二个错误是每次都分配一个新的struct stat但是在使用后没有释放内存。默认情况下,C ++没有垃圾回收,所以你的程序很快就会耗尽内存。

答案 1 :(得分:0)

您可以尝试检查是否只设置了S_IFDIR

if((statbuf.st_mode & S_IFDIR)  == S_IFDIR)   
{//dir
}

我看到以下定义:

#define _S_IFMT         0xF000          /* file type mask */
#define _S_IFDIR        0x4000          /* directory */
#define _S_IFCHR        0x2000          /* character special */
#define _S_IFIFO        0x1000          /* pipe */
#define _S_IFREG        0x8000          /* regular */
#define _S_IREAD        0x0100          /* read permission, owner */
#define _S_IWRITE       0x0080          /* write permission, owner */
#define _S_IEXEC        0x0040          /* execute/search permission, owner */

我不确定您的情况,但未设置S_IFDIR或设置了掩码0xF000中的多个位。