【问题标题】:Matlab: Get full path of sub-directories and filesMatlab:获取子目录和文件的完整路径
【发布时间】:2014-04-18 13:23:08
【问题描述】:

我在 '../../My_Dir' 有一个相对于 Matlab 工作目录的目录。这个目录本身有几个子目录。然后每个子目录中都有几个文件。

我想创建字符串的二维数组或矩阵。每行代表一个子目录。该行的第一列是子目录本身的完整路径,其他列是该子目录中文件的完整路径。 p>

谁能给我一些代码来帮助我实现这个?谢谢!

【问题讨论】:

  • this 问题的重复。

标签: matlab file-io


【解决方案1】:

例如,假设我在'My_Dir' 中有三个子文件夹,分别称为'A'(包含'a1.txt''a2.txt')、'B'(包含'b1.txt')和'C'(包含@987654333 @、'c2.txt''c3.txt')。这将说明如何处理每个子文件夹中文件数量不同的情况...

对于 MATLAB R2016b 及更高版本,dir 函数支持递归搜索,允许我们收集文件列表,如下所示:

dirData = dir('My_Dir\*\*.*');        % Get structure of folder contents
dirData = dirData(~[dirData.isdir]);  % Omit folders (keep only files)
fileList = fullfile({dirData.folder}.', {dirData.name}.');  % Get full file paths

fileList =

  6×1 cell array

    '...\My_Dir\A\a1.txt'
    '...\My_Dir\A\a2.txt'
    '...\My_Dir\B\b1.txt'
    '...\My_Dir\C\c1.txt'
    '...\My_Dir\C\c2.txt'
    '...\My_Dir\C\c3.txt'

作为替代方案,特别是对于早期版本,这可以使用我发布到 MathWorks 文件交换的实用程序来完成:dirPlus。可以这样使用:

dirData = dirPlus('My_Dir', 'Struct', true, 'Depth', 1);
fileList = fullfile({dirData.folder}.', {dirData.name}.');

现在我们可以按照您上面指定的方式格式化fileList。首先,我们可以使用unique 获取唯一子文件夹列表和索引。然后可以将该索引与mat2celldiff 一起使用,将fileList 按子文件夹分解为第二级元胞数组封装:

[dirList, index] = unique({dirData.folder}.');
outData = [dirList mat2cell(fileList, diff([index; numel(fileList)+1]))]

outData =

  3×2 cell array

    '...\My_Dir\A'    {2×1 cell}
    '...\My_Dir\B'    {1×1 cell}
    '...\My_Dir\C'    {3×1 cell}

【讨论】:

    【解决方案2】:

    获取文件夹完整路径:

    d = dir(baseDir);
    d(~[d.isdir])= []; %Remove all non directories.
    names = setdiff({d.name},{'.','..'});
    
    filesFullPath = names;
    
    for i=1:size(names,2)
        filesFullPath{i} = fullfile(baseDir,names{1,i});
    end
    
    Matlab... "thanks" for this s...
    

    【讨论】:

      【解决方案3】:

      你可以先得到所有的子文件夹

      d = dir(pathFolder);
      isub = [d(:).isdir];
      subFolders = {d(isub).name}';
      

      注意,您还需要从中删除 ...

      subFolders(ismember(subFolders,{'.','..'})) = [];
      

      然后使用(来自this post)获取每个文件中的文件:

      function fileList = getAllFiles(dirName)
      
          dirData = dir(dirName);      %# Get the data for the current directory
          dirIndex = [dirData.isdir];  %# Find the index for directories
          fileList = {dirData(~dirIndex).name}';  %'# Get a list of the files
          if ~isempty(fileList)
              fileList = cellfun(@(x) fullfile(dirName,x),...  %# Prepend path to files
                  fileList,'UniformOutput',false);
          end
          subDirs = {dirData(dirIndex).name};  %# Get a list of the subdirectories
          validIndex = ~ismember(subDirs,{'.','..'});  %# Find index of subdirectories
          %#   that are not '.' or '..'
          for iDir = find(validIndex)                  %# Loop over valid subdirectories
              nextDir = fullfile(dirName,subDirs{iDir});    %# Get the subdirectory path
              fileList = [fileList; getAllFiles(nextDir)];  %# Recursively call getAllFiles
          end
      end
      

      【讨论】:

      • 谢谢 - 这是一个帮助,但是当我遍历子文件夹并在每个元素上调用 dir() 时出现以下错误:Error using dir. Function is not defined for 'cell' inputs
      • @Karnivaurus 尝试改用dir(dirName{1,1}) 之类的东西。
      猜你喜欢
      • 1970-01-01
      • 2010-10-14
      • 1970-01-01
      • 2010-10-15
      • 2011-03-26
      • 2013-11-12
      • 2022-01-03
      • 1970-01-01
      相关资源
      最近更新 更多