1. 程式人生 > 其它 >C#訪問共享伺服器的檔案路徑進行上傳和下載方法

C#訪問共享伺服器的檔案路徑進行上傳和下載方法

最近公司有客戶要求要做一個將本地檔案上傳到遠端伺服器的制定目錄(伺服器是開放了共享檔案的讀寫許可權)

首先先確認共享檔案的路徑有沒有問題

在執行框中輸入共享檔案的路徑,如: \\192.168.3.204\ShareFiles

 如果發現訪問不了,打不開時,請參考這一篇解決問題:https://www.cnblogs.com/xielong/p/16169764.html

正常輸入共享檔案的使用者/密碼後,可以直接訪問到

 那麼準備工作就做好了,進入測試階段

1、本地電腦準備上傳的檔案

 2、伺服器準備下載的檔案

3、呼叫上傳與下載方法

        /// <summary>
        ///
測試上傳和下載(訪問遠端伺服器的共享目錄) /// </summary> public static void TestUpload() { bool status = false; status = ConnectState(@"\\192.168.3.204\ShareFiles", "administrator", "abc@123"); if (status) { DirectoryInfo theFolder
= new DirectoryInfo(@"\\192.168.3.204\ShareFiles\"); string filename = theFolder.ToString(); //執行方法,方法一:讀寫時會有訪問共享目錄許可權問題 //實現將本地檔案寫入到遠端伺服器 TransportLocalToRemote(@"D:\readme.txt", filename, "readme1.txt"); //實現將遠端伺服器檔案寫入本地 TransportRemoteToLocal(@"C
:\serverMe1.txt", filename, "serverMe.txt"); } else { Console.WriteLine("未能連線!"); } Console.WriteLine("成功"); }

4、呼叫後,可以看到本地和伺服器檔案情況

4.1)本地

 4.2)伺服器

 

 5、呼叫的上傳和下載方法

    public static class UploadShareFileHelper
    {
        #region C#訪問遠端伺服器共享目錄下載檔案到本地或本地上傳到伺服器
/// <summary>
        /// 連線遠端共享資料夾
        /// </summary>
        /// <param name="path">遠端共享資料夾的路徑</param>
        /// <param name="username">使用者名稱</param>
        /// <param name="password">密碼</param>
        /// <returns></returns>
        public static bool ConnectState(string path, string username, string password)
        {
            bool flag = false;
            Process proc = new Process();
            try
            {
                proc.StartInfo.FileName = "cmd.exe";
                proc.StartInfo.UseShellExecute = false;
                proc.StartInfo.RedirectStandardInput = true;
                proc.StartInfo.RedirectStandardOutput = true;
                proc.StartInfo.RedirectStandardError = true;
                proc.StartInfo.CreateNoWindow = true;
                proc.Start();
                //string dosLine = @"net use \\IP_ADDRESS\PATH /User:username password /PERSISTENT:YES";
                string dosLine = @"net use " + path + " /user:" + username + " " + password + " /persistent:yes";
                proc.StandardInput.WriteLine(dosLine);
                proc.StandardInput.WriteLine("exit");
                while (!proc.HasExited)
                {
                    proc.WaitForExit(1000);
                }
                string errorMsg = proc.StandardError.ReadToEnd();
                proc.StandardError.Close();
                if (string.IsNullOrEmpty(errorMsg))
                {
                    flag = true;
                }
                else
                {
                    throw new Exception(errorMsg);
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                proc.Close();
                proc.Dispose();
            }
            return flag;
        }

        /// <summary>
        /// 從遠端伺服器下載檔案到本地
        /// </summary>
        /// <param name="src">下載到本地後文件路徑,包含副檔名</param>
        /// <param name="dst">遠端伺服器路徑(共享資料夾路徑)</param>
        /// <param name="fileName">遠端伺服器(共享資料夾)中的檔名稱,包含副檔名</param>
        public static void TransportRemoteToLocal(string src, string dst, string fileName)
        {
            if (!Directory.Exists(dst))
            {
                Directory.CreateDirectory(dst);
            }
            dst = dst + fileName;
            FileStream inFileStream = new FileStream(dst, FileMode.Open);
            FileStream outFileStream = new FileStream(src, FileMode.OpenOrCreate);
            byte[] buf = new byte[inFileStream.Length];
            int byteCount;
            while ((byteCount = inFileStream.Read(buf, 0, buf.Length)) > 0)
            {
                outFileStream.Write(buf, 0, byteCount);
            }
            inFileStream.Flush();
            inFileStream.Close();
            outFileStream.Flush();
            outFileStream.Close();
        }

        /// <summary>
        /// 將本地檔案上傳到遠端伺服器共享目錄
        /// </summary>
        /// <param name="src">本地檔案的絕對路徑,包含副檔名</param>
        /// <param name="dst">遠端伺服器共享檔案路徑,不包含副檔名</param>
        /// <param name="fileName">上傳到遠端伺服器後的副檔名</param>
        public static void TransportLocalToRemote(string src, string dst, string fileName)
        {

            FileStream inFileStream = new FileStream(src, FileMode.Open);
            //判斷上傳的遠端伺服器路徑是否存在
            if (!Directory.Exists(dst))
            {
                Directory.CreateDirectory(dst);
            }
            //上傳到遠端伺服器共享資料夾後文件的絕對路徑
            dst = dst + fileName;
            FileStream outFileStream = new FileStream(dst, FileMode.OpenOrCreate);
            byte[] buf = new byte[inFileStream.Length];
            int byteCount;
            while ((byteCount = inFileStream.Read(buf, 0, buf.Length)) > 0)
            {
                outFileStream.Write(buf, 0, byteCount);
            }

            inFileStream.Flush();
            inFileStream.Close();
            outFileStream.Flush();
            outFileStream.Close();
        }


        /// <summary>
        /// 將本地檔案上傳到遠端伺服器共享目錄(通過cmd命令方式)(發現存在許可權問題)
        /// </summary>
        /// <param name="srcBytes">本地檔案的檔案流陣列</param>
        /// <param name="targetPath">遠端伺服器共享檔案路徑目錄名</param>
        /// <param name="targetName">遠端伺服器共享檔案路徑名稱名</param>
        public static bool UploadLocalToRemote(byte[] srcBytes, string targetPath, string targetName)
        {
            bool result = false;
            try
            {
                //判斷上傳的遠端伺服器路徑是否存在
                if (!Directory.Exists(targetPath))
                {
                    Directory.CreateDirectory(targetPath);
                }
                //上傳到遠端伺服器共享資料夾後文件的絕對路徑
                string savePath = targetPath + "\\" + targetName;
                //寫入檔案流到檔案中
                FileStream fs = new FileStream(savePath, FileMode.OpenOrCreate, FileAccess.Write, FileShare.None, srcBytes.Length, false);
                fs.Write(srcBytes, 0, srcBytes.Length);
                fs.Flush();
                fs.Close();

                result = true;
            }
            catch (Exception ex)
            {
                result = false;
            }
            return result;
        }
   
        #endregion
       
    }

用vs2015執行後,測試基本沒問題,可以實現本地檔案的上傳和伺服器檔案的下載。

PS:但是部署到IIS測試時,總是出現拒絕訪問(無許可權)問題。可以參考我下一篇部落格:https://www.cnblogs.com/xielong/p/16202560.html