2014-06-27 56 views
-3

我想查找以某些詞開頭的文件。例如abc,abc22424,abc44646,abc353535 但是我在其他問題上發現了這個問題。請幫幫我。我是新的C++C++如何在具有特定名稱的目錄中搜索文件?

#include <sys/types.h> 
#include <dirent.h> 
#include <errno.h> 
#include <vector> 
#include <string> 
#include <iostream> 

using namespace std; 

int getdir (string dir, vector<string> &files) 
{ 
    DIR *dp; 
    struct dirent *dirp; 

    if((dp = opendir(dir.c_str())) == NULL) 
    { 
     cout << "Error(" << errno << ") opening " << dir << endl; 
     return errno; 
    } 
    while ((dirp = readdir(dp)) != NULL) 
     files.push_back(string(dirp->d_name)); 
    closedir(dp); 
    return 0; 
} 

int main() 
{ 
    string dir = string("C:\\test"); 
    vector<string> files = vector<string>(); 

    getdir(dir,files); 
    for (unsigned int i = 0;i < files.size();i++) 
     cout << files[i] << endl; 
    return 0; 
} 
+0

想要只顯示以「abc」開頭的文件嗎?你的問題很清楚。看看[正則表達式](http://www.boost.org/doc/libs/1_55_0/libs/regex/doc/html/index.html) –

+0

我想顯示的文件只能以abc開頭。 –

+1

因爲你表面上沒有付出太多努力,既沒有解釋你的確切要求,也沒有試圖解決它們,並解釋你所嘗試過的沒有起作用,它是如何失敗等。如果你的要求是找到具有特定前綴的文件,你可以在'getdir'中添加一個「const char * prefix」參數,然後在前面加上if(strncmp(dirp-> d_name,prefix,strlen(prefix))== 0)'你的'files.push_back ...' –

回答

2

現在你可以得到文件名。 只需比較文件名即可。

while ((dirp = readdir(dp)) != NULL) { 
std::string fname = dirp->d_name; 
if(fname.find("abc") != std::string::npos) 
    files.push_back(fname); 
} 

您也可以使用可以註冊過濾功能SCANDIR功能。

static int filter(const struct dirent* dir_ent) 
{ 
    if (!strcmp(dir_ent->d_name, ".") || !strcmp(dir_ent->d_name, "..")) return 0; 
    std::string fname = dir_ent->d_name; 

    if (fname.find("abc") == std::string::npos) return 0; 

    return 1; 
} 



int main() 
{ 
    struct dirent **namelist; 

    std::vector<std::string> v; 
    std::vector<std::string>::iterator it; 

    n = scandir(dir_path , &namelist, *filter, alphasort); 

    for (int i=0; i<n; i++) { 
     std::string fname = namelist[i]->d_name; 

     v.push_back(fname); 

     free(namelist[i]); 
    } 
    free(namelist); 

return 0; 
} 
+0

謝謝你,它的工作完美:) –

+0

如果你使用scandir函數就像我的代碼,你應該檢查n變量,它可以返回0和負數,這只是一個簡單的例子。 –

相關問題