使用C#WebClient类访问(上传/下载/删除/列出文件目录)

在使用WebClient类之前,必须先引用System.Net命名空间,文件下载、上传与删除的都是使用异步编程,也可以使用同步编程,

这里以异步编程为例:

1)文件下载:

        static void Main(string[] args)
        {
            //定义_webClient对象
            WebClient _webClient = new WebClient();
            //使用默认的凭据——读取的时候,只需默认凭据就可以
            _webClient.Credentials = CredentialCache.DefaultCredentials;
            //下载的链接地址(文件服务器)
            Uri _uri = new Uri(@"http://192.168.1.103");
            //注册下载进度事件通知
            _webClient.DownloadProgressChanged += _webClient_DownloadProgressChanged;
            //注册下载完成事件通知
            _webClient.DownloadFileCompleted += _webClient_DownloadFileCompleted;
            //异步下载到D盘
            _webClient.DownloadFileAsync(_uri, @"D:\test.xlsx");
            Console.ReadKey();
        }

        //下载完成事件处理程序
        private static void _webClient_DownloadFileCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
        {
            Console.WriteLine("Download Completed...");
        }

        //下载进度事件处理程序
        private static void _webClient_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
        {
            Console.WriteLine($"{e.ProgressPercentage}:{e.BytesReceived}/{e.TotalBytesToReceive}");
        }

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;
        }
    }

  

原文地址:https://www.cnblogs.com/lgx5/p/10242560.html

时间: 2024-10-07 23:53:38

使用C#WebClient类访问(上传/下载/删除/列出文件目录)的相关文章

使用C#WebClient类访问(上传/下载/删除/列出文件目录)由IIS搭建的http文件服务器

前言 为什么要写这边博文呢?其实,就是使用C#WebClient类访问由IIS搭建的http文件服务器的问题花了我足足两天的时间,因此,有必要写下自己所学到的,同时,也能让广大的博友学习学习一下. 本文足如有不足之处,请在下方留言提出,我会进行改正的,谢谢! 搭建IIS文件服务器 本博文使用的操作系统为Windows 10 企业版,其他Windows系统类似,请借鉴: 一.当然,开始肯定没有IIS,那该怎么办?需要一个软件环境进行搭建,具体方法如下: 1)打开“控制面板”,找到“程序与功能”,如

[C#]工具类—FTP上传下载

public class FtpHelper { /// <summary> /// ftp方式上传 /// </summary> public static int UploadFtp(string filePath, string filename, string ftpServerIP, string ftpUserID, string ftpPassword) { FileInfo fileInf = new FileInfo(filePath + "\\&quo

Struts2 文件上传,下载,删除

本文介绍了: 1.基于表单的文件上传 2.Struts 2 的文件下载 3.Struts2.文件上传 4.使用FileInputStream FileOutputStream文件流来上传 5.使用FileUtil上传 6.使用IOUtil上传 7.使用IOUtil上传 8.使用数组上传多个文件 9.使用List上传多个文件 ----1.基于表单的文件上传----- fileupload.jsp <body> <form action="showFile.jsp" na

用jsch.jar实现SFTP上传下载删除

java类: 需要引用的jar: jsch-0.1.53.jar package com.isoftstone.www.ftp; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.util.Properties; import java.util.Vector; import com.jcraft.jsch.Channel; import com.jc

java操作FTP,实现文件上传下载删除操作

上传文件到FTP服务器: /** * Description: 向FTP服务器上传文件 * @param url FTP服务器hostname * @param port FTP服务器端口,如果默认端口请写-1 * @param username FTP登录账号 * @param password FTP登录密码 * @param path FTP服务器保存目录 * @param filename 上传到FTP服务器上的文件名 * @param input 输入流 * @return 成功返回t

apache FtpClient上传下载删除文件夹及文件

/* * 文件名:FtpUtil.java * 描述:FTP操作 * 修改时间2014-08-10 */ import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.text.SimpleDateFormat; import jav

图片上传-下载-删除等图片管理的若干经验总结

图片上传功能很常见,很多人都觉得这个功能很简单,随着要求的提高,这个图片小系统也真是复杂啊. 需求1: 上传,未了达到"大容量存储"."负载均衡"."性能好","有技术含量"等装逼需求,采用了Fastdfs. 注:FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理. 功能包括:文件存储.文件同步.文件访问(文件上传.文件下载)等,解决了大容量存储和负载均衡的问题. 特别适合以文件为载体的在线服务,如相册网站.视频

java 通过sftp服务器上传下载删除文件

最近做了一个sftp服务器文件下载的功能,mark一下: 首先是一个SftpClientUtil 类,封装了对sftp服务器文件上传.下载.删除的方法 import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.util.ArrayList; import java.util.Iterator; impor

文件上传下载删除

<form action="newFile" method="post" enctype="multipart/form-data"> <input type="file" name="file"> <input type="submit" value="上传"> </form> <a href="dow