0

ファイルがフォルダかどうかを確認しようとしていますが、この行を変更すると次のようになります。

snprintf(buf, sizeof buf, "%s\\%s", path, e->d_name);
                             ^      ^
                             +------+ note the differences

これに:

snprintf(buf, sizeof buf, "%s\b%s", d->dd_name, e->d_name);
                             ^      ^
                             +------+ note the differences

失敗するため、「isfolder」または「isfile」は出力されませんstat(...)。両方のラインが同じ出力パスを生成しますが。

どうしたの?


コード:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>

int main(int argc, char** argv) {
    DIR *d;
    struct dirent *e;
    struct stat fs;
    char*path = "C:\\Users\\Me\\Documents\\NetBeansProjects\\MyApp";
    d = opendir(path);
    if (d != NULL) {
        while (e = readdir(d)) {
            char buf[256];
            snprintf(buf, sizeof buf, "%s\\%s", path, e->d_name); // <- here
            printf("%s\n",buf);
            if (stat(buf, &fs) < 0) continue;
            if (S_ISDIR(fs.st_mode)) {
                printf("is folder");
            } else {
                printf("is file");
            }
        }
        closedir(d);
    }

    return 0;
}
4

1 に答える 1

0

マットからのアドバイスは正しいです。構造内に公的にアクセス可能なメンバーが文書化されていないため、DIR使用しようとしないでくださいd->dd_name

ただし、文字列の末尾からアスタリスクを削除する場合は、バックスペースを使用して削除することはできません。バックスペースは、端末で入力した場合にのみ文字を消去します。それ以外の場合は、文字列内の単なる制御文字です。あなたが使用することができます:

snprintf(buf, sizeof(buf), "%.*s%s", (int)strlen(d->dd_name)-1, d->dd_name, e->d_name);

これにより、文字列の最後の文字が省略されd->dd_nameます(末尾のスラッシュまたはバックスラッシュを残すと思います)。sizeof(size_t) > sizeof(int)(64ビットUnixシステムの場合のように)キャストが必要であることに注意してください。によって消費される値*intです。

于 2012-08-05T20:14:30.227 に答える