2017-03-08 59 views
1

我見過幾種檢查C文件存在的方法。但是,我看到的所有內容都適用於特定的文件名。我想檢查任何符合特定模式的文件。例如,可能模式是「lockfile *」和「lockfileA」,「lockfile.txt」或「lockfile.abc」將在檢查中註冊。我現在這樣做的方法是用opendir()打開目錄,然後遍歷readdir()並嘗試將模式與返回的每個文件的名稱進行匹配。它的工作原理,但我確實想要一個更緊湊的方式來做到這一點。有任何想法嗎?在C中,檢查名稱是否匹配模式的文件的存在

+2

就是這樣做,鮑勃 –

+0

@ammoQ感謝您的詞! –

+1

通配符由shell文件搜索實用程序使用。可以做的一種方式是將這樣的命令傳遞到帶重定向輸出的shell,然後分析它創建的文件。但這是一個可怕的方式去做。 –

回答

6

您可以使用glob(3)(由POSIX標準化)。你給它一個通配符模式,它會搜索文件系統的匹配。

例子:

#include <glob.h> 
#include <stdio.h> 

int main(int argc, char **argv) 
{ 
    glob_t globbuf; 
    if (0==glob(argv[1], 0, NULL, &globbuf)){ 
     char **a=globbuf.gl_pathv; 

     puts("MATCHES"); 
     for(;*a;a++) 
      puts(*a); 
    } 
    globfree(&globbuf); 
} 

運行:

./a.out 'lockfile*' 

應該給你的lockfiles。

+0

謝謝!很高興知道:)但是這不是效率明智嗎?它不檢查所有地方嗎? –

+0

'lockfile *'會啓動遞歸根樹搜索。幾個小時後你就可以準備好比賽了。開玩笑。當然,它不會「檢查所有地方」。試試看。 – PSkocik

+0

哈哈是的,但它是如何工作的?它如何映射fs,所以它不必檢查所有dirs? –

1

據我所知,這是應該如何做。

對於文件的每個名字d_name,你可以檢查它的長度,如果它有至少8個字符,strcmp這8首字符鎖文件

您也可以使用<regex.h>進行檢查。

至於迭代,我認爲這是他最好的選擇。

+0

謝謝。試着接受你的回答,但是Stack告訴我我必須等五分鐘。提醒我,如果我忘記了! –

+1

你應該檢查@ PSkocik的[答案](http://stackoverflow.com/a/42680722/451601)。你在你的問題中提供了一個glob模式,並且他指向你** glob **(3)。 –