Author:
水如烟
测试,顺便也测试混合格式的处理:
其中MoveNext的代码:
结果,要图片才行:
Option
Strict
Off
Namespace uIO
Public Class File
' 前期绑定的话需引用COM:Microsoft Shell Controls And Automation
Public Shared Function GetDetails( ByVal file As String ) As Dictionary(Of String , Object )
Dim mResult As New Dictionary(Of String , Object )
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}, Nothing , Nothing , Nothing ))
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
Namespace uIO
Public Class File
' 前期绑定的话需引用COM:Microsoft Shell Controls And Automation
Public Shared Function GetDetails( ByVal file As String ) As Dictionary(Of String , Object )
Dim mResult As New Dictionary(Of String , Object )
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}, Nothing , Nothing , Nothing ))
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 String , Object ))( AddressOf Printer))
End Sub
Public Sub Printer( ByVal KeyValue As KeyValuePair(Of String , Object ))
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
Dim mCollection As ICollection = LzmTW.uIO.File.GetDetails( " d:/lzmtw.dll " )
LzmTW.uCollection.MoveNext(mCollection, New Action(Of KeyValuePair(Of String , Object ))( AddressOf Printer))
End Sub
Public Sub Printer( ByVal KeyValue As KeyValuePair(Of String , Object ))
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
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
结果,要图片才行: