1

以下に示す構造があります。

データベース構造

database含むフォルダーがありますbrands。それぞれとbrandで構成されlogoますquery。すべてのファイル ( file_1to file_n) をすべてトラバースしdatabase、それらに対していくつかの操作を実行したいと考えています。

私はこのコードを書きました:

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

ディレクトリのセットをトラバースすることは、あなたがやっているのとほとんど同じです。ただし、もっと簡単にできることがいくつかあります/私は別の方法で行います:

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)(もちろん、これは常に「ロゴ」ディレクトリであることが確実な場合にのみ機能します。)
または、代わりにディレクトリクエリにサブ関数を使用します。

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

これにより、すでにいくつかの短いコードが得られ、次のようになります。ここでは、「ロゴ」ディレクトリにディレクトリがないと仮定しています。

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 に答える