Существует обертка для uigetfile
, которая запоминает последнего директора при обмене файлами . Вы также можете получить оболочки для других файловых диалогов от того же автора.
EDIT
Как перегрузить встроенный uigetdir
и т. Д.
(1) Переименуйте uigetdir2
в uigetdir
и убедитесь, что он находится в пути, который имеет приоритет над путем для встроенной функции (это должно иметь место по умолчанию).
(2) Используйте BUILTIN , чтобы новая функция не вызывала сама себя.
(2) Поскольку uigetdir
реализован в виде .m-файла, а не компилируется (как sum
), команда builtin
для него не работает. Таким образом, откройте uigetdir
, найдите закрытую функцию uigetdir_helper
(которая является закрытой, поэтому мы не можем ее вызвать) и, наконец, раскройте метод java (который, как оказалось, изменился с R2011a на R2011b. Yay.). Это позволяет нам, наконец, перегрузить uigetdir
за счет необходимости самостоятельно анализировать ввод.
Вот строки с 37 по 67 из модифицированного 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