2017-05-18 71 views
-1

所以,我试图做一个ls函数。这是我的代码来描述每个文件结构统计和统计功能失败

struct stat fileStat; 
struct dirent **files; 

num_entries = scandir(filename, &files, file_select, alphasort); 
stat(files[i-1]->d_name,fileStat); 

由于某些原因,一旦它达到stat它返回-1。我认为这是因为fileStat不够大,无法存储值,但我不知道如何解决这个问题。我在这里先向您的帮助表示感谢!

+0

使用'errno'来确定为什么函数失败。 – Ari0nhh

+0

确定它没有说这样的文件或目录......我可以通过只有一个if循环来解决它,当它返回错误时什么也不做。但是啊...我如何妥善处理这个问题? –

+2

'i'的价值是什么?请参阅[**如何创建最小,完整和可验证示例**](http://stackoverflow.com/help/mcve)。提供必要的详细信息,包括您的代码以及相关的错误(如果有的话),将允许大家在这里帮助您解决问题。 –

回答

0

请考虑一下man pages。总之,stat()返回:

成功时返回零。出错时,返回-1,并且适当地设置errno为 。

而且错误号的列表是:

  • EACCES
  • EBADF
  • EFAULT
  • ELOOP
  • ENAMETOOLONG
  • ENOENT
  • ENOMEM
  • ENOTDIR
  • EOVERFLOW

调用统计后,检查它与返回值,如果它等于-1,检查errno(带开关)。

例子:

if(stat(files[i-1]->d_name,fileStat)) { 
    switch(errno) { 
    case EACCES: 
     // Add code or at least 
     perror("STAT ERROR:"); 
     break; 

    case EBADF: 
     // ... 
     break; 

    case EFAULT: 
     // ... 
     break; 

     // ... 
     // Do this to all possible errno's for the stat 
     // ... 
    case EOVERFLOW: 
     // ... 
     break; 
    } 
} 

如果你有一个存储路径的麻烦,试图声明数组作为本(如果你使用Linux):

#include <linux/limits.h> 
//... 
char current_path[PATH_MAX]; 

如果您使用的是Windows:

#include <windows.h> 
//... 
char current_path[MAX_PATH]; 

PS感谢Jonathan Leffler指出我的开关错字:)

+1

在一个'switch'中你不能有'case EFAULT:'两次:) –