1

我的结构如下所示:

数据库结构

我有一个database文件夹,其中包含brands. 每个brandlogo和组成query。我想遍历所有文件(file_1to file_ndatabase并对它们执行一些操作。

我写了这段代码:

d = dir(database);
isub = [d(:).isdir];
brandsFolders = {d(isub).name}';
brandsFolders(ismember(brandsFolders,{'.','..'})) = [];
[numberOfBrands not_used]=size(brandsFolders); %holds the number of the brands
for i=1:numberOfBrands
    temp=strcat(database,  '\');
    currentBrand=strcat(temp, brandsFolders(i));
    d = dir(currentBrand{1,1});
    isub = [d(:).isdir];
    logoAndQuery = {d(isub).name}';
    logoAndQuery(ismember(logoAndQuery,{'.','..'})) = [];
    logo=strcat(currentBrand, '\', logoAndQuery(1));
    files=dir(logo{1,1});
    [numberOfFiles not_used]=size(files);
    for j=1:numberOfFiles
        if strcmp(files(j).name, '..')~=1 && strcmp(files(j).name, '.')~=1
            %operations on each files(j).name
        end
    end
end

该代码工作正常,它遍历所需的文件。但是,代码有点丑陋和令人困惑。

我想知道我是否可以用另一种更好的方式来做到这一点?

4

1 回答 1

1

遍历一组目录的过程与您所做的差不多。但是,imo,您可以更轻松地做一些事情/我会做不同的事情:

brandsFolders = dir(database);
brandsFolders( ~[brandsFolders.isdir] | strcmp({brandsFolders.name},'.') | strcmp({brandsFolders.name},'..')) = [];

for ii=1:numel(brandsFolders)
    logoAndQuery  = dir(fullfile(database,brandsFolders(ii).name));
    logoAndQuery( ~[logoAndQuery.isdir] | strcmp({logoAndQuery.name},'.') | strcmp({logoAndQuery.name},'..')) = [];

    logo = fullfile(databasecurrentBrand,brandsFolders(ii).name), logoAndQuery(1).name);
    files = dir(logo);
    files(strcmp({files.name},'.') | strcmp({files.name},'..'))=[];

    for jj=1:numel(files)
        %operations on each files(j).name
    end
end

(这当然只有在您确定它logoAndQuery(1)始终是“logo”目录时才有效。)
或者使用子函数进行目录查询:

function dirs = getDirs(strPath)
    dirs = dir(strPath);
    dirnames = {dirs.name};
    dirs ( ~[dirs.isdir] | strcmp(dirnames ,'.') | strcmp(dirnames ,'..')) = [];
end

它已经为您提供了一些较短的代码并提供了以下内容,其中我还假设“logo”目录中没有目录:

brandsFolders = getDirs(database);

for ii=1:numel(brandsFolders)
    logoAndQuery  = getDirs(fullfile(database,brandsFolders(ii).name));
    logo = fullfile(databasecurrentBrand,brandsFolders(ii).name), logoAndQuery(1).name);
    files = dir(logo);
    files([files.isdir])=[];

    for jj=1:numel(files)
        %operations on each files(j).name
    end
end
于 2012-11-25T02:16:12.053 回答