C编写的UEFI二进制运行时fopen无法读取同目录txt文件是什么原因
EFI程序无法打开同目录文本文件的原因分析
可能的原因
- UEFI环境的默认工作目录与EFI二进制文件所在目录不绑定。UEFI Shell的当前工作目录是你执行EFI程序时所在的目录,而非EFI文件本身的存放目录。例如EFI文件和txt文件都放在
fs0:\myapp\目录下,但你在fs0:\根目录执行myapp\test.efi,fopen会去根目录查找new.txt,自然查找失败。 - 你使用的UEFI C标准库(如EDK2 StdLib)的相对路径解析逻辑仅基于当前工作目录,不会自动检索EFI程序自身的存放目录。
- 文件名或属性不符合要求:UEFI下部分文件系统区分大小写,若实际文件名为
New.txt或NEW.TXT,写new.txt会找不到;若文件设置了隐藏、系统属性,也可能导致fopen读取失败。 - 若你使用QEMU+OVMF等模拟环境运行,可能存在文件系统挂载错误,new.txt实际未被放到对应路径下。
解决方法
- 先使用绝对路径测试:将代码中的文件名改为绝对路径,例如
const char* filename = "fs0:\\myapp\\new.txt";(注意路径中的反斜杠需要转义),如果可以正常打开,即可确认是相对路径解析问题。 - 若需要自动读取同目录下的文件,可通过UEFI的
gEfiLoadedImageProtocol获取当前EFI程序的加载路径,去掉末尾的二进制文件名后和new.txt拼接,得到完整的文件绝对路径再传给fopen。 - 可在fopen失败时打印错误信息排查问题:添加
#include <errno.h>后,在else分支添加printf("open failed, errno: %d, reason: %s\n", errno, strerror(errno));即可得到具体失败原因。
内容的提问来源于stack exchange,提问作者Faris Kamal Kakkengal
相关产品推荐
相关产品推荐

