You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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),而非获取当前工作目录。正确的实现步骤如下:

  1. 获取命令行传入的文件名
    Matlab编译的EXE可以通过内置的argv变量获取命令行参数:
args = argv;
if length(args) < 1
    error('请传入目标文件名');
end
target_file = args{1};
  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);
  1. 编译注意事项
    编译时确保勾选“添加命令行参数支持”,且不要用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 21:30:04