为何同一C语言程序中无法同时正常使用fopen与mkdir函数?
fopen与mkdir无法同时生效的问题分析
问题场景
你在程序中先调用fopen创建名为File的普通文件,随后调用mkdir尝试创建同名目录,但发现只有fopen生效,mkdir看似没执行。但单独调用两个函数时都能正常工作。
核心原因
问题出在同名资源冲突,而非编译器不执行mkdir:
- 当你用
fopen("File", "w")时,系统会在当前目录下创建一个普通文件(如果不存在)。 - 文件系统的规则是:同一目录下,不能同时存在同名的普通文件和目录。所以当
mkdir("File", 0777)执行时,因为已经存在同名的普通文件,mkdir会直接执行失败,只是你没有检查它的返回值,误以为它没运行。
验证方法
给mkdir添加返回值检查,就能看到明确的错误提示:
#include <sys/stat.h> #include <stdio.h> #include <stdlib.h> #include <errno.h> int main(){ FILE *fprt; char *filename = "File"; fprt = fopen(filename,"w"); if (!fprt ) { printf("oops, file can't be created\n"); } int ret = mkdir(filename,0777); if (ret == -1) { perror("mkdir failed"); } printf("\n"); fclose(fprt); return 0; }
运行后会输出类似mkdir failed: File exists的错误,证明mkdir确实执行了,只是因为文件已存在而失败。
解决思路
- 使用不同名称:给文件和目录设置不同的名字,比如文件叫
File.txt,目录叫File_dir。 - 调整执行顺序:如果需要在目录内创建文件,先执行
mkdir创建目录,再用fopen打开./File/xxx.txt这类带路径的文件名。
内容的提问来源于stack exchange,提问作者Justin
相关产品推荐
相关产品推荐

