MATLAB — получить текущий путь, а затем использовать его для перехода в другую папку

#matlab #path

#matlab #путь

Вопрос:

У меня есть куча кодов, которые в настоящее время хранятся на моем локальном компьютере. Есть две папки, одна называется «Ресурсы», а другая называется «src». Существует один основной скрипт, который необходимо запустить под названием «main.m» в «src», который вызывает файлы из «Ресурсов».

Если я скопирую все это на новый компьютер, пути изменятся, и MATLAB, возможно, больше не сможет найти «Ресурсы». Я знаю, что относительно «main.m» мне нужно подняться на один уровень, а затем перейти в «Ресурсы».

Каков наилучший способ заставить MATLAB указывать на «Ресурсы»?

В настоящее время я пытаюсь выполнить следующие действия

 P = mfilename('fullpath') 
  

который дает путь для main.m. Теперь я хочу перейти отсюда, на одну папку вверх, а затем в «Ресурсы». Или, если есть лучший способ, пожалуйста, дайте мне знать.

В конце концов, я хочу расширить его для работы с несколькими папками «Resources1», «Resources2» и т. Д. Поэтому MATLAB должен иметь возможность перейти к нужной папке.

Ответ №1:

Вы можете получить его как:

 fullfile(fileparts(mfilename('fullpath')), '..', 'Resources');
  

Объяснение:

  • mfilename('fullpath') вернет полный путь и имя M-файла, в котором происходит вызов, без расширения
  • fileparts вернет путь к переданному файлу (только содержащий каталог)
  • fullfile создаст полную спецификацию каталога из переданных имен папок (примечание: '..' всегда означает родительский каталог)

На основе этого довольно просто написать функцию, которая получает дочерний каталог каталога, содержащего файл:

getSiblingOfParentDirectory.m

 function siblingDirPath = getSiblingOfParentDirectory(filepath, siblingDirName)
    siblingDirPath = fullfile(fileparts(filepath), '..', siblingDirName);
end
  

затем использовать его в M-файле:

 for i = 1:3
    disp(getSiblingOfParentDirectory(mfilename('fullpath'), ['Resources', num2str(i)]));
end
  

Пример вывода:

 D:pathtestResources1
D:pathtestResources2
D:pathtestResources3
  

Ответ №2:

Вы можете попробовать следующее:

 ResourcesFolder = strrep(mfilename('fullpath'), 'srcmain', 'Resources');
addpath(ResourcesFolder);
%%Your code here where you need those files
rmpath(ResourcesFolder);
  

Конечно, это полностью зависит от имен ваших папок и файлов. По сути, «addpath» позволяет получить доступ к файлам в указанном каталоге, добавив его в путь поиска, а «rmpath» делает прямо противоположное.

Кроме того, если вы буквально хотите перейти к папке, находящейся на один уровень выше, вы можете выполнить следующее:

 cd ..Resources
  

Который поднимается на один уровень вверх, выполняет поиск папки «Ресурсы», а затем изменяет текущий каталог на эту папку.