По моему опыту, в .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;
}
}
person
David
schedule
07.08.2010