2008年7月25日金曜日

.NET Vista対応 その3 パブリックフォルダでファイルを共有する

Windows Vista ヘルプ:パブリックフォルダを使用したファイルの共有によると
パブリックフォルダ内のファイルは、同じコンピュータを使用している他のユーザーや、同じネットワーク上で別のコンピュータを使用しているユーザーと共有できます。
パブリック フォルダ内に配置したファイルまたはフォルダは、そのパブリック フォルダにアクセスできるユーザーと自動的に共有されます。
とあります。

パブリックフォルダとは、Vistaでは「C:/ユーザ/パブリック」、XPでは「C:/Documents and Settings/All Users」にあたります。

VisualStudioで特殊フォルダのパスを取得するSystem.EnvironmentクラスのGetFolderPathメソッドでは、このパブリックフォルダのパスは取得できません。

方法その1:APIを使用してパブリックフォルダのパスを取得する
パブリックフォルダのパスを取得するにはAPI「SHGetSpecialFolderPath」を使用して「CSIDL_COMMON_DOCUMENTS」のパスを取得するようにします。
Public Class Form1

Private Const CSIDL_COMMON_DOCUMENTS As Int32= &H2E


Private Declare Function SHGetSpecialFolderPath Lib "shell32.dll" Alias "SHGetSpecialFolderPathA" _
(ByVal hwndOwner As IntPtr, ByVal lpszpath As System.Text.StringBuilder, ByVal nfolder As Int32, ByVal fcreate As Int32) As Int32


Function GetSpecialPath(ByVal nfolder As Int32) As String
Dim resultPath As New System.Text.StringBuilder(255)
SHGetSpecialFolderPath(Nothing, resultPath, nfolder, 0)
Return resultPath.ToString()
End Function

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
MessageBox.Show(GetSpecialPath(CSIDL_COMMON_DOCUMENTS))
End Sub

End Class


Vistaでは「C:/Users/Public/Documents」、XPでは「C:/Documents and Settings/All Users/Documents」が取得できます。


方法その2:レジストリを使用してパブリックフォルダのパスを取得する
Public Class Form2

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim allUsersDocuments As String = ""
Dim regKey As Microsoft.Win32.RegistryKey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey("SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders", False)
Try
allUsersDocuments = regKey.GetValue("Common Documents", "").ToString
Finally
regKey.Close()
End Try
MessageBox.Show(allUsersDocuments)
End Sub

End Class


こちらもVistaでは「C:/Users/Public/Documents」、XPでは「C:/Documents and Settings/All Users/Documents」が取得できます。

0 件のコメント: