使用C#WebClient類訪問(上傳/下載/刪除/列出文件目錄)由IIS搭建的http文件伺服器

来源:http://www.cnblogs.com/cncc/archive/2016/07/31/5722231.html
-Advertisement-
Play Games

本文介紹的是如何使用C#訪問由IIS搭建的http文件伺服器,訪問包括:下載、上傳、刪除及列出文件(或目錄) ...


前言

 為什麼要寫這邊博文呢?其實,就是使用C#WebClient類訪問由IIS搭建的http文件伺服器的問題花了我足足兩天的時間,因此,有必要寫下自己所學到的,同時,也能讓廣大的博友學習學習一下。

本文足如有不足之處,請在下方留言提出,我會進行改正的,謝謝!

 

搭建IIS文件伺服器

本博文使用的操作系統為Windows 10 企業版,其他Windows系統類似,請借鑒:

一、當然,開始肯定沒有IIS,那該怎麼辦?需要一個軟體環境進行搭建,具體方法如下:

1)打開“控制面板”,找到“程式與功能”,如下圖所示:

2)點進去之後,找到“啟用或關閉Windows功能”,如下圖所示:

3)點進去之後,將“Internet Information Services”下所有節點都打勾(這樣就搭建了一個功能完全的HTTP/FTP伺服器),註意“WebDAV發佈”必須要安裝,這個跟文件伺服器中文件訪問許可權有著很大的關係,如果想對伺服器中某個具有讀寫許可權的文件夾進行讀寫,就必須開啟該選項,如下圖所示:

4)等待安裝完畢,請耐心等待, 如下圖所示:

5)完成之後,點擊“關閉”按鈕即可,然後,打開“控制面板”,找到“管理工具”,如下圖所示:

 

6)點擊“管理工具”後,找到“Internet Information Services (IIS)管理器”,打開它,如下圖所示:

 

7)進去之後,就已經進入了IIS的管理界面,我們只用到的功能為紅色框內的IIS功能,如下圖所示:

8)第一搭建IIS,會出現一個預設的Web網站,我們將滑鼠移到“Default Web Site”上方,右鍵彈出菜單,在菜單中點擊“刪除”將該網站刪除,如下圖所示:

 

9)添加自己的一個網站,滑鼠移到“網站”上方,右鍵點擊滑鼠,彈出菜單,在菜單中點擊“添加網站”,如下圖所示:

10)根據如下圖所說的步驟,填寫網站名稱及選擇物理路徑,其他預設即可,然後點擊“確定”按鈕:

 

11)本網站僅作為文件伺服器,因此,將伺服器的文件瀏覽功能打開,以便瀏覽,具體操作為滑鼠雙擊“目錄瀏覽”後,將“操作”一欄里的“啟用”打開,如下圖所示:

12)滑鼠雙擊“WebDAV創作規則”,如下圖所示:

13)點擊“WebDAV設置”,如下圖所示:

 

 

 14)將①②所示紅色框內的屬性設置為圖中所示的屬性,並點擊“應用”,如下圖所示:

15)返回到“WebDAV創作規則”,點擊“添加創作規則”,如下圖所示:

16)在彈出的“添加創作規則”,將“允許訪問此內容”選中,許可權“讀取、源、寫入”都打勾,點擊“確定”按鈕關閉,如下圖所示:

 

 17)返回到“WebDAV創作規則”,點擊“啟用WebDAV”,如下圖所示:

 

 18)雙擊“身份驗證”,將“匿名身份驗證”(客戶端讀取文件)及“Windows身份驗證”(客戶端寫入、刪除)啟用,如下所示:

 

19)為了能讓文件伺服器具有寫入、刪除功能,可以在現有Windows系統賬戶上新建一個隸屬於“Power Users”的賬戶“test”(密碼:123),如下圖所示:

以上關於如何創建賬戶的內容,請自行百度

20)為了能讓test賬戶順利訪問存放於E盤下的“TestWebSite”文件夾,需要為該文件夾設置Power Users組的訪問許可權,如下圖所示:

關於如何將特定組或用戶設置許可權的問題,請自行百度

21)查看本機IIS的IP地址,併在瀏覽器輸入該IP,將會顯示以下內容,如下圖所示:

22)自此,IIS文件伺服器的搭建已經完畢。

 

使用C#WebClient訪問IIS文件伺服器

 

本博文使用的的IDE為VS2015,在使用WebClient類之前,必須先引用System.Net命名空間,文件下載、上傳與刪除的都是使用非同步編程,也可以使用同步編程,

這裡以非同步編程為例:

1)文件下載:

 1         static void Main(string[] args)
 2         {
 3             //定義_webClient對象
 4             WebClient _webClient = new WebClient();
 5             //使用預設的憑據——讀取的時候,只需預設憑據就可以
 6             _webClient.Credentials = CredentialCache.DefaultCredentials;
 7             //下載的鏈接地址(文件伺服器)
 8             Uri _uri = new Uri(@"http://192.168.1.103/test.doc");
 9             //註冊下載進度事件通知
10             _webClient.DownloadProgressChanged += _webClient_DownloadProgressChanged;
11             //註冊下載完成事件通知
12             _webClient.DownloadFileCompleted += _webClient_DownloadFileCompleted;
13             //非同步下載到D盤
14             _webClient.DownloadFileAsync(_uri, @"D:\test.doc");
15             Console.ReadKey();
16         }
17 
18         //下載完成事件處理程式
19         private static void _webClient_DownloadFileCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
20         {
21             Console.WriteLine("Download Completed...");
22         }
23 
24         //下載進度事件處理程式
25         private static void _webClient_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
26         {
27             Console.WriteLine($"{e.ProgressPercentage}:{e.BytesReceived}/{e.TotalBytesToReceive}");   
28         }

運行結果如下:

2)文件上傳:

        static void Main(string[] args)
        {
            //定義_webClient對象
            WebClient _webClient = new WebClient();
            //使用Windows登錄方式
            _webClient.Credentials = new NetworkCredential("test", "123");
            //上傳的鏈接地址(文件伺服器)
            Uri _uri = new Uri(@"http://192.168.1.103/test.doc");
            //註冊上傳進度事件通知
            _webClient.UploadProgressChanged += _webClient_UploadProgressChanged;
            //註冊上傳完成事件通知
            _webClient.UploadFileCompleted += _webClient_UploadFileCompleted;
            //非同步從D盤上傳文件到伺服器
            _webClient.UploadFileAsync(_uri,"PUT", @"D:\test.doc");
            Console.ReadKey();
        }
        //下載完成事件處理程式
        private static void _webClient_UploadFileCompleted(object sender, UploadFileCompletedEventArgs e)
        {
            Console.WriteLine("Upload Completed...");
        }

        //下載進度事件處理程式
        private static void _webClient_UploadProgressChanged(object sender, UploadProgressChangedEventArgs e)
        {
            Console.WriteLine($"{e.ProgressPercentage}:{e.BytesSent}/{e.TotalBytesToSend}");
        }

運行結果如下:

3)文件刪除:

        static void Main(string[] args)
        {
            //定義_webClient對象
            WebClient _webClient = new WebClient();
            //使用Windows登錄方式
            _webClient.Credentials = new NetworkCredential("test", "123");
            //待刪除的文件鏈接地址(文件伺服器)
            Uri _uri = new Uri(@"http://192.168.1.103/test.doc");
            //註冊刪除完成時的事件(模擬刪除)
            _webClient.UploadDataCompleted += _webClient_UploadDataCompleted;
            //非同步從文件(模擬)刪除文件
            _webClient.UploadDataAsync(_uri, "DELETE", new byte[0]);
            Console.ReadKey();
        }
        //刪除完成事件處理程式
        private static void _webClient_UploadDataCompleted(object sender, UploadDataCompletedEventArgs e)
        {
            Console.WriteLine("Deleted...");
        }

運行結果如下:

4)列出文件(或目錄):

 需引入命名空間:System.IO、System.Xml及System.Globalization

        static void Main(string[] args)
        {

            SortedList<string, ServerFileAttributes> _results =GetContents(@"http://192.168.1.103", true);
            //在控制台輸出文件(或目錄)信息:
            foreach(var _r in _results)
            {
                Console.WriteLine($"{_r.Key}:\r\nName:{_r.Value.Name}\r\nIsFolder:{_r.Value.IsFolder}");
                Console.WriteLine($"Value:{_r.Value.Url}\r\nLastModified:{_r.Value.LastModified}");
                Console.WriteLine();
            }

            Console.ReadKey();
        }

        //定義每個文件或目錄的屬性
        struct ServerFileAttributes
        {
            public string Name;
            public bool IsFolder;
            public string Url;
            public DateTime LastModified;
        }

        //將文件或目錄列出來
        static SortedList<string, ServerFileAttributes> GetContents(string serverUrl, bool deep)
        {
            HttpWebRequest _httpWebRequest = (HttpWebRequest)HttpWebRequest.Create(serverUrl);
            _httpWebRequest.Headers.Add("Translate: f");
            _httpWebRequest.Credentials = CredentialCache.DefaultCredentials;

            string _requestString = @"<?xml version=""1.0"" encoding=""utf-8""?>" +
                  @"<a:propfind xmlns:a=""DAV:"">" +
                  "<a:prop>" +
                  "<a:displayname/>" +
                  "<a:iscollection/>" +
                  "<a:getlastmodified/>" +
                  "</a:prop>" +
                  "</a:propfind>";

            _httpWebRequest.Method = "PROPFIND";
            if (deep == true)
                _httpWebRequest.Headers.Add("Depth: infinity");
            else
                _httpWebRequest.Headers.Add("Depth: 1");
            _httpWebRequest.ContentLength = _requestString.Length;
            _httpWebRequest.ContentType = "text/xml";

            Stream _requestStream = _httpWebRequest.GetRequestStream();
            _requestStream.Write(Encoding.ASCII.GetBytes(_requestString), 0, Encoding.ASCII.GetBytes(_requestString).Length);
            _requestStream.Close();

            HttpWebResponse _httpWebResponse;
            StreamReader _streamReader;
            try
            {
                _httpWebResponse = (HttpWebResponse)_httpWebRequest.GetResponse();
                _streamReader = new StreamReader(_httpWebResponse.GetResponseStream());
            }
            catch (WebException ex)
            {
                throw ex;
            }

            StringBuilder _stringBuilder = new StringBuilder();

            char[] _chars = new char[1024];
            int _bytesRead = 0;

            _bytesRead = _streamReader.Read(_chars, 0, 1024);

            while (_bytesRead > 0)
            {
                _stringBuilder.Append(_chars, 0, _bytesRead);
                _bytesRead = _streamReader.Read(_chars, 0, 1024);
            }
            _streamReader.Close();

            XmlDocument _xmlDocument = new XmlDocument();
            _xmlDocument.LoadXml(_stringBuilder.ToString());

            XmlNamespaceManager _xmlNamespaceManager = new XmlNamespaceManager(_xmlDocument.NameTable);
            _xmlNamespaceManager.AddNamespace("a", "DAV:");

            XmlNodeList _nameList = _xmlDocument.SelectNodes("//a:prop/a:displayname", _xmlNamespaceManager);
            XmlNodeList _isFolderList = _xmlDocument.SelectNodes("//a:prop/a:iscollection", _xmlNamespaceManager);
            XmlNodeList _lastModifyList = _xmlDocument.SelectNodes("//a:prop/a:getlastmodified", _xmlNamespaceManager);
            XmlNodeList _hrefList = _xmlDocument.SelectNodes("//a:href", _xmlNamespaceManager);

            SortedList<string, ServerFileAttributes> _sortedListResult = new SortedList<string, ServerFileAttributes>();
            ServerFileAttributes _serverFileAttributes;

            for (int i = 0; i < _nameList.Count; i++)
            {
                if (_hrefList[i].InnerText.ToLower(new CultureInfo("en-US")).TrimEnd(new char[] { '/' }) != serverUrl.ToLower(new CultureInfo("en-US")).TrimEnd(new char[] { '/' }))
                {
                    _serverFileAttributes = new ServerFileAttributes();
                    _serverFileAttributes.Name = _nameList[i].InnerText;
                    _serverFileAttributes.IsFolder = Convert.ToBoolean(Convert.ToInt32(_isFolderList[i].InnerText));
                    _serverFileAttributes.Url = _hrefList[i].InnerText;
                    _serverFileAttributes.LastModified = Convert.ToDateTime(_lastModifyList[i].InnerText);
                    _sortedListResult.Add(_serverFileAttributes.Url, _serverFileAttributes);
                }
            }
            return _sortedListResult;
        }

 

運行結果如下:

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 關鍵詞: .bind() .unbind() .css() .hasclass() .removeclass .parent() .children() .html() .hide() .show() .attr() .val() .unbind() .bind()的使用 .css的使用 .pare ...
  • 解決辦法放在最前面,方便急需答案的同學: 創建了ftp使用的windows賬戶後,一定要給該賬戶添加ftp目錄的許可權,如下圖所示,為新賬戶添加許可權後(且設置了“ftp身份驗證”),即可正常訪問ftp: 說完解決方案,再聽我從頭道來: 要在一臺windows server 2008上部署一個支持匿名訪 ...
  • ASP.NET Core應用中使用得最多的還是具體的物理文件,比如配置文件、View文件以及網頁上的靜態文件,物理文件系統的抽象通過PhysicalFileProvider這個FileProvider來實現,該類型定義在NuGet包“Microsoft.Extensions.FileProvider... ...
  • `dotnet build` 命令從源項目中的多個源文件及其依賴成生成一個二進位文件。預設情況下,該二進位文件將在中間語言(IL)中,並且將有一個 DLL 擴展。`dotnet build` 也將生成一個宿主應用程式運行需要的 `\*.deps` 大綱文件。 ...
  • 函數或者說方法都是寫在類下的,我們可以通過函數名來調用它們。首先,我們要弄清楚為什麼會有函數或者說方法這種東西?這裡,我們使用了與前一篇同樣的思維方式,先從它的目的或者實用價值出發。當我們在編寫程式的時候,有時會遇到這樣的情況。比如說,求某個數的階乘。我們會寫出一連串的語句,以得到我們的結果。可是, ...
  • 這是反序列化的代碼 序列化 using Newtonsoft.Json;using Newtonsoft.Json.Linq; using System.Runtime.Serialization;using System.Runtime.Serialization.Json; 為了方便隨時調用 ...
  • .net core中有哪些被拋棄的類 1、DataTable DataRow SqlDataAdapter DataRow DataColumn DataColumn 雖然這些類不是我ORM核心功能,但是為了保證非Core版本的ORM和Core的語法要一致方便以後升級 於是我就有了一個想法將他們複活 ...
  • 使用方法: ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...