gpt4 book ai didi

C 编程 - Stat 系统调用 - 错误

转载 作者:IT王子 更新时间:2023-10-29 00:55:42 24 4
gpt4 key购买 nike

我是 C 的新手,但正在尝试一些系统调用。

我正在编写程序,循环访问目录中的所有文件并打印当前文件名和大小。我可以让程序打印文件名,但是当我执行 stat 系统调用时它出错了。

部分代码如下:

while (dptr = readdir(dirp)) { 
if (stat(dptr->d_name, &buf) != 0) {
//Always does this and it does print the file name
printf("Error on when getting size of %s \n", dptr->d_name);
} else {
//Never gets here
printf("%u", buf.st_size);
}
}

我有这样描述的结构:

struct stat buf;
struct dirent *dptr;
DIR *dirp;

如果我改变:

if (stat(dptr->d_name, &buf) != 0)

if (stat(dptr->d_name, &buf) != [EACCES])

它仍然进入循环,这让我觉得它无法读取文件名,但它在错误语句中打印它没有问题。

有人能指出我正确的方向吗?谢谢!

爱丽丝

最佳答案

首先,如果遇到错误,stat() 返回 -1,而不是实际的错误代码。错误代码将在 errno 中设置。打印错误的一种简单方法是使用 perror()。

其次,dptr->d_name 只提供文件的相对文件名,而不是完整的文件名。要获得完整的文件名,您必须从相对文件名和目录名生成它。

这是一个例子:

int cwdloop(void)
{
DIR * dirp;
struct stat buff;
struct dirent * dptr;
char filename[1024];
char dirname[1024];

if (!(getcwd(dirname, 1024)))
{
perror("getcwd");
return(1);
};

dirp = opendir(dirname);
if (!(dirp))
{
perror("opendir()");
return(1);
};

while ((dptr = readdir(dirp)))
{
snprintf(filename, 1024, "%s/%s", dirname, dptr->d_name);
if (stat(filename, &buff) != 0)
{
perror("stat()");
return(1);
} else {
printf("size: %u\n", (unsigned)buff.st_size);
};
};

closedir(dirp);

return(0);
}

关于C 编程 - Stat 系统调用 - 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8524876/

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