我是 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/