Я должен получить все те файлы под D:\dic
и цикл по ним для дальнейшей обработки индивидуально.
MATLAB поддерживает этот вид операций?
Это может быть сделано в других сценариях как PHP, Python...
Обновление: Учитывая, что этот пост довольно старый, и за это время я много изменил эту утилиту для собственного использования, я подумал, что должен опубликовать новую версию. Мой последний код можно найти на The MathWorks File Exchange : dirPlus.m
. Вы также можете получить исходный код на GitHub .
Я внес ряд улучшений. Теперь он дает вам возможность добавить полный путь или вернуть только имя файла (включено из Doresoom и Oz Radiano ) и применить шаблон регулярного выражения к именам файлов (включенный из Питер Д. ). Кроме того, я добавил возможность применять функцию проверки к каждому файлу, что позволяет вам выбирать их на основе критериев, отличных от их имен (например, размер файла, содержимое, дата создания и т. Д.).
ПРИМЕЧАНИЕ: В более новых версиях MATLAB (R2016b и позже) функция dir
имеет возможности рекурсивного поиска! Таким образом, вы можете сделать это, чтобы получить список всех файлов *. M
во всех подпапках текущей папки:
dirData = dir('**/*.m');
Вот функция, рекурсивно просматривающая все подкаталоги данного каталога, собирая список всех имен файлов, которые он находит:
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
После сохранения вышеуказанной функции где-нибудь на вашем пути MATLAB, вы можете вызвать ее следующим образом:
fileList = getAllFiles('D:\dic');
Я не знаю однофункционального метода для этого, но вы можете использовать genpath
, чтобы повторно просмотреть список только подкаталоги . Этот список возвращается в виде строки каталогов, разделенных точкой с запятой, поэтому вам придется разделить его с помощью strread, т.е.
dirlist = strread (genpath ('/ path / of / directory'), '% s', ' delimiter ','; ')
Если вы не хотите включать данный каталог, удалите первую запись dirlist
, то есть dirlist (1) = [];
так как это всегда первая запись.
Затем получите список файлов в каждом каталоге с зацикленным каталогом
.
filenamelist=[];
for d=1:length(dirlist)
% keep only filenames
filelist=dir(dirlist{d});
filelist={filelist.name};
% remove '.' and '..' entries
filelist([strmatch('.',filelist,'exact');strmatch('..',filelist,'exact'))=[];
% or to ignore all hidden files, use filelist(strmatch('.',filelist))=[];
% prepend directory name to each filename entry, separated by filesep*
for f=1:length(filelist)
filelist{f}=[dirlist{d} filesep filelist{f}];
end
filenamelist=[filenamelist filelist];
end
filesep
возвращает разделитель каталогов для платформы, на которой работает MATLAB.
Это дает вам список имен файлов с полными путями в массиве ячеек список файлов . Я знаю, что это не самое удачное решение.
Вы можете использовать регулярное выражение или strcmp для удаления .
и ..
Или вы можете использовать поле isdir
, если вам нужны только файлы в каталоге, а не папки.
list=dir(pwd); %get info of files/folders in current directory
isfile=~[list.isdir]; %determine index of files vs folders
filenames={list(isfile).name}; %create cell array of file names
или объедините две последние строки:
filenames={list(~[list.isdir]).name};
Для списка папок в каталоге, за исключением. и ..
dirnames={list([list.isdir]).name};
dirnames=dirnames(~(strcmp('.',dirnames)|strcmp('..',dirnames)));
С этого момента вы должны иметь возможность вставлять код во вложенный цикл for и продолжать поиск в каждой подпапке, пока ваши dirnames не вернут пустую ячейку для каждого подкаталога.
Вы ищете каталог для возврата содержимого каталога.
Чтобы просмотреть результаты, вы можете просто сделать следующее:
dirlist = dir('.');
for i = 1:length(dirlist)
dirlist(i)
end
Это должно дать вам вывод в следующем формате, например:
name: 'my_file'
date: '01-Jan-2010 12:00:00'
bytes: 56
isdir: 0
datenum: []