打开文件时,运行回调以更改为当前目录

时间:2011-10-26 16:54:52

标签: matlab

当我打开MATLAB时,它默认打开到/home/myUser。每当我以交互方式打开文件时(比如我运行Simulink并单击“打开...”),对话框将从/home/myUser开始。然后我可能会在点击/home/myUser/myDir1/myDir2/之前进入myModel.mdl

如果我再次使用“打开...”对话框打开另一个Simulink文件,它会让我回到/home/myUser。请注意,这与文件无关,我只是以Simulink为例。我想将它保存在/home/myUser/myDir1/myDir2中,这意味着我应该与刚刚打开(或保存)的最后一个文件位于同一目录中。

以编程方式,在使用cd选择文件后,我会将uigetfile的回调设置到我选择的文件所在的目录中。这可以用MATLAB自己的“打开”或“另存为”命令吗?

1 个答案:

答案 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

中的第37到67行
%% 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