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

我是C新手,但尝试一些系统调用

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

以下是一些代码:

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

如果你知道确切的错误,这些事情就容易处理了。 尝试

 printf("error = %d: %s", errno, strerror(errno)); 

这种代码的一个常见问题是只使用文件名作为路径名。 dirent结构的d_name条目不提供完整的路径名,但提供了相对于您的目录的路径名。

要解决这个问题,你可以

  1. 构建完整的路径名称,然后将其传递给stat

  2. chdir到调用stat之前的目录。