将前缀和后缀相同的文件移动到同一个目录的算法设计及C代码实现
问题描述
假设我们有一个目录,其中包含许多文件。我们想要编写一个算法,将前缀和后缀相同的文件移动到同一个目录下。也就是说,我们要将具有相同前缀和后缀的文件归类到同一个文件夹中。
算法设计
我们可以通过以下步骤来设计算法:
- 遍历目录下的所有文件。
- 对于每一个文件,提取它的前缀和后缀。
- 检查是否存在一个与当前文件前缀和后缀相同的目录。如果不存在,则创建一个新目录。
- 将当前文件移动到该目录下。
简单来说,我们需要找到所有具有相同前缀和后缀的文件,并将它们移动到同一个目录中。
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); } }