2

我们有windows 2003名为 pc2 的服务器 Pc,其中本地驱动器以不同的名称共享。例如,本地驱动器 E 与名称 'datapath' 共享,以便所有用户network使用网络路径访问该驱动器 ' \\pc2\datapath\'。我们需要 VB.net 代码将本地路径转换为共享路径,UNC path即如果我们输入 'E:\netuse',代码必须返回 ' \\pc2\datapath\netuse'

有没有办法做到这一点VB.net

编辑:驱动器 E 没有映射,它只是共享的

4

2 回答 2

3

刚刚创建了一个似乎可以工作的小应用程序。

它需要一个具有非 unc 值的文本框并将其转换,然后设置一个标签

如果您还没有,请记住包含以下命名空间;

Imports System.Text
Imports System.IO

这是完成所有工作的方法;

Private Function GetUNCPath(ByVal sFilePath As String) As String

Dim allDrives() As DriveInfo = DriveInfo.GetDrives()
Dim d As DriveInfo
Dim DriveType, Ctr As Integer
Dim DriveLtr, UNCName As String
Dim StrBldr As New StringBuilder

If sFilePath.StartsWith("\\") Then Return sFilePath

UNCName = Space(160)
GetUNCPath = ""

DriveLtr = sFilePath.Substring(0, 3)

For Each d In allDrives
  If d.Name = DriveLtr Then
    DriveType = d.DriveType
    Exit For
  End If
Next

If DriveType = 4 Then

  Ctr = WNetGetConnection(sFilePath.Substring(0, 2), UNCName, UNCName.Length)

  If Ctr = 0 Then
    UNCName = UNCName.Trim
    For Ctr = 0 To UNCName.Length - 1
      Dim SingleChar As Char = UNCName(Ctr)
      Dim asciiValue As Integer = Asc(SingleChar)
      If asciiValue > 0 Then
        StrBldr.Append(SingleChar)
      Else
        Exit For
      End If
    Next
    StrBldr.Append(sFilePath.Substring(2))
    GetUNCPath = StrBldr.ToString
  Else
    MsgBox("Cannot Retrieve UNC path" & vbCrLf & "Must Use Mapped Drive of SQLServer", MsgBoxStyle.Critical)
  End If
Else
  MsgBox("Cannot Use Local Drive" & vbCrLf & "Must Use Mapped Drive of SQLServer", MsgBoxStyle.Critical)
End If

End Function

声明这个函数;

  Declare Function WNetGetConnection Lib "mpr.dll" Alias "WNetGetConnectionA" (ByVal lpszLocalName As String, _
       ByVal lpszRemoteName As String, ByRef cbRemoteName As Integer) As Integer

通过单击按钮调用代码;

  Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
     Dim RealFileName As String = GetUNCPath(txtFileName.Text)
     lblUNC.Text = RealFileName
  End Sub

希望这可以帮助。

于 2013-04-24T08:20:06.137 回答
-1

这段代码工作得很好

        Dim SharePath As String = "e:\Netuse"
        Dim SplitPath() As String = Split(SharePath, "\")
        Dim CurrentPath As String = String.Empty
        Dim ShareName As String = String.Empty
        Dim CurrentFolderIndex As Integer
        Dim UNCPath As String = String.Empty

        For CurrentFolderIndex = 0 To SplitPath.GetUpperBound(0)
            If CurrentPath = String.Empty Then
                CurrentPath = String.Concat(SplitPath(CurrentFolderIndex), "\\")
            Else
                CurrentPath += String.Concat(SplitPath(CurrentFolderIndex), "\\")
            End If
            ShareName = GetShareName(CurrentPath)
            If ShareName <> String.Empty Then
                CurrentFolderIndex += 1
                Exit For
            End If
        Next

        UNCPath = String.Concat("\\", My.Computer.Name, "\", ShareName)

        For SubPathIndex As Integer = CurrentFolderIndex To SplitPath.GetUpperBound(0)
            UNCPath = String.Concat(UNCPath, "\", SplitPath(SubPathIndex))
        Next

        Console.WriteLine(UNCPath)



    Public Function GetShareName(ByVal FolderPath As String) As String

        Dim Searcher As New ManagementObjectSearcher(String.Concat("select * from win32_share WHERE Path = '", FolderPath, "'"))
        Dim ShareName As String = String.Empty

        For Each Share As ManagementObject In Searcher.Get()
            ShareName = Share("Name").ToString
        Next

        Return ShareName

    End Function
于 2013-04-30T07:22:25.347 回答