d_name); -6ren">
gpt4 book ai didi

c - 更改路径类型时统计返回错误

转载 作者:行者123 更新时间:2023-11-30 17:59:01 25 4
gpt4 key购买 nike

我正在尝试检查文件是否是文件夹,但是当我更改此行时:

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;
}

最佳答案

来自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

关于c - 更改路径类型时统计返回错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11819318/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com