【问题标题】:Globbing in C++/C, on Windows在 C++/C 中通配,在 Windows 上
【发布时间】:2010-11-19 03:52:36
【问题描述】:

在 Windows 中是否有一种流畅的方式在 C 或 C++ 中进行 glob?

例如,myprogram.exe *.txt 向我的程序发送一个 ARGV 列表,其中包含...ARGV[1]=*.txt

我希望能够有一个函数(我们称之为 readglob),它接受一个字符串并返回一个字符串向量,每个字符串都包含一个文件名。

这样,如果我的目录中有文件 a.txt b.txt c.txt 并且 readglob 得到一个参数 *.txt,它会返回上面的文件列表。

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

这样的存在吗?

【问题讨论】:

    标签: c++ c windows glob


    【解决方案1】:

    setargv.obj(或wsetargv.obj)的链接和argv[] 将为您提供类似于Unix shell 的操作方式:

    但我不能保证它的效果如何。

    【讨论】:

    • 非常不跨平台,但它很简单,而且很好用。
    • 不一定要跨平台,因为只有Win32才有这个问题!很棒的提示。
    • 自己试过了。像冠军一样工作。再简单不过了。
    【解决方案2】:

    这是非常特定于 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);
    

    【讨论】:

    • 不要使用 pre/code 标签,而只是突出显示代码并单击带有 1/0 的按钮。它会让它显示为代码。
    • +1 表示代码;我选择了迈克尔的答案,因为它更简单。 :-)
    • 简单实用。 THX
    • 这将有助于说明您的代码所需的头文件。
    【解决方案3】:

    现在可能有更好的方法,但是上次我不得不处理这个问题时,我最终将Henry Spencer's regex library 静态链接到我的程序中(他的库是 BSD 许可的),然后我制作了一个包装类来转换将用户的全局表达式转换为正则表达式以提供给正则表达式代码。如果您愿意,可以查看/获取包装类 here

    一旦你有了这些部分,最后要做的就是读取目录,并将每个条目名称传递给匹配函数以查看它是否与表达式匹配。匹配的文件名,您添加到您的向量中;那些你不丢弃的。使用 DOS _findfirst() 和 _findnext() 函数读取目录相当简单,但如果您想要更好的 C++ 接口,我也有一个 portable wrapper 类...

    【讨论】:

      【解决方案4】:

      曾经讨论过在 Boost::filesystem 中使用它,但为了支持使用 boost::regex 而放弃了它。

      对于特定于 win32 的 (MFC),您可以使用 CFileFind

      【讨论】:

      • 这太糟糕了。使用 cl & #include afx.h 进行快速测试会导致与 new 相关的链接错误。为链接 +1,但我不想浪费我的晚上让 MFC 为我工作。
      • 似乎对于非MFC的东西,你可以使用FindFirstFile和朋友直接用win32代码来做。
      • MFC 主要是对 win32 调用的封装,不记得 FindFirstFile(),这一切都回到了我的身边。
      【解决方案5】:

      嗯。大约 15 年前,我不得不在 ANSI C 中实现类似的东西。我猜是从 ANSI opendir/readdir 例程开始的。 Glob 并不完全是 RegEx,因此您必须实现自己的过滤。

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-09
      • 2013-08-09
      • 2017-02-10
      • 2021-08-16
      相关资源
      最近更新 更多