0

我必须做什么

我必须从一个目录开始,找到一个文件,该文件位于所有目录之一中,该目录具有作为根目录在输入中传递的目录。shell 命令之类的东西find

输入输出

在输入中有这个:

./myfind /home/claudio/Scrivania file.txt

我在输出、绝对路径和最后修改日期 ecc 中需要这样的东西:

/home/claudio/Scrivania/SistemiOperativi/file.txt   Tue Mar 30 19:51:54 2021

我的代码 它不打印任何东西。

#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>
#include <sys/stat.h>
#include <unistd.h>
#include <string.h>
#include <time.h>
#include <stdlib.h>
#include <errno.h>

#if !defined(NAME_MAX)
#define NAME_MAX 256
#endif

void find(const char* passed_dir_name, const char* passed_file_name) {
    if (chdir(passed_dir_name) == -1) {
        perror("FATAL ERROR CHANGING DIRECTORY");
        exit(EXIT_FAILURE);
    }
    DIR* current_directory;
    if ((current_directory = opendir(".")) == NULL) {
        perror("FATAL ERROR OPENING CURRENT WORKING DIRECTORY");
        exit(EXIT_FAILURE);
    }
    char* buf;
    if ((buf = calloc(NAME_MAX, sizeof(char))) == NULL) {
        perror("FATAL ERROR ALLOCATING MEMORY");
        exit(EXIT_FAILURE);
    }
    struct dirent* dir;
    while ((dir = readdir(current_directory)) != NULL) {
        struct stat statbuf;
        stat(dir->d_name, &statbuf);
        if (S_ISDIR(statbuf.st_mode)) {
            if (strncmp(dir->d_name, ".", 1) != 0 && strncmp(dir->d_name, "..", 2) != 0) {
                find(dir->d_name, passed_file_name);
            }
        } else {
            if (strncmp(dir->d_name, passed_file_name, strlen(passed_file_name) == 0)) {
                if (getcwd(buf, NAME_MAX) == NULL) {
                    perror("FATAL ERROR");
                    exit(EXIT_FAILURE);
                }
            fprintf(stdout, "%s/%s     %s", buf, dir->d_name, ctime(&statbuf.st_mtime));   
            }
        }
    }
    if (closedir(current_directory) == -1) {
        perror("FATAL ERROR CLOSING CURRENT WORKING DIRECTORY");
        exit(EXIT_FAILURE);
    }  
    chdir("..");
    free(buf);
}

int main(int argc, char** argv) {
    if (argc != 3) {
        fprintf(stderr, "ERROR: RUn as ./myfind directory\n");
        exit(EXIT_FAILURE);
    }
    const char* dir = argv[1];
    const char* file = argv[2];
    struct stat statbuf;
    stat(dir, &statbuf);
    if(!S_ISDIR(statbuf.st_mode)) {
        fprintf(stderr, "FATAL ERROR: %s IS NOT A DIRECTORY\n", dir);
        exit(EXIT_FAILURE);
    }
    find(dir, file);
    exit(EXIT_SUCCESS);
}
4

1 回答 1

2

你的括号是错误的:

if (strncmp(dir->d_name, passed_file_name, strlen(passed_file_name) == 0))

你需要写:

if (strncmp(dir->d_name, passed_file_name, strlen(passed_file_name)) == 0)

由于strncmp(x, y, 0)将始终返回 0,因此永远不会满足条件。

但请注意,在这里使用完全没有意义strncmpstrncmp仅当您不知道您的条目之一是空终止字符串时才需要。你有一个空终止的保证,d_name如果passed_file_name不是,那么strlen就会有问题。你不妨只写strcmp(dir->d_name, passed_file_name)

于 2021-03-31T21:30:47.423 回答