检查文件数组是否存在

Check for existence of array of files

我有一个包含文件名的元胞数组。我想检查主题文件夹中是否存在所有这些文件,如果不存在,我希望将继续发送到最顶层的 for 循环(请参阅模拟代码)。有没有一种方法可以在一个或两个衬里中执行此操作,而不是 1) 使用 for 循环和双 if 语句,或 2) 构建一个对 exist() 进行 for 循环的函数。

subjects = {'/data/subject01','/data/subject02','/data/subject03'};
files = {'a.txt','b.txt','c.txt'};
for ii = 1:numel(subjects)
    for jj = 1:numel(files)
        fileExists = exist([subject{ii} '/' file{jj}],'file')
        if ~fileExists
            continue
        end
    end
    if ~fileExists
        continue
    end
    % Some code to execute if all files exist.
end

用 cellfun 和字符串数组解决了这个问题。从技术上讲,仍然有一个 for 循环,但它解决了双重 if 语句。我会留下这个问题以获得更好的解决方案。

subjects = {'/data/subject01','/data/subject02','/data/subject03'};
files = string({'a.txt','b.txt','c.txt'});
for ii = 1:numel(subjects)
    paths = subject{ii} + files;
    checkExist = cellfun(@exist, cellstr(paths), repmat({'file'},size(paths))
    if ~all(checkExist(:))
        continue
    end
    % Some code to execute if all files exist.
end

您可以通过遍历两个数组的所有组合来移除循环:

subjects = {'/data/subject01','/data/subject02','/data/subject03'};
files = {'a.txt','b.txt','c.txt'};
a=numel(subjects);
b=numel(files);
k=a*b;
paths = arrayfun(@(ii)[subjects{mod(ii-1,a)+1} '/' files{ceil(ii/b)}],1:k,'uniformoutput',0);
checkExist = cellfun(@exist, paths, repmat({'file'},1,k));
if all(checkExist)
    % Some code to execute if all files exist
end

*fun 函数只是内部循环,通常比显式循环慢。他们还经常不必要地混淆代码的意图和行为。

您可以使用ismember with all and dir使方法更清晰并删除不必要的循环:

subjects = {'./data/subject01','./data/subject02'};
files = {'a.txt','b.txt','c.txt'};

for ii = 1:numel(subjects)
    filelist = dir(fullfile(subjects{ii}, '*.txt'));
    foundfilenames = {filelist(:).name};
    if all(ismember(files, foundfilenames))
        fprintf('All %u files are here: %s\n', numel(files), subjects{ii})
    else
        fprintf('All %u files are not here: %s\n', numel(files), subjects{ii})
    end
end

我的文件夹结构:

/data
  /subject01
    a.txt
    b.txt
  /subject02
    a.txt
    b.txt
    c.txt

我看到了以下内容,正如预期的那样:

All 3 files are not here: ./data/subject01
All 3 files are here: ./data/subject02