2017-05-18 83 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:'兩次:) –