2017-04-11 53 views
1

我需要遞歸搜索給定文件名的一個UNC路徑(request),我已經成功連接到路徑,並找到了搜索here的答案,但是,當我編譯我的程序,我得到了以下錯誤:遞歸搜索一個目錄,我不明白的編譯錯誤

find-util.c: In function ‘char* search_utils(const char*, int, bool)’: 
find-util.c:51:16: error: ‘struct dirent’ has no member named ‘d_type’ 
     if (ent->d_type == DT_DIR) 
       ^
find-util.c:51:26: error: ‘DT_DIR’ was not declared in this scope 
     if (ent->d_type == DT_DIR) 
         ^

我在Ubuntu 16.04是使用mingw編譯器交叉編譯,以便能夠在Windows 7上運行我缺少一個庫?或者還有其他事情我沒有看到?

#include <stdio.h> 
#include <stdlib.h> 
#include <stdbool.h> 
#include <dirent.h> 
#include <string.h> 

static char *search_utils(const char *request, int depth, bool verbose) 
{ 
    DIR *dir; 
    struct dirent *ent; 

    puts("Connecting to mgtutils.."); 

    if ((dir = opendir(MG_PATH)) != NULL) 
    { 
     while ((ent = readdir(dir)) != NULL) 
     { 
      if (verbose == true) 
      { 
       printf("Searching%s for %s\n", ent->d_name, request); 
      } 
      if (ent->d_type == DT_DIR) 
      { 
       if ((strlen(MG_PATH) + strlen(ent->d_name) + 1) > PATH_MAX) 
       { 
        puts("Path to long, cannot"); 
       } 
      } 
     } 
    } 
} 

回答

0

,我發現在網上Linux手冊頁READDIR(3)這個可能的解釋:

中的dirent結構的域只有由POSIX.1 規定是d_name和的d_ino。其他字段是非標準化的,並非所有系統上都存在 ;有關更多詳細信息,請參閱下面的註釋。

因此,請編輯您的問題並說明您正在使用的操作系統/平臺和編譯器。您可能還會看到dirent.h

我在cygwin上做了這個,其中/usr/include/dirent.h包括sys/dirent.h。在/usr/include/sys/dirent.h中,我找到了多種口味的struct dirent,是的,在這種情況下,存在一個d_type組件。 (所以你可能不在cygwin上...)

所以,如果struct dirent沒有提供d_type在你的情況下,你還能用什麼?如何stat() ...

+0

Linux的Ubuntu 16.04,mingw編譯器交叉編譯到Windows 7 – justAnotherCat

+0

嗯。 'readdir()'在Windows上不存在。 win32 API改爲提供FindFirst()FindNext()。然而,mingw可能會像'readdir()'一樣將它包裝到Posix中。 (我不知道。)因此,我的答案的底部可能會導致你進入正確的方向... – Scheff

+0

思考兩次我關心什麼標題用於交叉編譯。仔細閱讀'gcc'的命令行調用(尤其是包含'-I'參數之後的目錄)應該給出提示。我從來沒有這樣做過,但我知道有人在Linux/mingw之間交叉編譯Windows的庫。如果你被困住了,我可以問他... – Scheff