今天调程序时遇到一个bug 感觉有点意思 也许有人会遇到类似的问题吧
说手上有一段代码 原本是希望在一个文件夹中读取出其中所有音频文件的
tdir=dir(fullfile(SoundDir,SoundFileName));
NumSounds=length(tdir);
[NameSounds{1:NumSounds}]=deal(tdir.name);
%%%%%此处省略X行%%%%%
[Signal.yy, Signal.Fs] = audioread(fullfile(SoundDir,NameSounds{soundI}));
跑到这崩溃了 回头一看原因笑了:dir把当前目录’.’和上级目录’..’都读出来了(当然,也有当前目录里的其他目录) 这些目录audioread肯定处理不了
好吧 那就在dir得到tdir之后把其中文件夹的字段都删除掉好了
但是dir返回的是一个N*1的struct 这是一个栗子
>>s =dir('.')
%以下是数据的脚本
s = struct;
s(1, 1).name = '.';
s(1, 1).date = '30-1月-2016 16:15:05';
s(1, 1).bytes = 0;
s(1, 1).isdir = true;
s(1, 1).datenum = 736359.67714120366;
s(2, 1).name = '..';
s(2, 1).date = '30-1月-2016 10:14:28';
s(2, 1).bytes = 0;
s(2, 1).isdir = true;
s(2, 1).datenum = 736359.42671296292;
s(3, 1).name = 'KeyboardMouse.ini';
s(3, 1).date = '28-6月-2013 08:07:00';
s(3, 1).bytes = 367;
s(3, 1).isdir = false;
s(3, 1).datenum = 735413.33819444443;
好在dir很贴心的设计了isdir这个域 我只要留下isdir的值为0的部分就行
但问题在于 怎么删除掉这n个目录或者只保留下N个文件
恶心的一点在于 struct的rmfield函数会直接删掉整个字段
好吧 那就把文件的数据提取出来合成成一个新的struct
function outst = deletedir(inst)
outst = struct('name',{},'date',{},'bytes',{},'isdir',{},'datenum',{});
for k = 1:length(inst)
if ((~inst(k).isdir) & (~strcmp(inst(k).name,'..')))
outst = [outst;inst(k)];
end
end
return
不知道为什么 有几个目录中’..’的isdir居然是0 可能是因为它的上级是磁盘驱动器吧 所以加了~strcmp(inst(k).name,’..’)这个条件
回过头来考虑了一下 在当初使用dir时就该直接使用
dir(dir(fullfile(SoundDir,*.wav)))
这种形式 顺便还能过滤掉之后不能audioread读取的文件类型