C программа для создания папок на основе расширений файлов и копирования файлов с расширениями в них - PullRequest
0 голосов
/ 29 октября 2019

Я пытаюсь создать программу AC, которая читает расширения файлов в текущем рабочем каталоге. Затем программа создает папки, которые соответствуют расширениям файлов. Затем он копирует каждый файл со своего cwd в соответствующую папку. Например:

hello.txt в созданную папку .txt

Код успешно создает папки для всех расширений файлов в текущем каталоге, но вылетает, когда начинает копировать.

Вот весь код.

#include <stdio.h>
#include <dirent.h>
#include <string.h>
#include <dir.h>
#include <stdlib.h>
#include <errno.h>

int main(void) {

    FILE *input, *output;   // Two files, input and output
    char ch;    // ch is used to assign characters from input file which will then be copied into the output file
    char *exe = ".exe";
    struct dirent *de;

    DIR *dr = opendir("."); // Open directory for reading
    printf("%s", dr->dd_name);

    // If directory doesn't exist, quit
    if(dr == NULL) {
        printf("Can't open current directory.");
        return 0;
    }

    // Loop first to create a directory corresponding to all
    // extensions present in the current directory
    while((de = readdir(dr)) != NULL) {
        char *filename = de->d_name;    // Get the filename
        char *ext = strrchr(filename, '.'); // Get the extension

        if(!(!ext || ext == filename)){ // Compare extension
            int check = mkdir(ext);

            if(!check)//Check if the directory was created
                printf("Directory created successfully.\n");
            else {
                printf("Unable to create directory.\n");
            }

        }
    }

    // Close the directory so as to reset the pointer ready for the next read.
    closedir(dr);

    dr = opendir(".");

    // Loop  reading each file and checking which
    // directory it corresponds to.

    while((de = readdir(dr)) != NULL) {
        char *filename = de->d_name;    // Get the filename
        char *ext = strrchr(filename, '.'); // Get the extension
        if(!(!ext || ext == filename)){ // Check for a valid extension
            DIR *file_ext_dir = opendir(ext); // Open the dir that corresponds to the extension of the file.
            char *dir_name = file_ext_dir->dd_name; //Get the dir name of the opened directory

            if(file_ext_dir && (strcmp(dir_name, "..") != 0)&& (strcmp(ext, exe) !=0) ) { //ignore .exe and the cwd
                printf("Successfully opened: %s dir\n", file_ext_dir->dd_name);
                char *output_path = strcat(dir_name, filename);
                printf("Ready to copy files from %s to:  %s\n", filename, output_path);

                output = fopen(output_path, "a+");  // Open output.txt for appending, if doesn't exist, create it.
                input = fopen(filename, "r");   // Open the input file ()'filename') for reading


                while(1) {  // Loop through the input file
                    ch = fgetc(input);  // Get the current character
                    if(ch == EOF) break;    // Stop if EOF is found
                    putc(ch, output);   // Put current character from the input file into output.txt
                }

                fclose(input);  // Close input file
                fclose(output); // Close output file
                closedir(file_ext_dir);
            } else if(ENOENT == errno){ //Check if there is no such directory and handle the error
                printf("Dir does not exist.");
            }else {
                continue; //Skip that file if for some reason the directory cannot be opened.
            }
        }
    }

    closedir(dr);   // Close directory
    printf("Created directories and copied all files to that correspond to them.");
    return 0;
}
...