Matlab中dir使用中遇到的一些问题

今天调程序时遇到一个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读取的文件类型

你可能感兴趣的:(matlab,matlab)