Как я определяю фактический путь сетевого диска?
Таким образом, если у меня есть сетевой диск на машине, названной "Z", как может, я использующий.NET определяю машину и путь для отображенной папки?
Код может предположить, что работает на машине с сетевым диском.
Я посмотрел на Путь, Каталог, объекты FileInfo, но, может казаться, ничего не нахожу.
Я также искал существующие вопросы, но не мог найти то, что я ищу.
Вот некоторые образцы кода:
Все магии происходит из функции Windows:
[DllImport("mpr.dll", CharSet = CharSet.Unicode, SetLastError = true)]
public static extern int WNetGetConnection(
[MarshalAs(UnmanagedType.LPTStr)] string localName,
[MarshalAs(UnmanagedType.LPTStr)] StringBuilder remoteName,
ref int length);
Пример вызова:
var sb = new StringBuilder(512);
var size = sb.Capacity;
var error = Mpr.WNetGetConnection("Z:", sb, ref size);
if (error != 0)
throw new Win32Exception(error, "WNetGetConnection failed");
var networkpath = sb.ToString();
Насколько Windows заботится, то то, что нужно, - это призыв к wnetGetConnection
. Я не знаю о фронте для этого в .NET, так что вам, возможно, придется называть его через P / Invoke (к счастью, у него есть только один параметр, код P / Invoke не слишком ужасен).
QuerydosDevice Перевод писем привода в путь, к которому он расширяется.
Обратите внимание, что это переводит все буквы привода, а не только те, которые отображаются на сетевые соединения. Вам нужно уже знать, какие сетевые пути или анализа вывода, чтобы увидеть, какие сети.
Вот подпись Vb
Declare Function QueryDosDevice Lib "kernel32" Alias "QueryDosDeviceA" (
ByVal lpDeviceName As String,
ByVal lpTargetPath As String,
ByVal ucchMax As Integer) As Integer
и C # One
[DllImport("kernel32.dll")]
static extern uint QueryDosDevice(string lpDeviceName, IntPtr lpTargetPath, uint ucchMax);
Кажется, это нужен P / Invoke: Преобразование сопоставленной буквы диска на сетевой путь с использованием C #
Этот парень построил управляемый класс, чтобы справиться с ним: Сетевой диск C # MAP (API)
Вы Также можно использовать WMI Win32_LogialDisk, чтобы получить все необходимую информацию. Используйте ProvielyName из класса, чтобы получить путь UNC.
Вы можете использовать WMI, чтобы допросить коллекцию Win32_LogiClive на вашем компьютере. Вот пример того, как сделать это со сценарием . Изменение этого в C # довольно хорошо объяснено в других местах.
Слегка модифицированный код VB.Net из статьи:
Public Class Form1
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim strComputer = "."
Dim objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Dim colDrives = objWMIService.ExecQuery("Select * From Win32_LogicalDisk Where DriveType = 4")
For Each objDrive In colDrives
Debug.WriteLine("Drive letter: " & objDrive.DeviceID)
Debug.WriteLine("Network path: " & objDrive.ProviderName)
Next
End Sub
End Class