【问题标题】:Navigating through files using dirent.h? [duplicate]使用dirent.h 浏览文件? [复制]
【发布时间】:2014-07-31 23:47:24
【问题描述】:

我想知道如何通过 C 中的代码导航和编辑文件夹和文件。我查找了库 dirent.h,但我不确定哪些函数用于遍历目录。我什至在这种情况下使用了正确的库吗?如果是这样,您能否简要解释一下我需要在文件夹中移动和更改文件的一些基本功能。另外,我是否必须使用某种指针来跟踪我当前所在的目录,就像使用链表一样?我是否需要创建一棵二叉树才能获得指针可以指向的东西?

【问题讨论】:

    标签: c dirent.h


    【解决方案1】:

    最重要的功能是:

    opendir(const char *) - 打开一个目录并返回一个 DIR 类型的对象

    readdir(DIR *) - 读取目录的内容并返回一个dirent(struct)类型的对象

    closedir(DIR *) - 关闭一个目录

    例如,您可以使用以下代码列出目录的内容:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <dirent.h>
    
    char *pathcat(const char *str1, char *str2);
    
    int main()
    {
        struct dirent *dp;
        char *fullpath;
        const char *path="C:\\test\\"; // Directory target
        DIR *dir = opendir(path); // Open the directory - dir contains a pointer to manage the dir
        while (dp=readdir(dir)) // if dp is null, there's no more content to read
        {
            fullpath = pathcat(path, dp->d_name);
            printf("%s\n", fullpath);
            free(fullpath);
        }
        closedir(dir); // close the handle (pointer)
        return 0;
    }
    
    char *pathcat(const char *str1, char *str2)
    {
        char *res;
        size_t strlen1 = strlen(str1);
        size_t strlen2 = strlen(str2);
        int i, j;
        res = malloc((strlen1+strlen2+1)*sizeof *res);
        strcpy(res, str1);
        for (i=strlen1, j=0; ((i<(strlen1+strlen2)) && (j<strlen2)); i++, j++)
            res[i] = str2[j];
        res[strlen1+strlen2] = '\0';
        return res;
    }
    

    pathcat 函数只是连接 2 个路径。

    此代码仅扫描所选目录(不扫描其子目录)。您必须创建自己的代码来执行'深度'扫描(递归函数等)。

    【讨论】:

    • 请注意,pathcat() 假定第一个路径以适当的分隔符结尾(分隔符;'\\' 用于 Windows,'/' 用于 Unix),正如它在此代码中所做的那样。更通用的版本会在中间添加分隔符,但您需要调整内存分配(添加额外的字符)以避免溢出。代码可能受益于sprintf();或者它可以使用memmove()memcpy(),因为您知道字符串的长度。事实上,您应该始终知道字符串的长度,因此 memmove() 应该始终是一个选项。
    猜你喜欢
    • 2014-03-14
    • 1970-01-01
    • 2016-03-25
    • 2023-03-15
    • 2017-12-14
    • 1970-01-01
    • 2013-03-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多