如何在VB.net中引用当前Windows用户的video文件夹path

我正在寻找一种在VB.NET中引用当前用户的“MyVideos”文件夹的方法。

我的目标是使用这个引用来设置我的OpenFileDialog对象的InitialDirectory propery。 这东西谎言:

 OpenFileDialog1.InitialDirectory = My.Computer.FileSystem.SpecialDirectories.MyDocuments 

SpecialDirectories下,我找不到MyVideos的物业。 我在SpecialDirectories中唯一的属性是:

 .Desktop .MyDocuments .MyMusic .MyPictures .Programfiles .Programs .Temp 

我错过了什么吗? 是否有另一种方式来访问这些信息?

我能够得到用户的根文件夹,并与“video”,如下所示:

 Dim vidPath As String = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), "Videos") 

但是,假设用户没有更改其“ My Videos文件夹在其位置属性中的位置。

我的视频文件夹 - 位置属性

我想想出一个方法来引用这个位置,以防用户更改了这个位置设置。

Environment.SpecialFolder枚举中缺少的文件夹可通过API调用获得。 有几个C#的答案,主要是partials(得到一个特定的文件夹)。 VB版本的所有(?)缺失的:

 Public Partial Class NativeMethods <DllImport("shell32.dll")> Private Shared Function SHGetKnownFolderPath(<MarshalAs(UnmanagedType.LPStruct)> rfid As Guid, dwFlags As UInt32, hToken As IntPtr, ByRef pszPath As IntPtr) As Int32 End Function ' in order, below are: Public Enum ShellSpecialFolders Contacts Downloads Links Music Pictures SavedGames SavedSearches Videos End Enum Private Shared ShellFolderGuids As Guid() = { Guid.Parse("{56784854-C6CB-462B-8169-88E350ACB882}"), Guid.Parse("{374DE290-123F-4565-9164-39C4925E467B}"), Guid.Parse("{BFB9D5E0-C6A9-404C-B2B2-AE6DB6AF4968}"), Guid.Parse("{4BD8D571-6D19-48D3-BE97-422220080E43}"), Guid.Parse("{33E28130-4E1E-4676-835A-98395C3BC3BB}"), Guid.Parse("{4C5C32FF-BB9D-43B0-B5B4-2D72E54EAAA4}"), Guid.Parse("{7D1D3A04-DEBB-4115-95CF-2F29DA2920DA}"), Guid.Parse("{18989B1D-99B5-455B-841C-AB7C74E4DDFC}") } Friend Shared Function GetSpecialFolder(folder As ShellSpecialFolders) As String Dim ret As Int32 Dim fPath As IntPtr ' == "Dont Vertify" flag: Dim SHFlag As UInt32 = &H4000 ret = SHGetKnownFolderPath(ShellFolderGuids(folder), SHFlag, New IntPtr(0), fPath) If ret = 0 Then Return Marshal.PtrToStringUni(fPath) Else Return "" End If End Function ' Optional single purpose version Friend Shared Function GetSpecialVideoFolder() As String Return GetSpecialFolder(ShellSpecialFolders.Videos) End Function '... End Class 

用法示例:

 spath = NativeMethods.GetSpecialFolder(NativeMethods.ShellSpecialFolders.Videos) Console.WriteLine("Videos are in: {0}", spath) 

或者如果你想为他们编写包装:

 spath = NativeMethods.GetSpecialVideoFolder() 

如果你想得到默认的文件夹(而不是C:\Users\USER NAME\...你会得到C:\Users\Default\... )将IntPtr参数改为-1:

 ret = SHGetKnownFolderPath(ShellFolderGuids(folder), SHFlag, New IntPtr(-1), fPath) 

结果:

在这里输入图像说明 在这里输入图像说明

注意:返回的文件夹显然不需要存在。 特别是使用默认版本时,返回的几个文件夹实际上并不存在于我的系统中。