You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在C程序中使用cp命令能否获取TEMP_DIRECTORY内的待复制文件列表?

获取TEMP_DIRECTORY内文件列表的实现方法

当然可以实现,但你得换掉cp -rf这个复制命令——毕竟它的核心作用是拷贝文件,要获取目录内的文件列表,得用ls、find这类专门的命令,或者直接用C标准库的目录遍历函数(更推荐后者)。下面分两种方案给你说明:

方案1:在C程序中调用bash命令获取列表

如果你坚持通过bash命令的方式实现,可以用system()或popen()函数来执行ls或find,结合你定义的宏来拼接命令:

示例代码(用popen捕获输出)

#define TEMP_DIRECTORY "/tmp/my_temp_dir"
#define USER_DIR "/home/my_user/target_dir"

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
    // 拼接ls命令,列出TEMP_DIRECTORY下的所有文件
    char cmd_buffer[512];
    snprintf(cmd_buffer, sizeof(cmd_buffer), "ls -1 %s/*", TEMP_DIRECTORY);
    
    // 使用popen捕获命令输出,方便在C程序中处理文件名
    FILE *cmd_output = popen(cmd_buffer, "r");
    if (!cmd_output) {
        perror("Failed to run command");
        return EXIT_FAILURE;
    }

    char filename[256];
    printf("Files in TEMP_DIRECTORY:\n");
    while (fgets(filename, sizeof(filename), cmd_output)) {
        // 移除换行符
        filename[strcspn(filename, "\n")] = '\0';
        printf("- %s\n", filename);
    }

    pclose(cmd_output);
    return EXIT_SUCCESS;
}

⚠️ 注意:如果你的TEMP_DIRECTORY路径包含空格、引号这类特殊字符,直接拼接命令会出错,甚至有shell注入风险。这种情况下建议用find命令的-print0参数配合xargs -0,或者直接用下面的方案2。

方案2:用C标准库直接遍历目录(更安全高效)

其实C语言本身提供了目录遍历的标准函数,不需要依赖bash命令,不仅更高效,还能避免shell相关的安全问题:

示例代码

#define TEMP_DIRECTORY "/tmp/my_temp_dir"
#define USER_DIR "/home/my_user/target_dir"

#include <stdio.h>
#include <dirent.h>
#include <string.h>

int main() {
    DIR *dir_ptr = opendir(TEMP_DIRECTORY);
    if (!dir_ptr) {
        perror("Failed to open directory");
        return EXIT_FAILURE;
    }

    struct dirent *dir_entry;
    printf("Files in TEMP_DIRECTORY (using C standard library):\n");
    while ((dir_entry = readdir(dir_ptr)) != NULL) {
        // 跳过当前目录(.)和上级目录(..)
        if (strcmp(dir_entry->d_name, ".") == 0 || strcmp(dir_entry->d_name, "..") == 0) {
            continue;
        }
        printf("- %s\n", dir_entry->d_name);
    }

    closedir(dir_ptr);
    return EXIT_SUCCESS;
}

总结

  • 如果你只是快速打印文件列表,调用bash命令可以实现,但要注意路径特殊字符的处理;
  • 如果需要在C程序中对文件名做进一步处理(比如复制、修改),优先用C标准库的opendir()/readdir(),代码更健壮,也不需要依赖外部shell环境。

内容的提问来源于stack exchange,提问作者liv2hak

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:32:38