Ik had net de behoefte aan hetzelfde wat OP vraagt en na het zoeken op Google en het lezen van de antwoorden, geen van hen gaf wat ik denk dat de OP en ik zoeken.
Het probleem hier is dat men een netwerkdeel naar Drive Y
in kaart kan brengen terwijl iemand anders in de organisatie hetzelfde netwerkdeel in kaart kan brengen als Drive X
; daarom kan het sturen van een link zoals Y:\mydirectory
voor niemand anders werken, behalve voor mij.
Zoals de OP uitlegt, toont Verkenner wel het eigenlijke pad in de Explorer-balk, maar je kunt het niet kopiëren (typen is vervelend en foutgevoelig, dus dit is geen optie), zelfs als je copy as path
kiest uit het contextmenu:
Dus de oplossing die ik bedacht heb (door de code van iemand anders te kopiëren) was een klein C# programma dat je kunt aanroepen vanuit een contextmenu in Verkenner en waarmee je de Mapped drive letter kunt vertalen naar de eigenlijke UNC path
.
Hier is de code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace Utils
{
//This is the only piece of code I wrote
class Program
{
[STAThread]
static void Main(string[] args)
{
//Takes the parameter from the command line. Since this will
//be called from the context menu, the context menu will pass it
//via %1 (see registry instructions below)
if (args.Length == 1)
{
Clipboard.SetText(Pathing.GetUNCPath(args[0]));
}
else
{
//This is so you can assign a shortcut to the program and be able to
//Call it pressing the shortcut you assign. The program will take
//whatever string is in the Clipboard and convert it to the UNC path
//For example, you can do "Copy as Path" and then press the shortcut you
//assigned to this program. You can then press ctrl-v and it will
//contain the UNC path
Clipboard.SetText(Pathing.GetUNCPath(Clipboard.GetText()));
}
}
}
}
En hier is de Pathing
klasse definitie (ik zal proberen de eigenlijke bron te vinden omdat ik niet meer weet waar ik die gevonden heb):
public static class Pathing
{
[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);
/// <summary>
/// Given a path, returns the UNC path or the original. (No exceptions
/// are raised by this function directly). For example, "P:008-02-29"
/// might return: "\networkserver\Shares\Photos008-02-09"
/// </summary>
/// <param name="originalPath">The path to convert to a UNC Path</param>
/// <returns>A UNC path. If a network drive letter is specified, the
/// drive letter is converted to a UNC or network path. If the
/// originalPath cannot be converted, it is returned unchanged.</returns>
public static string GetUNCPath(string originalPath)
{
StringBuilder sb = new StringBuilder(512);
int size = sb.Capacity;
// look for the {LETTER}: combination ...
if (originalPath.Length > 2 && originalPath[1] == ':')
{
// don't use char.IsLetter here - as that can be misleading
// the only valid drive letters are a-z && A-Z.
char c = originalPath[0];
if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'))
{
int error = WNetGetConnection(originalPath.Substring(0, 2),
sb, ref size);
if (error == 0)
{
DirectoryInfo dir = new DirectoryInfo(originalPath);
string path = Path.GetFullPath(originalPath)
.Substring(Path.GetPathRoot(originalPath).Length);
return Path.Combine(sb.ToString().TrimEnd(), path);
}
}
}
return originalPath;
}
}
Je bouwt het programma en zet het uitvoerbare bestand ergens in je PC, bijvoorbeeld in c:\Utils
Nu voeg je in de Verkenner een contextmenu-optie toe als volgt:
Regedit en dan:
HKEY_CLASSES_ROOT\*\Directory\Shell
Right-click Shell --> New Key --> Name: "To UNC Path"
Right-click To UNC Path --> New Key --> Name: command
Right-click Default entry and select `Modify`
Value Data: c:\Utils\Utils.exe "%1"
Je bent klaar. Nu zie je deze optie wanneer je met de rechtermuisknop klikt op een directory van een gemapt station:
Let op
Ik kan het uitvoerbare bestand aanleveren zodat je de compilatie niet zelf hoeft te doen. Laat me hier gewoon een notitie achter.