【问题标题】:Alternative to dir command to query a directory in C在 C 中查询目录的替代 dir 命令
【发布时间】:2020-02-16 18:39:46
【问题描述】:

我正在尝试创建一个程序,用户可以在其中添加不同的路径正则表达式,以便对匹配正则表达式的文件进行一组特定的操作。

我尝试使用dirent.h头文件的opendir(),但很快意识到它没有使用正则表达式的概念。

我试图模拟的dir 命令是

dir [regex] /b

我需要(字符)缓冲区中的输出**。管道输出可能是一种解决方案,但我正在寻找一种更有效的方法来做到这一点。

标准 (C90) 库中是否有任何预定义函数,还是我们必须创建自己的实现?

【问题讨论】:

  • 评论不用于扩展讨论;这个对话是moved to chat
  • 我向你推荐 GLib。
  • 用于 DOSBox 的 Glib?
  • 如果您正在为 DOS 编程,请使用 Find First FileFind Next File 功能。
  • 请注意,dir 采用的内容通常称为 glob,而不是 regex

标签: c dos c89 turbo-c


【解决方案1】:

C 不知道directories。它们是特定于operating system 的,通常由您的OS kernel 提供(但在GNU Hurd 内部作为例外,在unikernels 中查看)。阅读 C11 标准 n1570 并在 2020 年忘记过时的 C89 标准和 TurboC。考虑尝试一些Linux distribution(例如UbuntuDebian 或其他)。它们中的大多数提供GCCClang(或非optimizing TinyCC 编译器)并且对开发人员非常友好。我的建议:使用 GCC as gcc -Wall -Wextra -g。选择一个足够好的built automation 工具(可能是GNU make)和适当的source-code editor(例如GNU emacsvimgeany 或其他)。了解how to debug small programs 并使用GDB 调试器和git 版本控制工具。

POSIX 确实了解目录(它是用英文编写的API 规范,也定义了regex(3))。请参阅here,并阅读Linux man pages。还有WinAPI

在 Linux 上,请参阅mkdir(2)chdir(2)readdir(3)getcwd(3)unlink(2)stat(2)open(2)nftw(3)path_resolution(7) 等;您可能想研究Linux kernel 的源代码和一些常见的C 库,例如GNU glibcmusl-libc。为这几个月的全部时间预算。它们是open source,因此在某些条件下,您可以学习、改进和重复使用它们的source code。另见http://linuxfromscratch.org/

另请注意popen。您可能不想使用它,而是更喜欢使用更原始的system calls(请参阅syscalls(2) 了解他们在Linux 上的列表)。你可以使用像Glib(来自GTK)这样的库。

请记住,C 程序(freestanding 类)可以在裸机上运行(例如 Arduino)。在这些情况下,谈论目录没有任何意义。另请参阅osdev.org 了解更多信息,并观察Linux kernel 是用C 编写的(带有少量汇编代码)。

GrassHopper 是一个主要用 C 语言编写的操作系统,没有任何文件或目录。另请参阅 tunes.orgtccboot 上存档的旧讨论。

【讨论】:

  • 你能分享一下 POSIX C90 的下载链接吗?
  • @HelloWorld:我不认为 POSIX C90 存在。 POSIX 标准是 C 之上的 OS API。
  • C90 的任何正则表达式库?
  • @Hello World:POSIX 有一个。 C90没有
  • 实际上,我一直在寻找类似 Turbo C++ 中的库之类的东西。您昨天发布的另一个答案也是如此。但我很确定它会在未来的某个时候对其他人有所帮助。所以请不要删除它。
【解决方案2】:

使用函数findfirst开始查询目录,然后findnext进行迭代。这些函数会在一个目录中查找与给定模式匹配的所有文件,因此您可能需要将 \*.* 附加到您的目录名称以列出该目录中的所有文件。

有关详细信息,请参阅 Turbo C 文档。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-17
    • 1970-01-01
    • 1970-01-01
    • 2017-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多