最近公司有客戶要求要做一個將本地文件上傳到遠程服務器的制定目錄(服務器是開放了共享文件的讀寫權限)
首先先確認共享文件的路徑有沒有問題
在運行框中輸入共享文件的路徑,如: \\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