将共享本地路径转换为 ​​UNC 路径的 VB.NET 代码

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/16185716/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-17 13:22:55  来源:igfitidea点击:

VB.NET code to Convert shared local path to UNC path

vb.netuncshared-directory

提问by IT researcher

We have windows 2003server Pc named pc2 in which local drives are shared with different names. For example local drive E is shared with name 'datapath' so that all users in networkaccess that drive using network path '\\pc2\datapath\'. We need VB.net code to convert local path to shared UNC pathi.e if we input 'E:\netuse',code must return '\\pc2\datapath\netuse'.

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

Is there any way to do this in VB.net?

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

EDIT: Drive E is not mapped,it is just shared

编辑:驱动器 E 未映射,它只是共享

采纳答案by IT researcher

This code worked very well

这段代码工作得很好

        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

回答by Cubsoft

Just created a small app which seems to work.

刚刚创建了一个似乎有效的小应用程序。

It takes a textbox with a non-unc value and converts it,then sets a label

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

Remember to include the following namespaces if you haven't already;

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

Imports System.Text
Imports System.IO

This is the method that does all the work;

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

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 this function;

声明这个函数;

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

Call the code from a button click;

通过单击按钮调用代码;

  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

Hope this helps.

希望这可以帮助。