uiputfile с двухкомпонентными расширениями файлов - PullRequest
2 голосов
/ 18 октября 2019

Я хотел бы сохранить файлы из приложения как filename.app.mat. Таким образом, ясно, что они являются файлами Matlab, но я могу использовать {'*.app.mat', 'App MAT Files} в uigetfile для фильтрации файлов, которые понимаютсяприложение.

Теперь, если я использую

[f, p] = uiputfile({'*.app.mat', 'App MAT files'})

и введу имя файла без каких-либо расширений (скажем, test), f будет

>> f

f =

    'test.mat'

Matlab (проверенная версия была R2019a Update 6 на машине с Linux) только добавила .mat, а не (как я ожидал) .app.mat. Хотя f легко заменить на .app.mat, внутренняя проверка uiputfile на наличие файла и, если он истинный, вопрос о том, должен ли он быть перезаписан, не будет работать. Выборочная проверка приведет к изменению пользовательского интерфейса, поскольку диалоговое окно выбора файла уже будет закрыто.

Я ищу способ заставить uiputfile вернуть test.app.mat (в сценарии выше).

Обновление:

Из-за комментариев ниже, я проверил, существует ли проблема, если я тоже использую Windows. В файле uigetputfile_helper.m (в директории private рядом с uiputfile.m) видно, что для выбора файла используется matlab.ui.internal.dialog.FileSaveChooser(). Если я сделаю следующее на моей машине с Linux:

ufd = matlab.ui.internal.dialog.FileSaveChooser();
ufd.FileFilter = {'*.app.mat', 'App MAT files'};
ufd.show();

Если я сейчас введу test в качестве имени файла:

>> ufd.FileName

ans =

    'test'

в то время как на машине с Windows это будет

>> ufd.FileName

ans =

    'test.app.mat'

В случае с Linux, вложенная функция fixFileExtensions(filename) добавит расширение .mat.

1 Ответ

0 голосов
/ 18 октября 2019

Поскольку uiputfile не создает файл, вы можете написать простую оболочку, которая проверит расширение выбранного файла и исправит его, если он отличается от .app.mat.

Оболочка может выглядетьнапример, вот так:

function [f,p,indx] = saveAsAppFile()
    [f,p,indx] = uiputfile({'*.app.mat', 'App MAT files'});
    f = regexprep(f, '(\.app)?(\.mat)?$', '\.app\.mat');
end

Это довольно неприятный обходной путь для решения проблемы, но он выполнит свою работу и должен быть независимым от используемой операционной системы.


Если вам действительно нужен диалог вопросов о перезаписи уже существующего файла, и вы не можете ждать, пока Mathworks решит проблему за вас, вы можете просто расширить логику обертки. Например, вы можете сначала проверить, какую платформу использует ваш пользователь, и, если это Linux, вы можете вручную проверить, существует ли файл. Если нет - вы хорошо, если да - всплывающее диалоговое окно с вопросом, хочет ли он перезаписать файл. В противном случае просто отобразите uiputfile снова.

И да, конечно, это немного изменит рабочий процесс и сделает его менее аккуратным, но опять же - uiputfile не изменяет сам файлтак что с функциональной точки зрения не имеет значения, спросите ли вы пользователя, хочет ли он перезаписать файл, когда диалог выбора файла все еще виден или нет. Эффект будет точно таким же.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...