Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C语言中,如何到达指定的目录?_C_Recursion_Posix_Directory - Fatal编程技术网

在C语言中,如何到达指定的目录?

在C语言中,如何到达指定的目录?,c,recursion,posix,directory,C,Recursion,Posix,Directory,我必须做一个程序,我需要索引指定目录中的文件。我已经完成了索引部分,但我遇到的问题是如何导航到目录。 例如,当我启动程序时,它会询问“您希望索引哪个目录”,然后输入“usr/Documents/CS/Assignment4”,我如何到达“Assignment4”目录?我知道需要递归,但我真的很困惑C中的目录是如何工作的。假设我的源文件在“usr/Documents/SourceCode”中,那么我应该怎么做才能获得Assignment4 我知道我听起来想要所有的答案,但我完全不知道目录是如何工作

我必须做一个程序,我需要索引指定目录中的文件。我已经完成了索引部分,但我遇到的问题是如何导航到目录。 例如,当我启动程序时,它会询问“您希望索引哪个目录”,然后输入“usr/Documents/CS/Assignment4”,我如何到达“Assignment4”目录?我知道需要递归,但我真的很困惑C中的目录是如何工作的。假设我的源文件在“usr/Documents/SourceCode”中,那么我应该怎么做才能获得Assignment4

我知道我听起来想要所有的答案,但我完全不知道目录是如何工作的,我的书很烂。所以,即使你所拥有的只是一个关于这个的好教程的链接,那也太棒了


我正在运行Linux,确切地说是Ubuntu。GCC是编译器。

C编程语言没有文件系统的概念。这是一个操作系统特有的问题

基于您问题中的目录样式,尽管听起来您使用的是unix/linux样式的系统。如果是这种情况,那么您正在寻找
opendir
函数


目录的名称只是一个字符串

所以opendir(“文件名”);将使读取目录“文件”成为可能

但是,您可能应该开始考虑文件名和路径

“usr/Documents/SourceCode”+“/../CS/Assignment4”与“usr/Documents/CS/Assignment4”相同,但我认为您缺少前导“/”

我不明白你怎么会迷路目录是怎么工作的。目录与Windows或Mac OS X中的“文件夹”没有什么不同。一个硬盘有一个文件系统,而一个文件系统只由“包含”文件的文件夹/目录组成(以及命名套接字等特殊文件,您现在对此不感兴趣)

希望这至少有点帮助


Angelo递归地遍历C中的目录如下:

使用
opendir
readdir
列出目录条目。我可能不应该这样做,但我发布了一个完整的代码示例(sans错误处理),因为要确保正确使用API,您需要做一些小事情:

DIR           *dir;
struct dirent *de;
const char    *name;

dir = opendir(dirpath);
if (dir == NULL) {
    /* handle error */
}

for (;;) {
    errno = 0;
    de = readdir(dir);
    if (de == NULL) {
        if (errno != 0) {
            /* handle error */
        } else {
            /* no more entries left */
            break;
        }
    }

    /* name of file (prefix it with dirpath to get a usable file path) */
    name = de->d_name;

    /* ignore . and .. */
    if (name[0] == '.' && (name[1] == '\0' || (name[1] == '.' && name[2] == '\0')))
        continue;

    /* do something with the file */
}

if (closedir(dir) != 0) {
    /* handle error */
}
在处理每个文件时,请确保预先添加指向该文件的dirpath(如果需要,请加上斜杠)。您也可以使用
chdir
来下降和上升,但这在实践中会带来复杂性(例如,您不能同时遍历两个目录),因此我个人建议您保持当前工作目录不变,并使用字符串操作来连接路径

为了确定路径是否是目录(以及是否应该
opendir()
it),我建议使用
lstat()
,而不是
stat()
,因为后者遵循符号链接,这意味着您的目录遍历可能会陷入循环,最终会得到一些结果


当然,由于目录结构本质上是递归的,递归在遍历过程中起着自然的作用:当子路径是目录时,进行递归调用。

对不起,我的措辞错了。不知道目录如何工作,只知道如何在C中使用它们。例如如何遍历目录等。一个简单的解决方案可能是在要索引的目录中运行程序。听起来您正在编写“ls-e”系统实用程序:)