HOW TO:获取文件扩展属性

原创 2006年06月10日 22:22:00
Author:水如烟

Option Strict Off

Namespace uIO

    
Public Class File

        
'前期绑定的话需引用COM:Microsoft Shell Controls And Automation
        Public Shared Function GetDetails(ByVal file As StringAs Dictionary(Of StringObject)
            
Dim mResult As New Dictionary(Of StringObject)


            
Dim mPath As String '取文件或目录的路径
            Dim mFileName As String  '取文件名或目录名

            
If IO.File.Exists(file) Then  '如是文件
                Dim tmpFileInfo As New IO.FileInfo(file)
                
With tmpFileInfo
                    mPath 
= .DirectoryName
                    mFileName 
= .Name
                
End With
            
Else
                
If IO.Directory.Exists(file) Then '如是目录
                    Dim tmpDirectoryInfo As New IO.DirectoryInfo(file)
                    
With tmpDirectoryInfo
                        
If .Parent Is Nothing Then
                            
Throw New Exception '不能查询根目录
                        Else
                            mPath 
= .Parent.FullName
                            mFileName 
= .Name
                        
End If
                    
End With
                
Else
                    
Throw New IO.FileNotFoundException '文件或目录无效
                End If
            
End If


            
Dim mShell As Object 'Shell32.Shell '
            Dim mFolder As Object 'Shell32.Folder
            Dim mFolderItem As Object 'Shell32.FolderItem

            mShell 
= CreateObject("Shell.Application"' New Shell32.Shell '

            
'mFolder = mShell.NameSpace(mPath)
            '上语句用WScript解释或引用COM方式都能正常运行, 但后期绑定中返回的是Nothing
            '而直接用字符串值代替变量mPath又是能取得正确结果的
            '暂用下句代替
            mFolder = System.Runtime.CompilerServices.RuntimeHelpers.GetObjectValue(Microsoft.VisualBasic.CompilerServices.NewLateBinding.LateGet(mShell, Nothing"Namespace"New Object() {mPath}, NothingNothingNothing))

            mFolderItem 
= mFolder.ParseName(mFileName) '等效于mFolder.Items.Item(MFileName)

            
'可能的属性数。一般个数为13,查到扩展属性时是34,这里我加到256
            Dim mCount As Integer = &HFF

            
Dim mPropertyName As String
            
Dim mPropertyValue As Object

            
For i As Integer = 0 To mCount
                mPropertyName 
= mFolder.GetDetailsOf(Nothing, i) '取属性名称
                mPropertyValue = mFolder.GetDetailsOf(mFolderItem, i) '取属性值
                If Not mPropertyName = "" Then
                    mResult.Add(mPropertyName, mPropertyValue)
                
End If
            
Next


            mFolderItem 
= Nothing
            mFolder 
= Nothing
            System.Runtime.InteropServices.Marshal.ReleaseComObject(mShell)
            mShell 
= Nothing

            
Return mResult
        
End Function

    
End Class

End Namespace

测试,顺便也测试混合格式的处理:
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        
Dim mCollection As ICollection = LzmTW.uIO.File.GetDetails("d:/lzmtw.dll")
        LzmTW.uCollection.MoveNext(mCollection, 
New Action(Of KeyValuePair(Of StringObject))(AddressOf Printer))
    
End Sub

    
Public Sub Printer(ByVal KeyValue As KeyValuePair(Of StringObject))
        
Static i As Integer
        
With KeyValue
            Console.WriteLine(LzmTW.uString.Format(
"{0,-14}:{1,-30}  第{2,2}项", .Key, .Value, i))
        
End With
        i 
+= 1
    
End Sub

其中MoveNext的代码:
    Public Shared Sub MoveNext(Of T)(ByVal enumerator As IEnumerator, ByVal action As Action(Of T))

        
While enumerator.MoveNext
            action.Invoke(
CType(enumerator.Current, T))
        
End While
    
End Sub

    
Public Shared Sub MoveNext(Of T)(ByVal collection As ICollection, ByVal action As Action(Of T))

        MoveNext(Of T)(collection.GetEnumerator, action)
    
End Sub

    
Public Shared Sub MoveNext(Of T)(ByVal enumerable As IEnumerable, ByVal action As Action(Of T))

        MoveNext(Of T)(enumerable.GetEnumerator, action)
    
End Sub

结果,要图片才行:

如何用C#获得文件信息以及扩展信息

在C#中获得文件信息很容易,只需要用FileInfo类或者FileVersionInfo类就可以获得,但是如果想要获得文件的扩展信息,则无法从这两类来获得。不过在C#中,这也不是件难事,只要引入“Mi...
  • Knight94
  • Knight94
  • 2006年05月07日 09:00
  • 19557

How to handle crash problem?(4.VS 2005使用map文件查找程序崩溃原因)

原文转自 http://www.cppblog.com/kuramawzw/articles/93081.html       一般程序崩溃可以通过debug,找到程序在那一行代码崩溃了,最近编一个...

如何在MMIT上使用WMLScript文件(How To Use WMLScript Files With MMIT)

准备翻译原文:http://www.dotnet247.com/247reference/msgs/20/103177.aspx++++++++++++++++++++++++++++++++++++...

如何阻止文件被iTunes和iCloud同步 How do I prevent files from being backed up to iCloud and iTunes?

http://blog.csdn.net/i2c_rs485/article/details/7386444 解决应用被打回的错误: We found that your app does not...
  • xyxjn
  • xyxjn
  • 2015年01月28日 14:08
  • 1072

HOW TO:使用 Visual C# .NET 从文件中读取 XML

本文描述如何使用 XmlTextReader 类从文件读取可扩展标记语言 (XML)。 XmlTextReader 可对 XML 直接进行语法分析和标记,并且实施了 XML 1.0 规范以及 ...
  • wyh0318
  • wyh0318
  • 2012年03月26日 14:36
  • 252

How to extend logical volume space (给逻辑卷扩展空间)

How to extend logical volume space (给逻辑卷扩展空间)
  • unixpro
  • unixpro
  • 2015年12月02日 12:42
  • 499

SNMP--How to develop a SNMP extension agent DLL(如何开发一个SNMP扩展代理DLL)

英文网址为:http://www.codeproject.com/Articles/9024/How-to-develop-a-SNMP-extension-agent-DLL 本文翻译只是出于...

PHP配置rrdtool扩展 (How to build the PHP rrdtool extension)

服务器基本信息  CentOS 5. 7 X86_64  RRDtool 1.4.5  PHP 5.3.8  第一步 访问 http://oss.oetiker.ch/rrdtool/pub/con...
  • youngqj
  • youngqj
  • 2012年01月06日 18:06
  • 4793

SNMP--How to install SNMP extension agent DLL(如何安装SNMP扩展代理DLL)

英文原文地址: http://www.codeproject.com/Articles/9025/How-to-install-SNMP-extension-agent-DLL   How to in...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:HOW TO:获取文件扩展属性
举报原因:
原因补充:

(最多只允许输入30个字)