识别Linux下共享驱动器上的文件和文件夹

时间:2012-09-11 14:58:43

标签: c++ linux filesystems directory dirent.h

我正在尝试使用以下代码列出共享驱动器上某个目录中的所有文件:

#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

尽管如此,我希望此代码也能在其他平台上运行。

5 个答案:

答案 0 :(得分:6)

使用stat。您将获得struct statst_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;
    } 
}