在.NET框架中,从Windows Vista版本开始,微软引入了更多的“特殊文件夹”,例如“文档”和“图片”。然而,.NET库并没有提供一个简单易用的方法来获取这些文件夹的完整路径。Ray Koopa在他的文章中详细讨论了这个问题,并为C#程序员提供了一个名为KnownFolders的类,该类包含GetPath()、GetDefaultPath()和Initialize()等公共方法,用于获取这些文件夹的路径。但是,这些代码仅适用于C#,对于这些生活在Visual Basic世界中的程序员来说,这并不是问题。之所以使用Visual Basic,是因为管理层认为它对于非程序员来说更容易阅读和理解。(有时,认为他们会更高兴使用COBOL。再一想,不要告诉他们关于COBOL.NET或NetCobol!)
在Ray Koopa的文章中,他指出从Windows Vista开始,微软在.NET库中添加了许多“特殊文件夹”,例如“文档”和“图片”。微软并没有提供一个简单易用的解决方案,让程序员能够检索这些文件路径。Ray Koopa提供了一个名为KnownFolders的类,该类包含GetPath()、GetDefaultPath()和Initialize()等公共方法,用于获取这些文件夹的路径。他还提供了一个简短的控制台程序来演示他的代码的使用。
对他的代码进行了改进,将其重写为Visual Basic模块。他的原始注释大部分保留在代码中。还添加了一个名为PathNotFoundException的异常类,该类继承自ApplicationException类,用于提供结构化的错误处理。没有使用控制台程序,而是包含了一个Visual Basic Windows表单来演示代码的使用。为了尽可能广泛的兼容性,使用Visual Studio 2005构建了这个模块。据所知,这个模块可以添加到任何Visual Basic项目中,任何版本的Visual Studio都可以使用。
要使用这个模块,只需将KnownFolders.vb添加到Visual Basic项目中。要获取任何“特殊文件夹”的完整路径名称,只需调用KnownFolders.GetPath,传入要检索的文件夹路径的枚举值。调用将返回所查询文件夹的完整路径,或者抛出PathNotFoundException。下面的代码循环遍历枚举值,并将一组四行添加到文本框中:
For Each myFolder In [Enum].GetValues(GetType(KnownFolders.KnownFolder))
Me.myText.Text &= CInt(myFolder).ToString & vbTab & myFolder.ToString & vbCrLf
Me.myText.Text &= vbTab & "Current Path:" & vbTab
Try
Me.myText.Text &= KnownFolders.GetPath(myFolder)
Catch ex As PathNotFoundException
Me.myText.Text &= "**** " & ex.Message
End Try
Me.myText.Text &= vbCrLf
Me.myText.Text &= vbTab & "Default Path:" & vbTab
Try
Me.myText.Text &= KnownFolders.GetDefaultPath(myFolder)
Catch ex As Exception
Me.myText.Text &= "**** " & ex.Message
End Try
Me.myText.Text &= vbCrLf & vbCrLf
Next
用户只需要在路径后面添加一个"\",然后是一个文件名。就是这么简单!
注意到许多Code Project库的作者并没有定义他们自己的ApplicationExceptions。他们依赖于在代码内部生成MessageBox或触发UnhandledException处理程序。定义自己的异常是很容易的。
Public Class PathNotFoundException
Inherits ApplicationException
Public Sub New(ByVal message As String)
MyBase.New(message)
End Sub
End Class
Throw New PathNotFoundException("Unable to retrieve the known folder path.")