20

WindowsのCまたはC++でグロブするスムーズな方法はありますか?

たとえば、myprogram.exe * .txtは、... ARGV[1]=を含むARGVリストをプログラムに送信*.txtします。

文字列を受け取り、それぞれにファイル名を含む文字列のベクトルを返す関数(readglobと呼びましょう)を作成できるようにしたいと思います。

このようにa.txt b.txt c.txt、ディレクトリにファイルがあり、readglobが引数*.txtを取得すると、上記のファイルリストが返されます。

//Prototype of this hypothetical function.
vector<string> readglob(string);

そのようなものは存在しますか?

4

5 に答える 5

27

setargv.obj(または)とのリンクwsetargv.objとargv []は、Unixシェルが行うのと同じようにグロブされます。

私はそれがどれほどうまくいくかを保証することはできません。

于 2009-08-13T01:01:04.477 に答える
4

これは非常にWindows固有です。クロスプラットフォームにするためにこれをどのように書くのかわかりません。しかし、私はこれをWindowsプログラムで使用しており、私にとってはうまく機能します。

// Change to the specified working directory
string path;
cout << "Enter the path to report: ";
cin >> path;
_chdir(path.c_str());

// Get the file description
string desc;
cout << "Enter the file description: ";
cin >> desc;

// List the files in the directory
intptr_t file;
_finddata_t filedata;
file = _findfirst(desc.c_str(),&filedata);
if (file != -1)
{
  do
  {
    cout << filedata.name << endl;
    // Or put the file name in a vector here
  } while (_findnext(file,&filedata) == 0);
}
else
{
  cout << "No described files found" << endl;
}
_findclose(file);
于 2009-08-13T00:56:04.177 に答える
2

Boost :: filesystemでそれを使用することについての話がありましたが、boost::regexを使用することに賛成して削除されました。

win32固有(MFC)の場合、CFileFindクラスを使用できます

于 2009-08-13T00:47:45.310 に答える
1

今はもっと良い方法があるかもしれませんが、前回この問題に対処しなければならなかったときに、Henry Spencerの正規表現ライブラリをプログラムに静的にリンクして(彼のライブラリはBSDライセンスです)、ユーザーのを変換するラッパークラスを作成しました。 glob-expressionsを正規表現に変換して正規表現コードにフィードします。必要に応じて、ここでラッパークラスを表示/取得できます。

これらの部分を配置したら、最後にディレクトリを読み取り、各エントリ名を一致する関数に渡して、式と一致するかどうかを確認します。一致するファイル名をベクターに追加します。あなたが捨てないもの。ディレクトリの読み取りは、DOSの_findfirst()および_findnext()関数を使用して行うのはかなり簡単ですが、より優れたC ++インターフェイスが必要な場合は、そのためのポータブルラッパークラスもあります...

于 2009-08-13T00:54:07.137 に答える
0

えー。私は約15年前にANSICでこのようなものを実装しなければなりませんでした。ANSIのopendir/readdirルーチンから始めてください。グロブは正確には正規表現ではないため、独自のフィルタリングを実装する必要があります。

于 2009-08-13T00:47:33.280 に答える