1. 从uigetfile开始:你的第一个文件选择器
如果你刚开始接触Matlab的图形界面编程,想给用户一个选择文件的功能,那uigetfile绝对是你绕不开的第一个朋友。别看它只是一个函数,用好了,能解决你80%的“让用户选个文件”的需求。我刚开始用的时候,觉得这玩意儿不就是弹个框嘛,后来在项目里踩过几次坑才发现,里面的门道还真不少。
uigetfile最基础的用法,就像原始文章里提到的,一行代码就能搞定:
[fileName, filePath] = uigetfile('*.m', '请选择一个MATLAB文件');
这行代码执行后,屏幕上会弹出一个标准的文件选择对话框,只显示后缀是.m的文件。用户选好文件,点“打开”,fileName里存的就是文件名(比如myScript.m),filePath里存的就是文件所在的完整路径(比如C:\Users\YourName\Documents\)。这里有个新手很容易忽略的细节:filePath这个路径字符串,末尾是带反斜杠(\)的。这意味着你后续用fullfile(filePath, fileName)拼接完整路径时,不用担心路径分隔符的问题,Matlab的fullfile函数会帮你处理得妥妥帖帖。
但事情不会总是一帆风顺。用户可能点“取消”啊!这就是第一个“坑”。如果你直接拿着fileName和filePath去用,用户点了取消,程序很可能就报错了。所以,标准的防御性编程姿势是这样的:
[fileName, filePath] = uigetfile('*.m', '请选择一个MATLAB文件');
if isequal(fileName, 0) || isequal(filePath, 0)
disp('用户取消了选择。');
% 这里可以设置一些默认行为,比如清空某个显示框,或者直接返回
return;
else
fullPath = fullfile(filePath, fileName);
disp(['用户选择了文件:', fullPath]);
% 接下来就可以用fullPath去读取文件、处理数据了
end
这个isequal(fileName, 0)的判断是关键。当用户取消时,uigetfile返回的文件名和路径都是标量0,而不是空字符串''。这个区别一定要记牢,用isempty来判断是会出错的。
除了选一个文件,很多时候我们需要让用户批量选择,比如一次导入几十个实验数据文件。这时候就需要请出'MultiSelect'参数了。把它设为'on',用户就可以用Ctrl+A或者按住Ctrl键点选多个文件。
[fileNames, filePath] = uigetfile('*.txt', '请选择多个数据文件', 'MultiSelect', 'on');
这里的变化是,当选择多个文件时,fileNames不再是一个字符串,而是一个字符串元胞数组。所以,处理它的方式也要变:
if isequal(fileNames, 0)
disp('用户取消了选择。');
else
if ischar(fileNames) % 如果只选了一个文件,返回的仍是字符数组
fileNames = {fileNames}; % 转换成元胞数组,方便统一处理
end
for i = 1:length(fileNames)
fullPath = fullfile(filePath, fileNames{i});
disp(['准备处理文件:', fullPath]);
% 循环处理每一个文件
end
end
我强烈建议你像上面这样,无论是否允许多选,都把返回的文件名统一转换成元胞数组来处理。这样你的后续代码逻辑会非常清晰和一致,不用写一堆if分支来判断是单个文件还是多个文件。
2. 进阶配置:打造更贴心的文件选择对话框
掌握了基础用法,咱们可以玩点花的,让这个文件选择对话框更符合我们特定程序的需求。uigetfile的可定制化程度其实挺高的,很多参数用好了能极大提升用户体验。
首先说说文件类型过滤器。只过滤一种文件类型('*.m')当然可以,但实际应用中,我们可能需要支持多种格式。比如,一个图像处理程序,可能既


191

被折叠的 条评论
为什么被折叠?



