Как получить имя родительской папки файла указан полный путь?

в MATLAB, у меня есть строка, содержащая путь к файлу:

path = 'C:/Data/Matlab/Dir/file.m'

Я хочу теперь хочу извлечь 'Dir часть строки. Один из способов сделать это:

[first, second, third, fourth, fifth] = strtok(path, '/')

а затем возьмите fourth элемент и, наконец, удалите из него первый символ (/).

мне просто интересно, есть ли более элегантное решение? Кажется немного громоздким, чтобы явно хранить все first ... fifth элементы, а затем вручную удалить /.

спасибо.

8 ответов


попробуй:

parts = strsplit(path, '/');
DirPart = parts{end-1};

попробовать

s = regexp(path, '/', 'split')
s(4)

Как рассказали здесь в "Split String at Delimiter с использованием ключевого слова split".


вы можете попробовать функцию fileparts следующим образом:

[ParentFolderPath] = fileparts('C:/Data/Matlab/Dir/file.m');
[~, ParentFolderName] = fileparts(ParentFolderPath) ;
ParentFolderName = 'Dir'

найдите родительский каталог с одной строкой кода, если вы не знаете, сколько папок наслаивается

fliplr(strtok(fliplr (pname),'\'))


если вы не хотите, чтобы заботиться о количестве элементов вашего пути, и вы не хотите использовать strsplit, который недоступен в более старых версиях Matlab, вы также можете использовать этот лайнер:

directory = getfield( fliplr(regexp(fileparts(path),'/','split')), {1} )

%% or:
% alldir = regexp(fileparts(path),'/','split')
% directory = alldir(end)

который всегда будет возвращать родительскую папку указанного файла.

вы также должны рассмотреть возможность использования filesep вместо '/' чтобы получить лучшую совместимость с различными системами.


есть еще старый добрый способ...

n=size(path,2);

while path(n)~='/'; n=n-1; end

i=n-2;

while path(i)~='/'; i=i-1; end

% result
path(i+1:n-1)

Max решение хорошо для windows, но может потерпеть неудачу на linux/mac из-за косой черты в начале абсолютных путей. Мое предложение было бы:

parts = strsplit(path, filesep);
DirPart = parts{end-1};
if path(1) == filesep
    DirPart = [filesep,DirPart];
end
if path(end) == filesep
    DirPart = [DirPart,filesep];
end

parts = strsplit(file_path, filesep);
parent_path = strjoin(parts(1:end-1), filesep);