当我打开MATLAB时,它默认打开到/home/myUser
。每当我以交互方式打开文件时(比如我运行Simulink并单击“打开...”),对话框将从/home/myUser
开始。然后我可能会在点击/home/myUser/myDir1/myDir2/
之前进入myModel.mdl
。
如果我再次使用“打开...”对话框打开另一个Simulink文件,它会让我回到/home/myUser
。请注意,这与文件无关,我只是以Simulink为例。我想将它保存在/home/myUser/myDir1/myDir2
中,这意味着我应该与刚刚打开(或保存)的最后一个文件位于同一目录中。
以编程方式,在使用cd
选择文件后,我会将uigetfile
的回调设置到我选择的文件所在的目录中。这可以用MATLAB自己的“打开”或“另存为”命令吗?
答案 0 :(得分:1)
uigetfile
有一个包装,可以记住最后一位导演on the file exchange。您也可以从同一作者获得wrappers for the other file dialogs。
修改强>
如何重载内置uigetdir
等
(1)将uigetdir2
重命名为uigetdir
,并确保它位于优先于内置函数路径的路径中(默认情况下应该是这种情况)。
(2)使用BUILTIN确保新功能不会自行调用。
(2)由于uigetdir
是作为.m文件实现的,而不是被编译(如sum
),builtin
命令对它不起作用。因此,打开uigetdir
,找到私有函数uigetdir_helper
(这是私有的,所以我们不能调用它),最后揭开java方法(结果是从R2011a变为R2011b)。好极了。)。这使我们最终能够以自己解析输入为代价来重载uigetdir
。
以下是修改后的uigetdir
%% Check passed arguments and load saved directory
% if start path is specified and not empty call uigetdir with arguments
% from user, if no arguments are passed or start path is empty load saved
% directory from mat file
% parse inputs
parserObj = inputParser;
parserObj.FunctionName = 'uigetdir';
parserObj.addOptional('startPath',[],@(x)exist(x,'dir'));
parserObj.addOptional('dialogTitle','Please choose directory',@ischar);
parserObj.parse(varargin{:});
inputList = parserObj.Results;
% create directory dialog instance - this has changed from 2011a to 2011b
if verLessThan('matlab','7.13')
dirdlg = UiDialog.UiDirDialog();
else
dirdlg = matlab.ui.internal.dialog.FolderChooser();
end
dirdlg.InitialPathName = inputList.startPath;
dirdlg.Title = inputList.dialogTitle;
if nargin > 0 && ~isempty(inputList.startPath)
% call dirdlg instead of uigetdir to avoid infinite recursion
dirdlg.show();
% if dirname empty, return 0 for uigetdir.
directory_name = dirdlg.SelectedFolder;
else
% set default dialog open directory to the present working directory
lastDir = pwd;
% load last data directory
if exist(lastDirMat, 'file') ~= 0
% lastDirMat mat file exists, load it
load('-mat', lastDirMat)
% check if lastDataDir variable exists and contains a valid path
if (exist('lastUsedDir', 'var') == 1) && ...
(exist(lastUsedDir, 'dir') == 7)
% set default dialog open directory
lastDir = lastUsedDir;
end
end
dirdlg.InitialPathName = lastDir;
% call dirdlg instead of uigetdir to avoid infinite recursion
dirdlg.show();
% if dirname empty, return 0 for uigetdir.
directory_name = dirdlg.SelectedFolder;
end