如何让C/Matlab编译的EXE仅通过文件名获取文件路径并读取?
问题分析与解决方案
一、EXE能否仅通过文件名获取文件路径并读取?
完全可以,核心逻辑是获取程序运行时的当前工作目录(CWD)。当你通过bat文件执行EXE时,默认情况下当前工作目录就是bat文件所在的目录(除非bat中通过cd命令主动修改过)。原EXE的实现逻辑应该是:将传入的相对文件名(如data.txt)与当前工作目录拼接成完整路径,进而读取文件。
你提到“EXE仅在bat与自身同目录时才工作”,这大概率不是因为它获取了bat的路径,而是原EXE的逻辑存在局限——比如错误地将自身所在目录作为文件查找路径,而非当前工作目录。当然也存在另一种可能:如果是C编译的EXE,它可能通过Windows API解析了父进程(执行bat的cmd.exe)的命令行参数,从而提取出bat文件的路径,但这种实现复杂度更高,并非常规做法。
二、Matlab编译EXE的实现方法
你之前尝试失败,大概率是误用了获取EXE自身路径的方法(比如mfilename),而非获取当前工作目录。正确的实现步骤如下:
- 获取命令行传入的文件名
Matlab编译的EXE可以通过内置的argv变量获取命令行参数:
args = argv; if length(args) < 1 error('请传入目标文件名'); end target_file = args{1};
- 读取目标文件
方法一:直接利用Matlab的默认查找规则(优先在当前工作目录查找)
fid = fopen(target_file, 'r'); if fid == -1 error(['无法打开文件: ', target_file]); end % 执行文件读取操作,例如: file_content = fread(fid, '*char'); fclose(fid);
方法二:显式拼接当前工作目录与文件名
current_dir = pwd; % 获取当前工作目录(即bat所在的E:\data) full_file_path = fullfile(current_dir, target_file); fid = fopen(full_file_path, 'r'); if fid == -1 error(['无法打开文件: ', full_file_path]); end % 读取文件逻辑... fclose(fid);
- 编译注意事项
编译时确保勾选“添加命令行参数支持”,且不要用mfilename('fullpath')——这个函数返回的是Matlab脚本/EXE自身的路径,而非bat文件的路径,这是很多人踩坑的点。
三、关于“EXE仅与bat同目录时才工作”的验证
如果想确认原EXE的逻辑,可以做个测试:
- 在E:\data下的bat中加入一行
cd E:\test,然后再调用C:\tool\mfunction.exe data.txt(此时data.txt放在E:\test下) - 如果EXE能正常读取,说明它依赖的是当前工作目录;如果不能,说明它可能在查找自身所在目录或bat所在目录的文件。
内容的提问来源于stack exchange,提问作者Jack
相关产品推荐
相关产品推荐

