我正在对目录中的所有文件进行简单测试。 但出于某种原因,有时候,他们的行为是错误的? 我的代码有什么不好?
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);
}
答案 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
中的多个位。