2014-10-27 60 views
2

有沒有什麼辦法可以打開具有通用名稱但沒有指定全名和數量的文件?他們應該一個接一個地打開,而不是一次打開。 例如,我有文件: certainstr_123.txt,certainstr_5329764.txt,certainstr_1323852.txt。C++多個文件的通用名稱開頭

或者,也許它可以更容易地在另一種語言中完成? 謝謝。

+0

注意:這個術語是globbing(或「shell globs」)。此外,你不需要「通用名稱開始」(順便說一下,它被稱爲_prefix_)。畢竟,還有一些常見的_suffix_。 – sehe 2014-10-27 10:28:33

回答

2

C++沒有定義以這種方式列出文件的標準方式。

最好的跨平臺方法是使用庫,如boost filesystem模塊。我不認爲boost::filesystem有通配符搜索,你必須自己過濾文件,但這並不困難。

您可以使用正則表達式,就像在其他答案中一樣(這是完美的解決方案)。 也許它可能足以檢查文件擴展名(i->path().extension())和文件名以「certainstr_」boost::starts_withstd::string::substr)開頭。 如果您選擇C++ 11標準正則表達式庫,請確保最近有一個libstdc++

有很多系統特定的功能。例如。見:

一些UNIX/Windows的例子。

你也可以嘗試像(Windows)中:

std::system("dir /b certainstr_*.txt > list.txt"); 

或(UNIX):

std::system("ls -m1 certainstr_*.txt > list.txt"); 

解析list.txt輸出文件(當然這是一個黑客)。

無論如何,根據您的需要,基於Python的(或基於腳本的)解決方案可能是簡單的(見How to list all files of a directory?):

[glob.glob('certainstr_*.txt')][3] 

,或者也:

files = [f for f in os.listdir('.') if re.match(r'certainstr_\d+.txt', f)] 

這是Python的等價物https://stackoverflow.com/a/26585425/3235496

+0

它有很多「關閉引用」,但實際上沒有什麼答案('simple_ls'示例不會過濾模式,鏈接的答案肯定是平臺特定的,黑客......狂野的黑客)。提到python是...嗯,我猜OP要求:/ – sehe 2014-10-27 10:27:12

+0

@sehe感謝您的意見。我添加了一些代碼並更改了鏈接。 – manlio 2014-10-27 16:02:12

+0

等一下。這裏發生了什麼?你添加我5小時前發佈的代碼示例,然後...我得到一個downvote。你知道,我很高興你修改了你的答案。從我+1。 – sehe 2014-10-27 16:08:24

0

我建議只使用正則表達式。僞代碼:

boost::regex reg("^certainstr_\\d+.txt$"); 
for(recursive_directory_iterator it("."); it != recursive_directory_iterator(); ++it) 
{ 
    if(boost::regex_search(it->string(), reg)) 
    { 
     cout << *it << endl; 
    } 
} 
+0

+1優雅和簡單! – manlio 2014-10-27 16:29:03

相關問題