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

它不会打印“是文件夹”或“是文件”,因为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

Mat的建议是合理的;结构中没有记录可公开访问的成员,因此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 回答