您的位置:首页 > 编程语言 > MATLAB

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

2016-01-30 20:15 501 查看
今天调程序时遇到一个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