본문 바로가기

Dev::DotNet/C#

네트워크 폴더 접속


Windows Network folder 를 오픈하는 방법은 


그냥 


net use 명령어를 배치파일로 떨궈서 실행시켜 오픈하는 방법과 


API 를 통해서 오픈하는 방법이 있다.



> net use 명령어를 배치파일로 만들어 실행하는 방법


    string batPath = System.Environment.CurrentDirectory + @"\NetworkDrive_Connect.bat";                

                string netStr = @"net use " + NDServerPath + " /User:" + NDUserID + " " + NDPassword;


                using (FileStream fs = new FileStream(batPath, FileMode.Create))

                {

                    System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();

                    byte[] bytes = encoding.GetBytes(netStr);


                    fs.Write(bytes, 0, bytes.Length);


                    fs.Close();

                    fs.Dispose();

                }


                if (File.Exists(batPath))

                {

                    System.Diagnostics.Process proc = new System.Diagnostics.Process();

                    proc.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;

                    proc.StartInfo.FileName = batPath;

                    proc.Start();

                    proc.WaitForExit();


                    File.Delete(batPath);

                }


proc.WaitForExit(); 를 통해서 프로세스가 종료될 때 까지 기둘리는데


종종 배치파일을 통해서 실행된 cmd 창이 한동안 종료가 안될 때가 있어서 


한동안 멈춰있는 경우가 생길 수 있다.



> API 를 이용한 방법


[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]

          private struct NETRESOURCE

            {

            public uint dwScope;

            public uint dwType;

            public uint dwDisplayType;

            public uint dwUsage;

            public string lpLocalName;

            public string lpRemoteName;

            public string lpComment;

            public string lpProvider;

            }


     [DllImport("mpr.dll", CharSet = CharSet.Auto)]

     private static extern int WNetUseConnection(

                        IntPtr hwndOwner,

                        [MarshalAs(UnmanagedType.Struct)] ref NETRESOURCE lpNetResource,

                        string lpPassword,

                        string lpUserID,

                        uint dwFlags,

                        System.Text.StringBuilder lpAccessName,

                        ref int lpBufferSize,

                        out uint lpResult);


[DllImport("mpr.dll", EntryPoint = "WNetCancelConnection2", CharSet = CharSet.Auto)]

      private static extern int  WNetCancelConnection2A(string lpName, int dwFlags, int fForce);


.......................


Connection


int capacity = 64;

      uint resultFlags = 0;

      uint flags = 0;


      System.Text.StringBuilder sb = new System.Text.StringBuilder(capacity);


      NETRESOURCE ns = new NETRESOURCE();

      ns.dwType = 1;                

      ns.lpLocalName = null;    

      ns.lpRemoteName = sPath;    // 폴더 경로

      ns.lpProvider = null;


      int result = WNetUseConnection(

                               IntPtr.Zero, ref ns, pw, id, flags, sb, ref capacity, out resultFlags);


: Disconnection


WNetCancelConnection2A(sPath, 1, 0);