共有ファイルにプログラムからアクセス

スポンサーリンク

今の職場はサービスや業務毎にベンダーや導入形態が違うというとりとめのない状態なのですが、データ連携時システムを跨ぐので共有フォルダに定期的に出力した情報を取りに行くという状態です。

共有フォルダは接続が切れると取得時にエラーになるのでプログラムから共有フォルダえの接続認証をしてから取るようにしてみました。

調べてみると[WNetAddConnection3A]っていうAPIたたけばいいそうです。

 

APIの定義

Private Declare Function WNetAddConnection3 Lib "mpr.dll" Alias "WNetAddConnection3A" _
(ByVal hWndOwner As Integer, _
ByRef lpNetResource As NETRESOURCE, _
ByVal lpPassword As String, _
ByVal lpUserName As String, _
ByVal dwFlags As Integer) As Integer
Private Const RESOURCETYPE_ANY As Integer = &H0
Private Const CONNECT_INTERACTIVE As Integer = &H8

 

‘構造体を定義

Private Structure NETRESOURCE
Dim dwScope As Integer
Dim dwType As Integer
Dim dwDisplayType As Integer
Dim dwUsage As Integer
Dim lpLocalName As String
Dim lpRemoteName As String
Dim lpComment As String
Dim lpProvider As String
End Structure

 

‘とりあえず接続してフォルダの中身をCドライブ直下にコピー

private sub AccessShareFolder
Dim udtResource As New NETRESOURCE
Dim ret As Integer
With udtResource
.dwType = RESOURCETYPE_ANY
.lpLocalName = vbNullString
.lpRemoteName = "フォルダPATH"
.lpProvider = vbNullString
End With
'ここで接続をためす
ret = WNetAddConnection3(0&, udtResource, "PASS", "ID", CONNECT_INTERACTIVE)
'接続に失敗するとGetFilesでエラーになるので注意
For Each serverFilePath As String In System.IO.Directory.GetFiles("フォルダパス")
Dim fileName As String = System.IO.Path.GetFileName(serverFilePath)
System.IO.File.Copy(serverFilePath, System.IO.Path.Combine("c:\", fileName))
Next
End sub

 

いろいろ調べてみましたが、共有フォルダへの接続確認をしてから取得するのではなく、とりあえず接続してみて成功であれば処理を続行し、失敗したら何かしらの対処をするというやり方が一般的らしいです。Try Catchで括っとく必要があるみたいですね。

 

コメント