C#中获取文件属性

在Explorer中,选择“详细”视图,可以看到很多文件属性,如图片的分辨率,MP3的艺术家、比特率,视频文件的分辨率等等等等;这些数据,有时候在C#中可能很难获取,比如图片的分辨率,需要用Image.FromFile得到Image类,然后才能得到分辨率数据,但是把图片加载到内存中,一是会加大内存开销,二是会更耗时。所以,今天我们就来说说怎么在C#中获取到文件的详细属性。

添加引用

在你的项目中添加对C:\Windows\System32\shell32.dll的引用,我们在前面一期《C#中使用SHFileOperation调用Windows的复制文件对话框》中也用到了这个动态链接库,不过当时是使用映射的方式,如今我们将其引用,直接使用。

using Shell32;

代码实现

        /// <summary>

        /// 获取文件属性字典

        /// </summary>

        /// <param name="filePath">文件路径</param>

        /// <returns>属性字典</returns>

        public static Dictionary<string, string> GetProperties(string filePath)

        {

            if (!File.Exists(filePath))

            {

                throw new FileNotFoundException("指定的文件不存在。", filePath);

            }

            //初始化Shell接口 

            Shell32.Shell shell = new Shell32.ShellClass();

            //获取文件所在父目录对象 

            Folder folder = shell.NameSpace(Path.GetDirectoryName(filePath));

            //获取文件对应的FolderItem对象 

            FolderItem item = folder.ParseName(Path.GetFileName(filePath));

            //字典存放属性名和属性值的键值关系对 

            Dictionary<string, string> Properties = new Dictionary<string, string>();

            int i = 0;

            while (true)

            {

                //获取属性名称 

                string key = folder.GetDetailsOf(null, i);

                if (string.IsNullOrEmpty(key))

                {

                    //当无属性可取时,退出循环 

                    break;

                }

                //获取属性值 

                string value = folder.GetDetailsOf(item, i);

                //保存属性 

                Properties.Add(key, value);

                i++;

            }

            return Properties;

        }
GetProperties

这个方法返回所有属性值,在我的Win7 Pro 64bit 上,返回了287个属性!可以想象,信息是很丰富的,但是速度也是够慢的。

可以看到,上面代码用了一个循环,获取属性名和属性值时都是通过i来索引的。那么,我们是不是就能不通过循环,而直接用下标来获取想要的属性呢?代码如下:

        /// <summary>

        /// 获取指定文件指定下标的属性值

        /// </summary>

        /// <param name="filePath">文件路径</param>

        /// <param name="index">属性下标</param>

        /// <returns>属性值</returns>

        public static string GetPropertyByIndex(string filePath, int index)

        {

            if (!File.Exists(filePath))

            {

                throw new FileNotFoundException("指定的文件不存在。", filePath);

            }

            //初始化Shell接口 

            Shell32.Shell shell = new Shell32.ShellClass();

            //获取文件所在父目录对象 

            Folder folder = shell.NameSpace(Path.GetDirectoryName(filePath));

            //获取文件对应的FolderItem对象 

            FolderItem item = folder.ParseName(Path.GetFileName(filePath));

            string value = null;

 

            //获取属性名称 

            string key = folder.GetDetailsOf(null, index);

            if (false == string.IsNullOrEmpty(key))

            {

                //获取属性值 

                value = folder.GetDetailsOf(item, index);

            }

            return value;

        }
GetPropertyByIndex

在我的系统环境上,分辨率“尺寸”下标是31,那么我只需要GetPropertyByIndex(@“D:\test.jpg”,31)就可以获取到分辨率信息了。但是特别需要注意,“尺寸”属性的下标,在不同的Windows版本(XP,Vista,Win7,Win2003等)不一定是一样的。

ok,我们还注意到每个属性都有对应的一个“属性名”,那么,我们能不能通过属性名来获取属性值呢,这样会比使用下标保险多了吧。代码如下:

        /// <summary>

        /// 获取指定文件指定属性名的值

        /// </summary>

        /// <param name="filePath">文件路径</param>

        /// <param name="propertyName">属性名</param>

        /// <returns>属性值</returns>

        public static string GetProperty(string filePath, string propertyName)

        {

            if (!File.Exists(filePath))

            {

                throw new FileNotFoundException("指定的文件不存在。", filePath);

            }

            //初始化Shell接口 

            Shell32.Shell shell = new Shell32.ShellClass();

            //获取文件所在父目录对象 

            Folder folder = shell.NameSpace(Path.GetDirectoryName(filePath));

            //获取文件对应的FolderItem对象 

            FolderItem item = folder.ParseName(Path.GetFileName(filePath));

            string value = null;

            int i = 0;

            while (true)

            {

                //获取属性名称 

                string key = folder.GetDetailsOf(null, i);

                if (string.IsNullOrEmpty(key))

                {

                    //当无属性可取时,退出循环 

                    break;

                }

                if (true == string.Equals(key, propertyName, StringComparison.CurrentCultureIgnoreCase))

                {

                    //获取属性值 

                    value = folder.GetDetailsOf(item, i);

                    break;

                }

 

                i++;

            }

            return value;

        }
GetProperty

这个方法是我一开始写的,通过在while里面加上属性名的判断,直到找到对应的属性名,则返回相应的属性值。

不过这个方法还是不够简洁,“尺寸”属性在31,意味着每一次都需要循环31次才能拿到我要的值,如果我要获取的属性名下标为287(参看上面),那么次数将更多,于是,我又对代码做了一些优化:

        /// <summary>

        /// 存储属性名与其下标(key值均为小写)

        /// </summary>

        private static Dictionary<string, int> _propertyIndex = null;

 

        /// <summary>

        /// 获取指定文件指定属性名的值

        /// </summary>

        /// <param name="filePath">文件路径</param>

        /// <param name="propertyName">属性名</param>

        /// <returns>属性值</returns>

        public static string GetPropertyEx(string filePath, string propertyName)

        {

            if (_propertyIndex == null)

            {

                InitPropertyIndex();

            }

            //转换为小写

            string propertyNameLow = propertyName.ToLower();

            if (_propertyIndex.ContainsKey(propertyNameLow))

            {

                int index = _propertyIndex[propertyNameLow];

                return GetPropertyByIndex(filePath, index);

            }

            return null;

        }

 

        /// <summary>

        /// 初始化属性名的下标

        /// </summary>

        private static void InitPropertyIndex()

        {

            Dictionary<string, int> propertyIndex = new Dictionary<string, int>();

            //获取本代码所在的文件作为临时文件,用于获取属性列表

            string tempFile = System.Reflection.Assembly.GetExecutingAssembly().FullName;

            Dictionary<string, string> allProperty = GetProperties(tempFile);

            if (allProperty != null)

            {

                int index = 0;

                foreach (var item in allProperty.Keys)

                {

                    //属性名统一转换为小写,用于忽略大小写

                    _propertyIndex.Add(item.ToLower(), index);

                    index++;

                }

            }

            _propertyIndex = propertyIndex;

        }
GetPropertyEx

_propertyIndex用于存储属性名与其下标,用Dictionary是因为_propertyIndex[key]的时间复杂度是O(1)。然后在GetPropertyEx方法中找到属性名对应的下标,直接返回该下标的属性值。InitPropertyIndex方法只会被调用一次。

好了,我们现在通过属性名来获取属性值,在不同系统之间应该不会有问题了吧?

不一定,原因你肯定也想到了,如果是在一个英文windows上,它的属性名里面不会有“尺寸”,对应的应该是“Resolution”之类的(我没有英文版系统,所以只是猜测),也不会有“名称”属性,而是“Name”;

总结一下,

方法名

适用

不适用

GetPropertyByIndex

不同语言的系统

不同版本的系统

GetPropertyEx

不同版本的系统

不同语言的系统

所以,根据你的程序可能的运行环境,选择适合你的方法;

再思考:要能在不同语言不同版本的系统将通用,该怎么办?

我目前想到的:建立同一个属性名在不同语言间的对应关系,如”尺寸”对应” Resolution”,然后,在代码里获取到系统语言,将属性名“翻译”成该语言,即可通过翻译后的属性名找到对应的属性值了。欢迎有实现了本方法或者更好方法的同学一起来讨论。

转载于:https://www.cnblogs.com/jifengg/archive/2013/05/14/3077625.html

C#实现获取指定文件的文件属性(附完整源码) 阅读详情

相关推荐

C#实现修改文件属性(附完整源码)

C#实现修改文件属性(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 400

C#获取文件信息的方法汇总

无论是使用FileInfo类、File类、Directory类还是Path类,C#提供了多种获取文件信息的方法,可以根据具体需求选择合适的方法来获取文件的属性、大小、时间等信息。更多信息大家可以参考官网。希望本文对你在C#文件处理中有所帮助,欢迎留言或者吐槽。

t15032286291的博客 2473

c#获取文件属性

c#获取文件属性,真实实例,绝对可用,自用。

c#实现对MP4等文件属性信息的读取以及对txt文件内容的读取

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using 

panruola的博客 4599

使用ffmpeg.exe获取文件属性信息,视频音频时长

使用ffmpeg.exe获取文件属性信息,ffmpeg是java开发的用于多媒体文件编辑的命令行工具,有多个版本,功能比较强大,C#中可以在进程外异步调用这个工具 using (System.Diagnostics.Process pro = new System.Diagnostics.Process()) { pro.StartInfo.UseShellExecute = false; pro.StartInfo.ErrorDialog = false; pro.StartInfo.RedirectStandardError = true; pro.StartInfo.FileName = AppDomain.CurrentDomain.BaseDirectory + "ffmpeg.exe"; pro.StartInfo.Arguments = " -i " + fileName; pro.Start(); System.IO.StreamReader errorreader = pro.StandardError; pro.WaitForExit(1000); string result = errorreader.ReadToEnd(); if (!string.IsNullOrEmpty(result)) { result = result.Substring(result.IndexOf("Duration: ") + ("Duration: ").Length, ("00:00:00").Length); duration = result; } }

net获取媒体详细信息

net获取媒体详细信息

C# 获取文件信息大全

前言在.NET开发中,用C#获取文件信息是比较常见的操作。通过获取文件信息,我们可以了解文件的属性、大小、创建日期、修改日期等各种元数据信息。比如我们网站需要上传文件,可以用扩展名称控制上传的类型,获取文件的大小来限制上传文件等。本文将介绍一系列C#中获取文件信息的方法,帮助你轻松获取所需信息并进行文件处理。1、使用FileInfo类获取文件信息C#中提供了FileInfo类,它封装了文件的信息和...

weixin_68436326的博客 893

C#获得文件属性信息的实现方法

本文实例演示了用Visual C#获取任意文件的属性信息,这些属性信息包括文件名、创建时间、访问时间、最后写入时间等等。本实例需要用到 FileInfo 类。 FileInfo 类用于提供创建、复制、删除、移动和打开文件的实例方法,并且帮助创建 FileStream 对象。 主要功能代码如下: using System; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; using System.Data; using System.

C# 获取文件、文件夹和驱动器的信息详解与示例

本文介绍了如何在C#中获取有关文件、文件夹和驱动器的信息。通过使用System.IO命名空间中的FileInfo、DirectoryInfo和DriveInfo类,我们可以轻松地获取各种属性,如路径、大小、创建时间等。通过一个简单的示例程序,我们展示了如何将这些信息输出到控制台。最后,我们还讨论了异常处理的重要性,以确保程序的健壮性。在编写涉及文件系统操作的代码时,这些技巧和概念将非常有用。

qq_35320456的博客 1470

SwissADME:一款在线预测小分子药动学性质的工具

是一个免费的在线工具,由瑞士生物信息学研究所(SIB)开发,用于预测和分析小分子的药物相似性、理化性质、药代动力学特性以及合成可行性等。它是药物设计和开发中常用的工具之一,帮助研究人员快速评估化合物的成药潜力。

药研猿的博客 5019

Pspice开关电源仿真:从零实现反激式电源设计实战案例

通过Pspice仿真工具,手把手实现反激式开关电源的设计与优化,深入剖析关键参数设置与波形分析,帮助掌握Pspice在电源开发中的实际应用技巧。

weixin_35756690的博客 1155

C#获取文件属性信息

方法一: 项目中引用 Shell32.dll;(文件可以从C:\windows\system32\ 目录下拷贝) using Shell32; public static string GetFileDetailInfo(string strFilePath, int iIndex) { try {

幽谷晴天 的专栏 6161

告别手动点鼠标:用Python脚本批量跑ADS版图仿真,效率提升10倍(附完整代码)

本文详细介绍了如何利用Python脚本自动化ADS版图仿真流程,显著提升射频工程师的工作效率。通过调用ADS底层接口,实现参数化修改、批量任务调度和结果自动收集,解决了手动操作中的常见问题,如仿真不更新等。附完整代码,帮助开发者快速实现10倍效率提升。

weixin_42523543的博客 331

C#获取设置文件属性

zh569480383的专栏 1412

Dify插件离线部署全攻略:从下载到安装的完整流程

本文详细介绍了Dify插件离线部署的完整流程,针对企业内网等无网络环境需求。核心步骤包括在联网环境下载插件包、在特定Python 3.12.9环境下使用专用工具进行离线重打包,以及最终在离线Dify环境中安装验证。重点解决了离线安装的核心难题,并提供了环境配置、批量处理和故障排查等实用技巧,帮助用户实现Dify插件的顺利离线部署。

seed的博客 656

从软体机器人到鞋垫分析:Abaqus超弹性材料(Ogden模型)仿真配置全流程

本文详细介绍了Abaqus中Ogden模型在超弹性材料仿真中的应用全流程,涵盖从实验数据导入、参数拟合到模型构建与求解优化的关键步骤。特别针对鞋垫分析等生物力学场景,提供了单元选择、接触设置和并行计算等实用技巧,帮助工程师实现高精度仿真分析。

weixin_42525385的博客 399

c# 获取文件属性

c# 获取文件最后修改日期代码FileInfo f = new FileInfo(@"c:/1.txt");Console.WriteLine(f.LastWriteTime.ToString());c# 获取文件最后访问时间代码FileInfo f = new FileInfo(@"c:/1.txt");Console.WriteLine(f.LastAccessTime.ToString());//最后访问c# 获取文件创建时间代码FileInfo f = new FileInfo(@"c:/1.txt

woolnil的专栏 1929

从零到一:手把手教你用Python搭建医学影像识别CNN模型(附完整代码)

本文详细介绍了如何使用Python和TensorFlow/Keras从零开始构建一个医学影像识别的CNN模型,涵盖数据预处理、模型架构设计、训练调优及部署全流程。通过实战案例和完整代码,帮助开发者快速掌握深度学习在医学影像识别中的应用,特别适合医疗AI领域的初学者和研究者。

spark7igniter的博客 200

C#获取文件属性

http://support.microsoft.com/default.aspx?scid=KB;en-us;q224351         add   a   reference   to   dsofile.dll   to   your   project,   then   try   something   like         DSOleFile.PropertyReader  

谢雨枫 1635

CAMERALINK硬件封装说明

闲言少叙,直接上活,Cameralink硬件接口当前主要分为MDR26和SDR26两种,其中MDR对应封装较大价格比较便宜,SDR对应尺寸较小价格比较贵,这点我个人总是记错的图1 MDR26实物图图2 SDR26实物图。

6168

一文学会Inner-MPDIoU:YOLOv11边界框回归优化全解析

Inner-MPDIoU 凭借“辅助边框+最小点距离”的双重创新,成功解决了传统 IoU 损失在小目标、遮挡场景、位置偏差场景下的收敛和判别难题,为 YOLOv11 注入了更强的边框回归能力。从原理剖析到代码集成,本教程已为你铺就了一条“定位精度跃升”的实战路径。现在,不妨亲自上手尝试,让你的目标检测模型在各类数据集上都能交出一份“定位精准”的答卷——相信我,当你看到检测框完美贴合目标的那一刻,你会明白这份尝试的价值。我很乐意在你实践过程中帮你解决任何问题,让我们一起推动目标检测在边框回归领域的边界。

know_F0727的博客 141

C# 获取或设置文件属性

using System.ComponentModel; using System.IO; using System.Windows.Forms; namespace WinFormFile {     public partial class FormProperty

kingzhexian的专栏 1297

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

C#随手笔记——获取mp4文件属性(时长)

客户需求将一段视频重复播放3遍,本来是另一个同事的活,不过说急求找我帮忙,那我肯定也义不容辞呀~第一反应是在播放器中设置重复播放的次数,但想想这种方法不知道有没有,而且也不通用,万一换一款播放器岂不又要设置过,所以还是用上比较熟悉的C#来编写一个简单的程序来达成目的。 其实获取文件属性也是调用一个被封装好的API,这里我们要引用shell32.dll,位置在C:\Windows\System32...

轩阳俊的博客 7753

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

python读取文件属性详细信息_获取文件的属性信息 python读取视频文件

C#怎么获取文件详细信息属性?首先我们确定需要文件的哪些属性,如果你需要的某些属性不在当前窗口中,可右击“属性列”,选“其他……”在打开的“列设置”窗口中选择你需要的项,调整好顺序,提示:在WINDOWS2000中共有37个(个数与系统安装的软件数有关)文件属性供你选择。选取文件名,再按“Shift”键,鼠标分别点击左侧文件信息区域的开始位置与结束位置,被选区域呈反白显示(你必须多试几次才行):当...

weixin_29417071的博客 2416

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

C# shell32.dll 的用法

1 首先要使用shell32 请在项目引用中添加shell32.dll 的引用 (备注:该引用是系统dll文件 在C:\Windows\System32 目录下 可以自行拷贝到项目中)    private void btnTest_Click(object sender, EventArgs e) //测试的按钮点击事件 { //测试,将excel...

weixin_30772105的博客 1388
上一篇: C#中使用SHFileOperation调用Windows的复制文件对话框
下一篇: C#中如何优化列表遍历速度
abc2221
博客等级 码龄12年 1粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值