读书人

C# 网盘映射有关问题(分不多了就100)

发布时间: 2012-04-21 14:34:44 作者: rapoo

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名字并不变
这些状况,只有快速运行的时候出现,调试的时候,一步步执行一点问题都没有。。。。

不知道到底哪里出问提了啊。。。求大侠指教啊

[解决办法]
说实话 不知道你打算干什么,

如果你提出一种设计,而那方面的资料又很少

那很可能,你这种设计就错了

[解决办法]
很抱歉 我没看明白 只能帮你顶下
[解决办法]
探讨

很抱歉 我没看明白 只能帮你顶下

读书人网 >C#

热点推荐