2023年7月6日发(作者:)
C#中获取⽂件属性在Explorer中,选择“详细”视图,可以看到很多⽂件属性,如图⽚的分辨率,MP3的艺术家、⽐特率,视频⽂件的分辨率等等等等;这些数据,有时候在C#中可能很难获取,⽐如图⽚的分辨率,需要⽤le得到Image类,然后才能得到分辨率数据,但是把图⽚加载到内存中,⼀是会加⼤内存开销,⼆是会更耗时。所以,今天我们就来说说怎么在C#中获取到⽂件的详细属性。添加引⽤在你的项⽬中添加对C:的引⽤,我们在前⾯⼀期《C#中使⽤SHFileOperation调⽤Windows的复制⽂件对话框》中也⽤到了这个动态链接库,不过当时是使⽤映射的⽅式,如今我们将其引⽤,直接使⽤。using Shell32;代码实现 ///
shell = new lass(); //获取⽂件所在⽗⽬录对象
Folder folder = ace(ectoryName(filePath)); //获取⽂件对应的FolderItem对象
FolderItem item = ame(eName(filePath)); //字典存放属性名和属性值的键值关系对
Dictionary
string key = ailsOf(null, i); if (OrEmpty(key)) { //当⽆属性可取时,退出循环
break; } //获取属性值
string value = ailsOf(item, i); //保存属性 (key, value); i++; } return Properties; }GetProperties这个⽅法返回所有属性值,在我的Win7 Pro 64bit 上,返回了287个属性!可以想象,信息是很丰富的,但是速度也是够慢的。可以看到,上⾯代码⽤了⼀个循环,获取属性名和属性值时都是通过i来索引的。那么,我们是不是就能不通过循环,⽽直接⽤下标来获取想要的属性呢?代码如下: ///
shell = new lass(); //获取⽂件所在⽗⽬录对象
Folder folder = ace(ectoryName(filePath)); //获取⽂件对应的FolderItem对象
FolderItem item = ame(eName(filePath)); string value = null;
//获取属性名称
string key = ailsOf(null, index); if (false == OrEmpty(key)) { //获取属性值
value = ailsOf(item, index); } return value; }GetPropertyByIndex在我的系统环境上,分辨率“尺⼨”下标是31,那么我只需要GetPropertyByIndex(@“D:”,31)就可以获取到分辨率信息了。但是特别需要注意,“尺⼨”属性的下标,在不同的Windows版本(XP,Vista,Win7,Win2003等)不⼀定是⼀样的。ok,我们还注意到每个属性都有对应的⼀个“属性名”,那么,我们能不能通过属性名来获取属性值呢,这样会⽐使⽤下标保险多了吧。代码如下: ///
shell = new lass(); //获取⽂件所在⽗⽬录对象
Folder folder = ace(ectoryName(filePath)); //获取⽂件对应的FolderItem对象
FolderItem item = ame(eName(filePath)); string value = null; int i = 0; while (true) { //获取属性名称
string key = ailsOf(null, i); if (OrEmpty(key)) { //当⽆属性可取时,退出循环
break; } if (true == (key, propertyName, tCultureIgnoreCase)) { //获取属性值
value = ailsOf(item, i); break; }
i++; } return value; }GetProperty这个⽅法是我⼀开始写的,通过在while⾥⾯加上属性名的判断,直到找到对应的属性名,则返回相应的属性值。不过这个⽅法还是不够简洁,“尺⼨”属性在31,意味着每⼀次都需要循环31次才能拿到我要的值,如果我要获取的属性名下标为287(参看上⾯),那么次数将更多,于是,我⼜对代码做了⼀些优化: ///
///
///
发布者:admin,转转请注明出处:http://www.yc00.com/web/1688598270a153669.html
评论列表(0条)