По моему опыту, .NET всегда сталкивался с путями UNC. Иногда это работает, а иногда нет. Я уверен, что есть хорошее объяснение этому, но вначале я искал и искал, не найдя ответа.
Вместо того, чтобы разобраться с проблемой, я просто принял политику, согласно которой лучше самому сопоставить диск, а затем отключить его, когда это будет сделано в коде. (Если вы найдете ответ, мне будет интересно узнать, почему это так, но, поскольку у меня есть работающее решение, мне все равно, чтобы исследовать его самостоятельно.) Это работает для нас 100% времени, и это очень просто. Для этого я создал класс, поскольку в нашем магазине такая обычная задача.
Я не знаю, открыты ли вы для этой идеи, во всяком случае, но если вы заинтересованы, и у вас еще нет кода, наша процедура вставлена ниже. Было бы довольно просто проверить наличие открытой буквы диска и просто сопоставить ее, а затем отключить, когда все будет готово.
public static class NetworkDrives
{
public static bool MapDrive(string DriveLetter, string Path, string Username, string Password)
{
bool ReturnValue = false;
if(System.IO.Directory.Exists(DriveLetter + ":\\"))
{
DisconnectDrive(DriveLetter);
}
System.Diagnostics.Process p = new System.Diagnostics.Process();
p.StartInfo.UseShellExecute = false;
p.StartInfo.CreateNoWindow = true;
p.StartInfo.RedirectStandardError = true;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.FileName = "net.exe";
p.StartInfo.Arguments = " use " + DriveLetter + ": " + Path + " " + Password + " /user:" + Username;
p.Start();
p.WaitForExit();
string ErrorMessage = p.StandardError.ReadToEnd();
string OuputMessage = p.StandardOutput.ReadToEnd();
if (ErrorMessage.Length > 0)
{
throw new Exception("Error:" + ErrorMessage);
}
else
{
ReturnValue = true;
}
return ReturnValue;
}
public static bool DisconnectDrive(string DriveLetter)
{
bool ReturnValue = false;
System.Diagnostics.Process p = new System.Diagnostics.Process();
p.StartInfo.UseShellExecute = false;
p.StartInfo.CreateNoWindow = true;
p.StartInfo.RedirectStandardError = true;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.FileName = "net.exe";
p.StartInfo.Arguments = " use " + DriveLetter + ": /DELETE";
p.Start();
p.WaitForExit();
string ErrorMessage = p.StandardError.ReadToEnd();
string OuputMessage = p.StandardOutput.ReadToEnd();
if (ErrorMessage.Length > 0)
{
throw new Exception("Error:" + ErrorMessage);
}
else
{
ReturnValue = true;
}
return ReturnValue;
}
}