You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Windows下用C语言创建目录遇问题:需先切换目录再创建

在Windows用C语言实现「先切换目录再创建新目录」的方案

嘿,我看你现在的需求是在Windows下用C语言先切换到指定目录,再创建新目录,同时你现有的代码是在检查db/medicine/目录下是否存在同名条目对吧?那我来一步步给你梳理解决方案,顺便修正你代码里的小问题~

首先:切换工作目录的两种方法

在C语言里,切换当前进程的工作目录有两种常用方式,适配Windows环境:

方式1:用标准C的_chdir函数

Windows下标准C的chdir是带下划线的_chdir,需要包含<direct.h>头文件,示例代码如下:

#include <stdio.h>
#include <direct.h>

int main() {
    // 切换到db/medicine目录,路径可以用正斜杠/或者转义反斜杠\\
    if (_chdir("db/medicine/") != 0) {
        perror("切换目录失败"); // 会自动输出对应的错误原因
        return 1;
    }
    printf("成功切换到目标目录\n");
    // 接下来就可以创建新目录啦
    return 0;
}

方式2:用Windows原生API SetCurrentDirectory

如果想要更详细的错误信息,可以用Windows API,需要包含<windows.h>

#include <windows.h>
#include <stdio.h>

int main() {
    // 用ANSI版本的函数(宽字符版本用SetCurrentDirectoryW)
    if (!SetCurrentDirectoryA("db/medicine/")) {
        printf("切换目录失败,错误码:%d\n", GetLastError());
        return 1;
    }
    // 后续操作
    return 0;
}

然后:切换目录后创建新目录

切换成功后,创建目录也有两种对应方式:

标准C的_mkdir函数

// 假设要创建的目录名是new_med_db
if (_mkdir("new_med_db") != 0) {
    perror("创建目录失败");
} else {
    printf("目录创建成功!\n");
}

Windows API的CreateDirectory

if (!CreateDirectoryA("new_med_db", NULL)) {
    printf("创建目录失败,错误码:%d\n", GetLastError());
} else {
    printf("目录创建成功!\n");
}

最后:修正你现有代码的关键问题

我注意到你代码里用了medicine.name == de->d_name来比较字符串,这是错误的!因为==比较的是两个字符串指针的地址,不是字符串的内容,必须用strcmp函数来比较,还要记得排除目录里默认的...条目,修正后的代码片段如下:

#include <stdio.h>
#include <dirent.h>
#include <string.h> // 必须包含这个头文件才能用strcmp

// 假设你已经定义了medicine结构体
// struct Medicine { char name[256]; ... } medicine;

struct dirent *de;
DIR *dr = opendir("db/medicine/");
if (dr == NULL) {
    printf("无法打开目标目录\n");
    return 0;
}

int directory_name_hit = 0;
while ((de = readdir(dr)) != NULL) {
    printf("%s\n", de->d_name);
    // 跳过.和..目录,避免误判
    if (strcmp(de->d_name, ".") != 0 && strcmp(de->d_name, "..") != 0) {
        // 用strcmp比较字符串内容,相等返回0
        if (strcmp(medicine.name, de->d_name) == 0) {
            directory_name_hit = 1;
            printf("\n\n这个药品数据库已经存在啦!\n");
            break; // 找到后直接退出循环,不用继续遍历
        }
    }
}
closedir(dr); // 别忘了关闭目录句柄,避免资源泄漏

// 如果没找到同名目录,就切换过去创建新目录
if (!directory_name_hit) {
    if (_chdir("db/medicine/") != 0) {
        perror("切换目录失败");
        return 1;
    }
    if (_mkdir(medicine.name) != 0) {
        perror("创建药品目录失败");
    } else {
        printf("药品目录创建成功!\n");
    }
}

一些额外提醒

  • Windows路径格式:如果用绝对路径,记得用转义反斜杠\\(比如C:\\Users\\YourName\\db\\medicine),或者直接用正斜杠/也可以被系统识别
  • 权限问题:确保你的程序有读写目标目录的权限,否则会切换或创建失败
  • 跨平台考虑:如果以后要移植到Linux,把_chdir改成chdir_mkdir改成mkdir就行,标准C函数兼容性更好

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

火山引擎 最新活动