C语言实战之文件移动

在C语言中,文件移动可以通过以下两种方式实现:

  1. 使用 rename 函数:如果目标文件和源文件在同一个文件系统中,可以直接使用 rename 函数来移动文件。
  2. 手动复制和删除:如果目标文件和源文件不在同一个文件系统中,需要先复制文件内容到目标位置,然后删除源文件。

以下是两种方法的实现示例:


方法 1:使用 rename 函数

rename 函数是标准库函数,用于重命名或移动文件。如果目标文件和源文件在同一个文件系统中,rename 可以直接移动文件。

示例代码

#include 
#include 

int main() {
    char sourcePath[256], targetPath[256];

    // 提示用户输入源文件路径
    printf("请输入源文件路径: ");
    scanf("%s", sourcePath);

    // 提示用户输入目标文件路径
    printf("请输入目标文件路径: ");
    scanf("%s", targetPath);

    // 使用 rename 函数移动文件
    if (rename(sourcePath, targetPath) == 0) {
        printf("文件移动成功!\n");
    } else {
        perror("文件移动失败");
        return EXIT_FAILURE;
    }

    return 0;
}

代码说明

  1. rename(sourcePath, targetPath)
  • 将文件从 sourcePath 移动到 targetPath。
  • 如果目标路径已经存在文件,rename 的行为取决于操作系统(可能会覆盖目标文件)。
  1. 返回值
  • 如果成功,rename 返回 0。
  • 如果失败,返回 -1,并设置 errno。
  1. 适用场景
  • 适用于源文件和目标文件在同一个文件系统中的情况。

方法 2:手动复制和删除

如果源文件和目标文件不在同一个文件系统中,rename 函数会失败。此时需要手动复制文件内容到目标位置,然后删除源文件。

示例代码

#include 
#include 

void copyFile(const char *sourcePath, const char *targetPath) {
    FILE *sourceFile, *targetFile;
    char buffer[1024];
    size_t bytesRead;

    // 打开源文件
    sourceFile = fopen(sourcePath, "rb");
    if (sourceFile == NULL) {
        perror("无法打开源文件");
        exit(EXIT_FAILURE);
    }

    // 打开目标文件
    targetFile = fopen(targetPath, "wb");
    if (targetFile == NULL) {
        perror("无法创建目标文件");
        fclose(sourceFile);
        exit(EXIT_FAILURE);
    }

    // 复制文件内容
    while ((bytesRead = fread(buffer, 1, sizeof(buffer), sourceFile)) > 0) {
        fwrite(buffer, 1, bytesRead, targetFile);
    }

    // 关闭文件
    fclose(sourceFile);
    fclose(targetFile);
}

int main() {
    char sourcePath[256], targetPath[256];

    // 提示用户输入源文件路径
    printf("请输入源文件路径: ");
    scanf("%s", sourcePath);

    // 提示用户输入目标文件路径
    printf("请输入目标文件路径: ");
    scanf("%s", targetPath);

    // 复制文件
    copyFile(sourcePath, targetPath);

    // 删除源文件
    if (remove(sourcePath) == 0) {
        printf("文件移动成功!\n");
    } else {
        perror("删除源文件失败");
        return EXIT_FAILURE;
    }

    return 0;
}

代码说明

  1. copyFile 函数
  • 使用 fread 和 fwrite 复制文件内容。
  • 支持大文件,使用缓冲区提高效率。
  1. remove(sourcePath)
  • 删除源文件。
  • 如果成功,返回 0;如果失败,返回 -1,并设置 errno。
  1. 适用场景
  • 适用于跨文件系统的文件移动。

编译和运行

  1. 将代码保存为 move_file.c。
  2. 使用以下命令编译:
gcc move_file.c -o move_file
  1. 运行程序:
./move_file
  1. 按照提示输入源文件路径和目标文件路径。

示例运行

输入:

请输入源文件路径: /home/user/source.txt
请输入目标文件路径: /home/user/documents/target.txt

输出:

文件移动成功!

注意事项

  1. 文件路径
  • 如果文件路径包含空格或特殊字符,需要使用引号括起来(如 "/path/with spaces/file.txt")。
  1. 权限问题
  • 确保程序有权限读取源文件和写入目标文件。
  1. 目标文件存在
  • 如果目标文件已经存在,rename 可能会覆盖它,而手动复制需要额外处理(如提示用户是否覆盖)。
  1. 跨文件系统
  • 如果源文件和目标文件不在同一个文件系统中,必须使用手动复制和删除的方法。

扩展:处理目标文件存在的情况

  • 可以在复制文件前检查目标文件是否存在,并提示用户是否覆盖:
#include 
#include 
#include 

void copyFile(const char *sourcePath, const char *targetPath) {
    FILE *sourceFile, *targetFile;
    char buffer[1024];
    size_t bytesRead;

    sourceFile = fopen(sourcePath, "rb");
    if (sourceFile == NULL) {
        perror("无法打开源文件");
        exit(EXIT_FAILURE);
    }

    targetFile = fopen(targetPath, "wb");
    if (targetFile == NULL) {
        perror("无法创建目标文件");
        fclose(sourceFile);
        exit(EXIT_FAILURE);
    }

    while ((bytesRead = fread(buffer, 1, sizeof(buffer), sourceFile)) > 0) {
        fwrite(buffer, 1, bytesRead, targetFile);
    }

    fclose(sourceFile);
    fclose(targetFile);
}

int main() {
    char sourcePath[256], targetPath[256];
    char response;

    printf("请输入源文件路径: ");
    scanf("%s", sourcePath);

    printf("请输入目标文件路径: ");
    scanf("%s", targetPath);

    // 检查目标文件是否存在
    if (fopen(targetPath, "r") != NULL) {
        printf("目标文件已存在,是否覆盖?(y/n): ");
        scanf(" %c", &response);
        if (response != 'y' && response != 'Y') {
            printf("操作取消。\n");
            return 0;
        }
    }

    copyFile(sourcePath, targetPath);

    if (remove(sourcePath) == 0) {
        printf("文件移动成功!\n");
    } else {
        perror("删除源文件失败");
        return EXIT_FAILURE;
    }

    return 0;
}

改进点:

  1. 目标文件检查
  • 使用 fopen 检查目标文件是否存在。
  1. 用户确认
  • 如果目标文件存在,提示用户是否覆盖。

这个版本更加健壮,适合实际使用。

原文链接:,转发请注明来源!