2017-03-08 4 views
1

Cでファイルが存在するかどうかを調べる方法はいくつかあります。特定のパターンに一致するファイルがないかどうかチェックしたいと思います。たとえば、パターンが "lockfile *"で、 "lockfileA"、 "lockfile.txt"、または "lockfile.abc"がチェックに登録されている可能性があります。私がこれをやっているやり方は、opendir()でディレクトリを開き、readdir()を繰り返し実行し、返された各ファイルの名前とパターンを一致させることです。それは動作しますが、私は確かにこれを行うためのよりコンパクトな方法が欲しいです。何か案は?Cでは、パターンに一致する名前のファイルが存在するかどうかを確認します。

+2

これはそれがどのように行われているのですか、ボブ –

+0

@ammoQありがとうございました! –

+1

ワイルドカードは、シェルファイル検索ユーティリティで使用されます。それができる方法の1つは、リダイレクトされた出力を持つシェルにそのようなコマンドを渡し、それが作成したファイルを分析することです。しかし、それについて行くのは恐ろしい方法です。 –

答えて

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*' 

は、あなたのロックファイルを与える必要があります。

+0

ありがとう!良いことを知って:) :)それは本当に悪い効率賢明ではない?すべての場所をチェックしていませんか? –

+0

'lockfile *'は再帰的ルートツリー検索を起動しません。 2時間以内に試合が始まります。冗談だ。もちろん、「すべての場所をチェックする」ことはありません。やってみて。 – PSkocik

+0

haha​​はい、どうですか?どのようにfsをマップするので、すべてのディレクトリをチェックする必要はありませんか? –

1

私の知る限りでは、そうするべきです。ファイルのそれぞれの名前d_nameに対して

、あなたはそれがロックファイルに少なくとも8つの文字、strcmp 8その最初の文字が含まれている場合、それは長さだと確認することができます。

<regex.h>を使用して確認することもできます。

繰り返しについては、彼が最善の方法だと思います。

+0

ありがとうございます。あなたの答えを受け入れることを試みているが、スタックは私に5分待たなければならないと言っている。忘れてしまったら私に思い出させてください! –

+1

@ PSkocikの[answer](http://stackoverflow.com/a/42680722/451601)をチェックしてください。あなたはあなたの質問にグロブパターンを提供し、彼はあなたに** glob **(3)を指摘しました。 –

関連する問題