1. 程式人生 > >fnmatch例項詳解(與readdir、opendir實現模糊查詢)

fnmatch例項詳解(與readdir、opendir實現模糊查詢)

fnmatch:int fnmatch(const char *pattern, const char *string, int flags);
man中是這麼寫道:The  fnmatch()  function checks whether the string argument matches the pattern argument, which is a shell wildcard pattern. 就是判斷字串是不是符合pattern所指的結構。
  

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>
int main(int argc, char *argv[])
{
	char *pattern;
	DIR *dir;
 	struct dirent *entry;
	int ret;

	dir = opendir(argv[2]);	//開啟指定路徑

	pattern = argv[1];	
	
	//路徑存在
	if(dir != NULL)
	{
		//逐個獲取資料夾中檔案
	    while( (entry = readdir(dir)) != NULL)
		{
	      ret = fnmatch(pattern, entry->d_name, FNM_PATHNAME|FNM_PERIOD);
	      if(ret == 0)			//符合pattern的結構
			{
	        printf("%s\n", entry->d_name);
	      }else if(ret == FNM_NOMATCH){
	        continue ;
	      }else
			{
	        printf("error file=%s\n", entry->d_name);
	    		}
	    	}

    	closedir(dir);
  	}
}