我正在尝试使用以下代码列出共享驱动器上某个目录中的所有文件:
#include <iostream>
#include <string>
#include "dirent.h"
int main ()
{
DIR *directoryHandle = opendir("./temp/");
if (NULL != directoryHandle)
{
dirent *entry = readdir(directoryHandle);
while (NULL != entry)
{
//skip directories and select only files (hopefully)
if ((DT_DIR != entry->d_type) && (DT_REG == entry->d_type || DT_UNKNOWN == entry->d_type))
{
std::cout << "Name: " << entry->d_name << " Type:" << std::to_string(entry->d_type) << std::endl;
}
//go to next entry
entry = readdir(directoryHandle);
}
closedir(directoryHandle);
}
return 0;
}
问题是entry-&gt; d_type包含目录的DT_UNKNOWN以及./temp/
目录中的文件。
是否有任何(可靠的)特定于Linux的方法来尝试读取每个条目并确定它是文件还是目录?
cat /etc/SuSE-release
的输出是:
SUSE Linux Enterprise Desktop 11(x86_64)VERSION = 11 PATCHLEVEL = 1
Linux版本为:2.6.32.59-0.7-default
尽管如此,我希望此代码也能在其他平台上运行。
答案 0 :(得分:6)
使用stat
。您将获得struct stat
个st_mode
字段,以及宏S_ISDIR
/ S_ISREG
:
isDirectory = S_ISDIR(statBuf.st_mode);
isFile = S_ISREG(statBuf.st_mode);
请参阅man 2 stat
。包括sys/stat.h
。
答案 1 :(得分:5)
如果您收到DT_UNKNOWN
,则必须继续调用lstat()
并检查st_mode
字段以确定这是文件,目录还是符号链接。如果您不关心符号链接,请改用stat()
。
答案 2 :(得分:3)
boost filesystem library有一个命令is_directory。 使用这样的库肯定会使代码在其他平台上运行,但我不确定它是否适用于您的特定问题。
答案 3 :(得分:2)
试一试。它列出目录中的文件减去文件夹:
#include <dirent.h>
#include <stdio.h>
# include <sys/types.h>
# include <sys/mode.h>
# include <stat.h>
DIR *d;
struct dirent *dir;
struct stat s;
d = opendir("./temp/");
if (d)
{
while ((dir = readdir(d)))
{
if (stat(dir->d_name,&s) != 0) {
/* is this a regular file? */
if ((s.st_mode & S_IFMT) == S_IFREG)
printf("%s\n", dir->d_name);
}
}
closedir(d);
}
答案 4 :(得分:-1)
unsigned char isFolder =0x4;
DIR Dir;
struct dirent *DirEntry;
Dir = opendir("c:/test/")
while(Dir=readdir(Dir))
{
cout << DirEntry->d_name;
if ( DirEntry->d_type == isFolder)
{
cout <<"Found a Directory : " << DirEntry->d_name << endl;
}
}