C# 网盘映射问题(分不多了,就100)
写了个程序,就是实现网络共享文件夹和本地的文件夹映射的
网络映射的代码
- C# code
[DllImport("mpr.dll", EntryPoint = "WNetAddConnection2")] public static extern uint WNetAddConnection2( [In] NETRESOURCE lpNetResource, string lpPassword, string lpUsername, uint dwFlags); [DllImport("Mpr.dll")] public static extern uint WNetCancelConnection2( string lpName, uint dwFlags, bool fForce); [StructLayout(LayoutKind.Sequential)] public class NETRESOURCE { public int dwScope; public int dwType; public int dwDispalyType; public int dwUsage; public string LocalName; public string RemoteName; public string Comment; public string Provider; } public override int MappingDrive(string localname, string path,string provider) { try { NETRESOURCE myNetResource = new NETRESOURCE(); myNetResource.dwScope = 2; myNetResource.dwType = 1; myNetResource.dwDispalyType = 3; myNetResource.dwUsage = 1; myNetResource.LocalName = localname; myNetResource.RemoteName = path; uint nret = WNetAddConnection2(myNetResource, "9fcs999", "jianbo", 0); return Convert.ToInt32(nret); } catch { return -1; } } public override int CloseDrive(string localname) { uint cnret = WNetCancelConnection2(localname, 0, true); Thread.Sleep(1000); return Convert.ToInt32(cnret); }
本地映射的代码
- C# code
public override int MappingDrive(string localname, string path,string provider) { string para = localname + " " + path; StringBuilder outputStr = new StringBuilder(); int re = 1; try { Microsoft.Win32.RegistryKey key; key = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(@"software\microsoft\PCHealth\ErrorReporting\", true); int doReport = (int)key.GetValue("DoReport"); if (doReport != 0) { key.SetValue("DoReport", 0); } int showUI = (int)key.GetValue("ShowUI"); if (showUI != 0) { key.SetValue("ShowUI", 0); } } catch { } m_Error = ""; m_Output = ""; try { Process p = new Process(); p.StartInfo.FileName = "subst"; // fileName; p.StartInfo.Arguments = para; p.StartInfo.UseShellExecute = false; //p.StartInfo.RedirectStandardInput = true; p.StartInfo.RedirectStandardOutput = true; p.StartInfo.RedirectStandardError = true; p.StartInfo.CreateNoWindow = true; p.Start(); p.WaitForExit(); var exitCode = p.ExitCode; re = exitCode; } catch (Exception e) { m_Error = e.Message; } return re; } public override int CloseDrive(string localname) { int re = MappingDrive(localname, " /D",""); return re; }
因为要在同一个盘符上映射,所以就是要经常切换,断开再映射
- C# code
public int Connect(List<string> list) { if (!(list == null || list.Count == 0)) { if (!ExsitsDrive(list[0])) { return Connecting(list); } else { List<string> allmdrive = GetAllMappingDriveName(); if (allmdrive.Contains(list[0])) { DriveInfo di = new DriveInfo(list[0]); List<string> currentdrive = new List<string>(); currentdrive.Add(list[0]); currentdrive.Add(di.VolumeLabel); if (di.DriveType == DriveType.Network) { currentdrive.Add("\\"); } else { currentdrive.Add(" /D"); } int reint = Deletting(currentdrive); //Thread.Sleep(1000); if (reint == 0) { if(!(MainForm.form ==null)) { MainForm.form.DeleteItem(0); } Thread.Sleep(1000); return Connect(list); } else { return reint; } } else { return -1; } } } else return -2; }
- C# code
private int Connecting(List<string> list) { int reint = -1; if (!(list == null || list.Count == 0)) { if (list[2].StartsWith("\\")) { using (Connect connect = new ConnectNet()) { reint = connect.MappingDrive(list[0], list[2],list[1]); if (reint == 0) { log.RecordConnecting(list[0] + "|" + list[1] + "|" + list[2]); } } } else { using (Connect connect = new ConnectLoc()) { reint = connect.MappingDrive(list[0], list[2],list[1]); if (reint == 0) { log.RecordConnecting(list[0] + "|" + list[1] + "|" + list[2]); } } } return reint; } else { return -2; } }
- C# code
public int Deletting(List<string> list) { int reint = -1; if (!(list == null || list.Count == 0)) { if (list[2].StartsWith("\\")) { using (Connect connect = new ConnectNet()) { reint = connect.CloseDrive(list[0]); if (reint == 0) { log.DeleteConnecting(); } } } else { using (Connect connect = new ConnectLoc()) { reint = connect.CloseDrive(list[0]); if (reint == 0) { log.DeleteConnecting(); } } } return reint; } else { return -2; } }
一些相关的代码,现在的问题是,如果第一次映射的是网络文件夹,然后马上再映射一个本地的,在计算机里面看到的就是,原来网络映射的地方,连接变成断开了,但是映射还在,路径是本地的,可以用,
如果第一个映射的是网络文件夹,再映射一个网络文件夹,就只是路径变了,但是映射盘上的卷名,应该是provider名字并不变
这些状况,只有快速运行的时候出现,调试的时候,一步步执行一点问题都没有。。。。
不知道到底哪里出问提了啊。。。求大侠指教啊
[解决办法]
说实话 不知道你打算干什么,
如果你提出一种设计,而那方面的资料又很少
那很可能,你这种设计就错了
[解决办法]
很抱歉 我没看明白 只能帮你顶下
[解决办法]