Ho appena avuto la necessità della stessa cosa che chiede l'OP e dopo aver cercato su Google e letto le risposte, nessuna di queste ha fornito ciò che penso l'OP ed io stiamo cercando.
Il problema qui è che si può mappare una condivisione di rete su Drive Y
mentre qualcun altro nell'organizzazione può avere la stessa condivisione di rete mappata come Drive X
; quindi, l'invio di un link come Y:\mydirectory
potrebbe non funzionare per nessun altro tranne che per me.
Come spiega l'OP, Explorer mostra il percorso effettivo nella barra di Explorer, ma non è possibile copiarlo (la digitazione è noiosa e soggetta a errori, quindi questa non è un'opzione) anche se si sceglie copy as path
dal menu contestuale:
Quindi la soluzione che ho trovato (copiando il codice di qualcun altro) è stato un piccolo programma C# che si può chiamare da un menu contestuale in Explorer e che vi permetterà di tradurre la lettera di unità mappata all'effettivo UNC path
.
Ecco il codice:
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()));
}
}
}
}
``` ```
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;
}
}
Ed ecco la definizione della classe Pathing
(cercherò di trovare il sorgente effettivo perché non ricordo dove l'ho trovato):
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"
``` &001
Si costruisce il programma e si mette l'eseguibile da qualche parte nel PC, ad esempio in `c:\Utils`
Ora si aggiunge un'opzione di menu contestuale in Explorer come così:
**Regedit** e poi:
&001 &001
Hai finito. Ora vedrete questa opzione quando farete clic con il tasto destro del mouse su una directory da un'unità mappata:
&004
# Nota
Posso fornire l'eseguibile in modo da non dover fare la compilazione da soli. Basta che mi lasciate una nota qui.