将共享本地路径转换为 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
VB.NET code to Convert shared local path to UNC path
提问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.
希望这可以帮助。

