C语言如何不使用完整路径检查APPDATA目录下的文件是否存在
解决方法
问题根因
你代码中的%APPDATA%是Windows Shell专属的环境变量占位符,只有资源管理器、cmd等Shell程序会自动解析这个占位符为实际路径,C标准库的access函数不会做这个解析,会直接把%APPDATA%当成普通目录名查找,因此找不到目标文件。
实现步骤
你需要先调用Windows API获取APPDATA的实际路径,再拼接目标文件名生成完整路径后做存在性校验,可运行的修改后代码如下:
#include <stdio.h> #include <unistd.h> #include <windows.h> int main(void) { char appdata_buf[MAX_PATH]; char full_file_path[MAX_PATH]; // 读取APPDATA环境变量的实际值 DWORD get_env_ret = GetEnvironmentVariableA("APPDATA", appdata_buf, MAX_PATH); if (get_env_ret == 0 || get_env_ret > MAX_PATH) { printf("获取APPDATA路径失败"); return 1; } // 拼接生成目标文件的完整路径 _snprintf(full_file_path, MAX_PATH, "%s\\changzhi_leidianmac.data", appdata_buf); // 检查文件是否存在 if (access(full_file_path, F_OK) != -1) { printf("File Found......"); } else { printf("File not found !!!!"); } return 0; }
注意事项
- 代码中使用
MAX_PATH作为缓冲区大小,适配Windows默认的最大路径长度限制,避免缓冲区溢出 - 如果你需要兼容更高版本的长路径支持,可以调整缓冲区大小并启用Windows长路径相关配置
- 也可以替换
access为Windows原生APIPathFileExistsA做文件存在性校验,使用时需要额外包含<shlwapi.h>头文件,并且编译时链接shlwapi.lib库
内容的提问来源于stack exchange,提问作者user6782081
相关产品推荐
相关产品推荐

