通常のファイルのみをリストする(ディレクトリなし)問題
質問
特定のファイルが「通常」であっても、このプログラムにリストされない理由を知っていますか?:
#include <stdio.h>
#include <sys/types.h>
#include <sys/param.h>
#include <sys/stat.h>
#include <dirent.h>
int main(void) {
DIR *dh = opendir("./"); // directory handle
struct dirent *file; // a 'directory entity' AKA file
struct stat info; // info about the file.
while (file = readdir(dh)) {
stat(file->d_name, &info);
printf("note: file->d_name => %s\n", file->d_name);
printf("note: info.st_mode => %i\n", info.st_mode);
if (S_ISREG(info.st_mode))
printf("REGULAR FILE FOUND! %s\n", file->d_name);
}
closedir(dh);
return 0;
}
このプログラムを実行した後、私はこれを取得します:
note: file->d_name => .
note: info.st_mode => 16877
note: file->d_name => ..
note: info.st_mode => 16832
note: file->d_name => .DS_Store
note: info.st_mode => 16832
note: file->d_name => ef efeff
note: info.st_mode => 16832
note: file->d_name => ffffff
note: info.st_mode => 16832
note: file->d_name => ffffff - copie
note: info.st_mode => 16832
note: file->d_name => folder
note: info.st_mode => 16832
note: file->d_name => printiie.tt
note: info.st_mode => 16832
note: file->d_name => test.c
note: info.st_mode => 33188
REGULAR FILE FOUND! test.c
note: file->d_name => z
note: info.st_mode => 33188
REGULAR FILE FOUND! z
ご覧のとおり、プログラムには2つのファイルしかありません。ただし、すべてのファイルは通常のものであり、フォルダーは1つだけです。
これは、シェルコマンドの過去のコピーです。 $ ls -lai
:
total 64
2421444 drwxr-xr-x 10 denis staff 340 27 oct 22:19 .
2416789 drwxr-xr-x@ 28 denis staff 952 27 oct 22:20 ..
2423204 -rw-r--r--@ 1 denis staff 6148 27 oct 21:41 .DS_Store
2423206 -rwxr-xr-x@ 1 denis staff 895 27 oct 19:57 ef efeff
2423183 -rwxr-xr-x@ 1 denis staff 895 27 oct 19:57 ffffff
2423216 -rwxr-xr-x@ 1 denis staff 895 27 oct 19:57 ffffff - copie
2423436 drwxr-xr-x 2 denis staff 68 27 oct 21:57 folder
2423180 -rw-r--r--@ 1 denis staff 38 27 oct 21:32 printiie.tt
2423682 -rw-r--r--@ 1 denis staff 895 27 oct 19:57 test.c
2423208 -rwxr-xr-x@ 1 denis staff 34 27 oct 21:39 z
各ファイルの名前をリストしたいのですが、ディレクトリはありません。私はMac OS Xを使用していますが、これが問題の原因になるとは思いません。
解決
一部のファイルで stat
関数が失敗しているように見えるため、 info
構造体は更新されず、まだのデータが含まれています>&quot; ..&quot;
。その行を次のように置き換えます。
if (stat(file->d_name, &info))
{
printf("error: stat(%s): %s\n", file->d_name, strerror(errno));
continue;
}
..そしてその理由がわかります。
他のヒント
サブディレクトリを含むディレクトリ内のすべてのymlファイルをリストする必要がありました。それはウィンXPにありました:
system(&quot; dir C:\ Path \ To \ File \ *。yml / B / S&gt;&gt; list.txt&quot;);
そして、list.txtを解析してすべてを取得しますそれら。 1行は1ファイルでした。簡単ですが、ポータブルではありません。また、それは少し前のことでした-今、私は多分ブーストを試みるでしょう。
編集: この答えはコードに関するものではありませんが、:
実際には、各ファイルの名前をリストしたいのですが、ディレクトリはありません。
彼が私と同じアプローチを取った場合、彼は彼の問題を解決するでしょう。
所属していません StackOverflow