2012-04-30 43 views
0

閱讀我試圖使用dirent.h提供的功能如何跳過一個目錄,而使用dirent.h

我的問題是遞歸打開文件: 我無法把它跳過它未能目錄打開。我希望它打開它可以找到的目錄並跳過它不能的目錄,然後移到下一個目錄,而不是以失敗退出。 我該怎麼做才能解決這個問題?

下面是一個簡單的代碼我試圖用

int acessdirs(const char *path) 
{ 
    struct dirent *entry; 
    DIR *dp; 
    char fpath[300]; 
    if(dp=opendir(path)) 
    { 
     while((entry=readdir(dp))) 
      do things here 
    } 
    else 
    { 
     std::cout<<"error opening directory"; 
     return 0; 
    } 
    return 1; 
} 

我用這同一風格上windows 7和它的作品fine.But它墜毀,機上windows xp,當我調試它,我發現它在試圖崩潰打開"system volume information"。 我真的不需要訪問此文件夾,我希望如果有任何方法可以跳過它。

這是我真正的代碼:

這是一個有點長。

int listdir(const char *path) 
{ 
    struct dirent *entry; 
    DIR *dp; 

    if(dp = opendir(path)) 
    { 
    struct stat buf ; 

    while((entry = readdir(dp))) 
    { 
     std::string p(path); 
     p += "\\"; 
     p += entry->d_name; 
     char fpath[300]; 
     if(!stat(p.c_str(), &buf)) 
     { 
      if(S_ISREG(buf.st_mode)) 
      { 
       sprintf(fpath,"%s\\%s",path,entry->d_name); 
       stat(fpath, &buf); 
       std::cout<<"\n Size of \t"<<fpath<<"\t"<<buf.st_size; 
       fmd5=MDFile (fpath);   
      }//inner second if 
      if(S_ISDIR(buf.st_mode) && 
     // the following is to ensure we do not dive into directories "." and ".." 
         strcmp(entry->d_name, ".") && strcmp(entry->d_name, "..")) 
      { 
       listdir(p.c_str()); 
      } 
     }//inner first if 
     else 
      std::cout << "ERROR in stat\n"; 
    }//end while 
    closedir(dp); 
    }//first if 
    else 
    { 
     std::cout << "ERROR in opendir\n"; 
     return 0; 
    } 
    return 1; 

}//listdir() 
+0

'access'拼寫有兩個'c'。 – hochl

+0

這段代碼如何編譯?你有一個名爲「dip」的變量,你把它稱爲「dp」。另外,在將來,請縮進您的代碼,以使其易於理解。 – Celada

+0

你粘貼的代碼太少,我們甚至不知道問題出在哪裏。在一個循環中調用'accessdirs'?當返回「0」時,該循環做什麼?遞歸究竟在哪裏? 「在這裏做事情」是否稱爲「訪問者」? –

回答

1

你最大的問題似乎是在這裏:

sprintf(fpath,"%s\\%s",path,entry->d_name); 
stat(fpath, &buf); 

沒有看到fpath的declatation,這很難說肯定的,但你要麼

  • 充溢fpathsprintf調用中,導致未定義的行爲。 「系統卷信息」是一個長名。你應該真的使用snprintf

  • 不檢查stat呼叫的返回值。如果它返回-1,我不確定buf的內容是什麼。

更重要的是,如果你可以使用POSIX的東西,功能ftw是標準的,應提供大部分你想在這裏實現的功能。

+0

對不起。直到現在我都離開了。我已經把** fpath **的聲明行 – user1366861