该函数dir返回一个数组
.
..
Folder1
Folder2
Run Code Online (Sandbox Code Playgroud)
每次我必须摆脱前两个项目,方法如下:
for i=1:numel(folders)
foldername = folders(i).name;
if foldername(1) == '.' % do nothing
continue;
end
do_something(foldername)
end
Run Code Online (Sandbox Code Playgroud)
并且使用嵌套循环可能会导致大量重复的代码.
那么我可以通过更简单的方式避免这些"文件夹"吗?
谢谢你的帮助!
最近我更简单地处理这个问题,像这样:
for i=3:numel(folders)
do_something(folders(i).name)
end
Run Code Online (Sandbox Code Playgroud)
简单地忽略前两项.
但请注意@Jubobs的回答.请注意以ASCII值小于令人讨厌的字符开头的文件夹名称..然后第二种方法将失败.此外,如果它以a开头.,那么第一种方法将失败:)
所以要么确保你有一个很好的文件夹名称,并使用我的一个简单的解决方案,或使用@Jubobs的解决方案来确保.
Tri*_*een 40
无环路解决方案:
d=dir;
d=d(~ismember({d.name},{'.','..'}));
Run Code Online (Sandbox Code Playgroud)
jub*_*0bs 15
滚动到我的答案的底部,找到一个列出除.和之外的目录内容的函数...
的.和..条目分别对应于当前文件夹和父文件夹.在*nix shell中,您可以使用命令ls -lA来列出除.和之外的所有内容...遗憾的是,MATLAB dir不提供此功能.
但是,一切都不会丢失.函数返回的输出结构数组的元素dir实际上是根据name字段按字典顺序排序的.这意味着,如果当前MATLAB文件夹中包含的文件/文件夹,通过ASCII代码点比句号较小的任何字符开始(46,十进制),然后.与..预订购不对应于结构体数组的前两个元素.
下面是一个说明性示例:如果您当前的MATLAB文件夹具有以下结构(!hello并且'world是文件或文件夹),
.
??? !hello
??? 'world
Run Code Online (Sandbox Code Playgroud)
然后你明白了
>> f = dir;
>> for k = 1 : length(f), disp(f(k).name), end
!hello
'world
.
..
Run Code Online (Sandbox Code Playgroud)
这是为什么.而..不是前两个条目?因为感叹号和单引号都有较小的代码点(33和39,十进制,分别),而不是句号(46,十进制).
我将您引用到此ASCII表,以获得ASCII码点小于句号的可见字符的详尽列表; 请注意,并非所有这些都必须是合法的文件名字符.
dir没有列出.和的自定义函数..在调用之后dir,您可以在操作之前始终从struct数组中删除两个有问题的条目.此外,为了方便起见,如果你想节省一些心理开销,你总是可以编写一个自定义dir函数来做你想要的:
function listing = dir2(varargin)
if nargin == 0
name = '.';
elseif nargin == 1
name = varargin{1};
else
error('Too many input arguments.')
end
listing = dir(name);
inds = [];
n = 0;
k = 1;
while n < 2 && k <= length(listing)
if any(strcmp(listing(k).name, {'.', '..'}))
inds(end + 1) = k;
n = n + 1;
end
k = k + 1;
end
listing(inds) = [];
Run Code Online (Sandbox Code Playgroud)
假设与以前相同的目录结构,您将获得以下内容:
>> f = dir2;
>> for k = 1 : length(f), disp(f(k).name), end
!hello
'world
Run Code Online (Sandbox Code Playgroud)