fnmatch
int fnmatch(const char *pattern, const char *string, int flags);
參數說明
FNM_NOESCAPE
如果這個標志設置了,處理反斜杠為普通字符,而不是轉義字符。
FNM_PATHNAME
如果這個標志設置了,string
里的斜杠只匹配 pattern
里的斜杠,它不能匹配星號(*)
或問號(?)
元字符,也不能匹配包含斜杠的中括號表達式([])
。
FNM_PERIOD
如果這個標志設置了,string
里的起始點號必須匹配 pattern
里的點號。一個點號被認為是起始點號,如果它是string
第一個字符,或者如果同時設置了 FNM_PATHNAME
,緊跟在斜杠后面的點號。
FNM_FILE_NAME
這是 FNM_PATHNAME
的 GNU 同義語。
FNM_LEADING_DIR
如果這個標志(GNU 擴展)設置了,模式必須匹配跟隨在斜杠之后的 string
的初始片斷。這個標志主要是給 glibc
內部使用並且只在一定條件下實現。
FNM_CASEFOLD
如果這個標志(GNU 擴展)設置了,模式匹配忽略大小寫。
返回值
0
:string 匹配 pattern;
FNM_NOMATCH
:沒有匹配;或者其它非零值,如果出錯。
示例
示例代碼如下:
#include <fnmatch.h>
#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>
#include <vector>
#include <string>
#include <iostream>
using namespace std;
vector<string> WildcardSearch(const char* pattern,const char* filePath)
{
vector<string> res;
struct dirent *entry;
DIR *dir;
int ret;
dir = opendir(filePath);
if(dir != NULL)
{
while((entry = readdir(dir)) != NULL)
{
ret = fnmatch(pattern,entry->d_name,FNM_PATHNAME | FNM_PERIOD);
if(ret == 0)
{
res.push_back(entry->d_name);
}
else
{
continue;
}
}
}
closedir(dir);
return res;
}
int main(int argc,char*argv[])
{
vector<string> tmp;
char* pattern = argv[1];
char* path = argv[2];
tmp = WildcardSearch(pattern,path);
for(int i=0;i<tmp.size();i++)
cout<<tmp[i]<<endl;
return 0;
}
例如:
./test "2018-*.bmp" ./path