2

次のコードを使用して、共有ドライブの特定のディレクトリにあるすべてのファイルを一覧表示しようとしています:

#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->d_type にディレクトリとディレクトリ内のファイルの DT_UNKNOWN が含まれていることです./temp/

各エントリを試して読み取って、それがファイルかディレクトリかを判断する (信頼できる) Linux 固有の方法はありますか?

の出力cat /etc/SuSE-releaseは次のとおりです。

SUSE Linux Enterprise Desktop 11 (x86_64) バージョン = 11 パッチレベル = 1

Linux のバージョンは次のとおりです: 2.6.32.59-0.7-default

それでも、このコードは他のプラットフォームでも機能すると思います。

4

5 に答える 5

6

を使用しstatます。フィールドとマクロでを取得しstruct statます/ :st_modeS_ISDIRS_ISREG

isDirectory = S_ISDIR(statBuf.st_mode);
isFile = S_ISREG(statBuf.st_mode);

を参照してくださいman 2 stat。を含めますsys/stat.h

于 2012-09-11T15:08:35.020 に答える
5

取得DT_UNKNOWNしている場合は、先に進んでフィールドを呼び出しlstat()て検査し、st_modeこれがファイル、ディレクトリ、またはシンボリックリンクであるかどうかを判断する必要があります。シンボリックリンクを気にしない場合は、stat()代わりに使用してください。

于 2012-09-11T15:08:31.437 に答える
3

コマンドis_directoryを持つブーストファイルシステムライブラリがあります。このようなライブラリを使用すると、コードが他のプラットフォームでも機能するようになりますが、特定の問題で機能するかどうかはわかりません。

于 2012-09-11T15:06:56.893 に答える
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);
}
于 2012-09-11T15:07:12.773 に答える
-2
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;
    } 
}
于 2014-01-29T02:25:57.930 に答える