gpt4 book ai didi

C opendir() 不打开目录?

转载 作者:行者123 更新时间:2023-12-04 11:50:26 26 4
gpt4 key购买 nike

我在 C 方面并不是那么有经验,但是在我的一门课上有一个作业,而且我在打开目录时遇到了一些问题。

该计划的目的是(释义):

  • 如果未提供标志或目录,则列出当前目录中的文件名。
  • 如果提供了标志 (-l),则列出有关每个文件的更多信息。
  • 如果提供了标志和目录,则转到该目录并列出有关该目录中每个文件(或目录)的信息。没有必要通过子目录递归。

  • 它不需要处理仅获取目录但没有标志或无效目录。这是更多的概念验证。

    我已经设法满足第 1 部分和第 2 部分的要求,但第 3 部分不断中断,出现段错误。

    我的代码如下:
    void recursedirect(char* flag, char* directory)
    {
    DIR* dir;
    struct dirent *entry;

    printf("Flag: %s\nDirectory: %s\n\n", flag, directory);

    if (flag == NULL)
    // No flag provided, therefore only do file names.
    {
    dir = opendir(".");
    entry = readdir(dir);

    while (entry != NULL)
    {
    printf ("%s\n", entry->d_name);
    entry = readdir(dir);
    }
    }
    else if (strcmp(flag, "-l") == 0 && directory == NULL)
    // No directory provided, but flag provided
    {
    dir = opendir(".");
    entry = readdir(dir);

    while (entry != NULL)
    {
    fileinfo(directory);
    entry = readdir(dir);
    }
    }
    else if (strcmp(flag, "-l") != 0)
    {
    printf("Invalid flag.\n");
    }
    else
    // A directory is provided
    {
    dir = opendir(directory);

    if (dir != NULL)
    {
    entry = readdir(dir);

    while (entry != NULL)
    {
    fileinfo(directory);
    entry = readdir(dir);
    }
    }
    else
    printf("Something went wrong. It might be an invalid filename.\n");
    }
    }

    具体来说,最后的 else 语句给我带来了麻烦。我试过给它任何我能想到的文件路径,硬编码和其他,但它仍然给我带来问题。我猜这很简单,但我没有足够的经验来知道它是什么。
    fileinfo是一个输出文件信息的函数,给定 DIRdirent作为论据。但是,错误绝对不是我能说的最好的代码。

    编辑:我犯了没有分享一切的错误。我的主要方法非常简单。
    int main (int argc, char** argv)
    {
    char* flag = argv[1];
    char* directory = argv[2];

    recursedirect(flag, directory);
    }//main

    它包括以下内容:
    #include <dirent.h>
    #include <string.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <unistd.h>
    #include <time.h>
    #include <fcntl.h>

    fileinfo函数如下(稍微编辑,因为我意识到我不再需要给它一个参数 DIR *dir ):
    void fileinfo(struct dirent *entry)
    {
    struct stat fileStats;
    stat(entry->d_name, &fileStats);

    printf("File Name: %s\n", entry->d_name);
    printf("File Size: %d bytes\n", (int) fileStats.st_size);
    printf("Number of Blocks: %d\n", (int) fileStats.st_blocks);
    printf("Number of Links/References: %d\n", (int) fileStats.st_nlink);
    printf("I-Node: %d\n", (int) fileStats.st_ino);
    printf("Device ID: %d\n", (int) fileStats.st_dev);
    printf("User ID: %d\n", (int) fileStats.st_uid);
    printf("Group ID: %d\n", (int) fileStats.st_gid);

    stat("alphabet",&fileStats);
    printf("Time of Last Access: %s", ctime(&fileStats.st_atime));
    printf("Time of Last Modification: %s", ctime(&fileStats.st_mtime));
    printf("Time of Last Status Change: %s", ctime(&fileStats.st_ctime));

    stat(entry->d_name, &fileStats);
    printf("File Permissions: ");
    printf((int) (S_ISDIR(fileStats.st_mode)) ? "d" : "-");
    printf((int) (fileStats.st_mode & S_IRUSR) ? "r" : "-");
    printf((int) (fileStats.st_mode & S_IWUSR) ? "w" : "-");
    printf((int) (fileStats.st_mode & S_IXUSR) ? "x" : "-");
    printf((int) (fileStats.st_mode & S_IRGRP) ? "r" : "-");
    printf((int) (fileStats.st_mode & S_IWGRP) ? "w" : "-");
    printf((int) (fileStats.st_mode & S_IXGRP) ? "x" : "-");
    printf((int) (fileStats.st_mode & S_IROTH) ? "r" : "-");
    printf((int) (fileStats.st_mode & S_IWOTH) ? "w" : "-");
    printf((int) (fileStats.st_mode & S_IXOTH) ? "x\n\n" : "-\n\n");
    }

    关于失败输入的更多说明, ./files./files -l两者都工作。 ./files按预期捕获任何无效标志。然而, ./files -l *any valid filepath*一直失败。

    一切都是使用 gcc 编译的在 c9.io IDE 中的 Ubuntu 14.04.5 中。

    谢谢!

    编辑 2:我尝试删除并放回文件,现在奇怪的是我没有收到错误消息。但是,现在它不会打印任何内容的完整文件信息。我会再解决一些问题。

    编辑 3:我已经修复了它,但有一个异常(exception)。问题是检查标志的 if 语句不正确。显然 IDE 中出了点问题。我现在收到此错误: Couldn't open MANPATH=/home/ubuntu/.nvm/versions/node/v6.11.2/share/man:/usr/local/rvm/rubies/ruby-2.4.0/share/man:/usr/local/man:/usr/local/share/man:/usr/share/man:/usr/local/rvm/man
    看起来这不是代码,并且在某种程度上是 c9 服务器的问题。我试过给源代码和编译的代码文件完全权限,重新启动工作区,并重新启动 Apache2。谢谢大家所做的一切!

    最佳答案

    除了 chux 留下的评论,您可能会受益于重构代码以重用类似的块。您提到您已经解决了第 1 部分和第 2 部分(由 if 语句中的前两个分支表示)。因此,理论上以下 if 块会产生正确的输出。如果您对其进行简化,从而减少重写代码,您可能会受益。

    if (flag == NULL)
    // No flag provided, therefore only do file names.
    {
    dir = opendir(".");
    entry = readdir(dir);

    while (entry != NULL)
    {
    printf ("%s\n", entry->d_name);
    entry = readdir(dir);
    }
    }
    else if (strcmp(flag, "-l") == 0 && directory == NULL)
    // No directory provided, but flag provided
    {
    dir = opendir(".");
    entry = readdir(dir);

    while (entry != NULL)
    {
    fileinfo(directory);
    entry = readdir(dir);
    }
    }

    不是这样写,你可以事先检查标志,并设置一个变量(在这种情况下 more_file_info != 0 告诉我们打印,如果标志无效,我们 return)。
    int more_file_info = 0;
    if (flag != NULL) {
    if(strcmp(flag, "-l") == 0) {
    more_file_info = 1;
    } else {
    printf("Invalid flag.\n");
    return;
    }
    }

    然后,您可以按如下方式简化/重构上述(可能有效)代码:
    void recursedirect(char* flag, char* directory)
    {
    DIR* dir;
    struct dirent *entry;
    int more_file_info = 0;

    printf("Flag: %s\nDirectory: %s\n\n", flag, directory);
    // Validate argument up front
    if (flag != NULL) {
    if(strcmp(flag, "-l") == 0) {
    more_file_info = 1;
    } else {
    printf("Invalid flag.\n");
    return;
    }
    }

    // The 'directory' parameter only changes opendir, so we reflect that here
    if(directory != NULL) {
    dir = opendir(directory);
    } else {
    dir = opendir(".");
    }
    // Adding some error checking, per comment
    if(dir == NULL) {
    printf("Couldn't open %s\n", directory);
    return;
    }
    // The readdir() loop is basically the same
    entry = readdir(dir);
    while (entry != NULL)
    {
    // Although we check a flag every time this loop runs,
    // it makes the code easier to follow
    if(more_file_info != 0) {
    printf ("%s\n", entry->d_name);
    } else {
    fileinfo(directory);
    // Or should this be:
    // fileinfo(entry);
    }
    entry = readdir(dir);
    }
    }

    这消除了大量重复的代码,并有望使故障排除更容易。另请注意,这会处理指定目录但未指定标志的情况,您可以明确检查是否需要不同的行为。希望通过更多信息,我们可以提供更合适的答案。

    关于C opendir() 不打开目录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50070252/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com