从文件MATLAB重建目录

时间:2014-08-05 20:53:00

标签: matlab

感谢您的帮助。

问题是:

我需要用户根据扩展名选择一个文件,比如说.tif。我使用标准方法,即

[flnm,locn]=uigetfile({'*.tif','Image files'}, 'Select an image');
ext = '.tif';

但是我需要从其他子目录中获取其他图像文件。假设返回locn的目录名是:/user/blade/checklist/exp1/trial_1/run_1/exp001.tif。图片转到exp100.tif

我想访问:

/user/blade/checklist/exp1/trial_1/run_2/exp001.tif.

同时访问:

/user/blade/checklist/exp1/trial_2/run_2/exp001.tif.

最多 trial_n

但如果我列出/user/blade/checklist/exp1/中的目录,我会从中获取所有文件夹,从而可以重建正确的路径。命名结构是有序的。

我目前的解决方案是

[flnm,locn]=uigetfile({'*.tif','Image files'}, 'Select an image');
ext = '.tif';
parts = strsplit(locn, '/');
f = fullfile(((parts{end-5}),(parts{end-4}),(parts{end-3}),(parts{end-2}),(parts{end-1}));

哪个真的很丑,我也失去了第一个/。任何帮助表示赞赏。

谢谢!

1 个答案:

答案 0 :(得分:0)

首先,像你一样获取文件位置;注意我为使用变量ext做了一些小改动。

ext = '.txt';
[flnm,locn]=uigetfile({['*',ext]}, 'Select an image');
parts = strsplit(locn,'/');
root = parts(1:end-4);

parts有2个信息 - 1)所选文件的路径; 2)您需要的工作文件夹checklist的路径。所以root有工作文件夹。

然后,列出您想要的所有文件,并将它们放在单元格数组中。

文件名应包含部分(子文件夹)路径;按照这种模式并不难。

flist = {'trial_1/run_1/exp001.tif', ...
    'trial_1/run_1/exp002.tif', ...
    'trial_1/run_2/exp001.tif', ...
    'trial_2/run_1/exp001.tif', ...
    'trial_2/run_2/exp001.tif'};

我只列举了一些;您可以使用for循环自动生成trial_nexpxxx.tif。生成完整文件列表的示例代码(但不是"完整路径") -

flist = cell(10*2*100,1);

for ii = 1:10
    for jj = 1:2
        for kk = 1:100
            flist{sub2ind([10,2,100],ii,jj,kk)} = ...
                sprintf('trial_%d/run_%d/exp%03d%s', ii,...
                jj, kk, ext);
        end
    end
end

最后,使用strjoin连接第一部分(您的工作文件夹)和第二部分(子文件夹中的所需文件)。使用cellfun为文件列表单元格数组中的每个单元格调用strjoin,因此对于您希望的每个文件,您都可以获得完整路径。

full_flist = cellfun(@(x) strjoin([root, x],'/'), ...
    flist, 'UniformOutput', false);

示例输出 -

>> locn
locn =
/home/user/Downloads/exp1/trial_1/run_1/
>> for ii = 1:5
full_flist{ii}
end
ans =
/home/user/Downloads/trial_1/run_1/exp001.tif
ans =
/home/user/Downloads/trial_1/run_1/exp002.tif
ans =
/home/user/Downloads/trial_1/run_2/exp001.tif
ans =
/home/user/Downloads/trial_2/run_1/exp001.tif
ans =
/home/user/Downloads/trial_2/run_2/exp001.tif
>> 

注意:您可以使用

strjoin(str1, str2, '/')

sprintf('%s/%s', str1, str2)

它们是等价的。