AI 日报

将前缀和后缀相同的文件移动到同一个目录的算法设计及C代码实现

  • By admin
  • Oct 18, 2023 - 2 min read



问题描述

假设我们有一个目录,其中包含许多文件。我们想要编写一个算法,将前缀和后缀相同的文件移动到同一个目录下。也就是说,我们要将具有相同前缀和后缀的文件归类到同一个文件夹中。

算法设计

我们可以通过以下步骤来设计算法:

  1. 遍历目录下的所有文件。
  2. 对于每一个文件,提取它的前缀和后缀。
  3. 检查是否存在一个与当前文件前缀和后缀相同的目录。如果不存在,则创建一个新目录。
  4. 将当前文件移动到该目录下。

简单来说,我们需要找到所有具有相同前缀和后缀的文件,并将它们移动到同一个目录中。

C代码实现

头文件和变量声明


#include 
#include 
#include 

// 定义一个结构体表示文件的前缀和后缀
typedef struct {
    char prefix[100];
    char suffix[100];
} FileDetails;

函数定义


// 函数声明
void moveFilesWithSamePrefixAndSuffix(char* directoryPath);

// 移动文件的函数
void moveFile(char* sourcePath, char* destinationPath);

// 获取文件的前缀和后缀
FileDetails getFileDetails(char* filename);

// 创建新目录的函数
void createDirectory(char* newDirectory);

// 主函数
int main() {
    // 假设我们要处理的目录是 "files" 目录
    char* directoryPath = "files";
    
    // 调用函数进行文件移动操作
    moveFilesWithSamePrefixAndSuffix(directoryPath);
    
    return 0;
}

实现细节


// 函数实现
void moveFilesWithSamePrefixAndSuffix(char* directoryPath) {
    DIR* directory;
    struct dirent* file;
    
    // 打开目录
    directory = opendir(directoryPath);
    
    if (directory != NULL) {
        // 读取目录下的所有文件
        while ((file = readdir(directory)) != NULL) {
            
            // 获取文件名
            char* filename = file->d_name;
            
            // 如果文件名为 "." 或 "..",则跳过
            if(strcmp(filename, ".") == 0 || strcmp(filename, "..") == 0){
                continue;
            }
            
            // 获取文件的前缀和后缀
            FileDetails fileDetails = getFileDetails(filename);
            
            // 构建新目录路径
            char newDirectory[200];
            strcpy(newDirectory, directoryPath);
            strcat(newDirectory, "/");
            strcat(newDirectory, fileDetails.prefix);
            strcat(newDirectory, fileDetails.suffix);
            
            // 创建新目录(如果不存在)
            createDirectory(newDirectory);
            
            // 移动文件到新目录
            char sourcePath[200];
            strcpy(sourcePath, directoryPath);
            strcat(sourcePath, "/");
            strcat(sourcePath, filename);
            
            char destinationPath[200];
            strcpy(destinationPath, newDirectory);
            strcat(destinationPath, "/");
            strcat(destinationPath, filename);
            
            moveFile(sourcePath, destinationPath);
        }
        
        closedir(directory);
    }
}

// 移动文件的函数
void moveFile(char* sourcePath, char* destinationPath) {
    // 使用 rename 函数来移动文件
    int result = rename(sourcePath, destinationPath);
    
    if (result == 0) {
        printf("%s 文件移动成功。
", sourcePath);
    } else {
        printf("%s 文件移动失败。
", sourcePath);
    }
}

// 获取文件的前缀和后缀
FileDetails getFileDetails(char* filename) {
    FileDetails fileDetails;
    
    char* dot = strrchr(filename, '.');
    if (dot) {
        strncpy(fileDetails.suffix, dot, sizeof(fileDetails.suffix));
        strncpy(fileDetails.prefix, filename, dot - filename);
    } else {
        fileDetails.prefix = filename;
        strcpy(fileDetails.suffix, "");
    }
    
    return fileDetails;
}

// 创建新目录的函数
void createDirectory(char* newDirectory) {
    // 使用 mkdir 函数来创建新目录
    int result = mkdir(newDirectory, 0700);
    
    if (result == 0) {
        printf("目录 %s 创建成功。
", newDirectory);
    } else {
        printf("目录 %s 创建失败。
", newDirectory);
    }
}