RaUI/Source/MyDb/RyWeb/WebDav.cs
zilinsoft 3262955f2f ### 2023-11-07更新
------
#### RaUIV4    V4.0.2311.0701
- *.[全新]整合了MyDb、ryControls、MyDb_MySQL等dll文件到RaUI一个项目。
- *.[新增]新增ApkOp类,可以轻松获取APK信息。
- *.[新增]新增JsonExt扩展类,让Json操作更简单。
- *.[新增]新增WebP类,可以支持webp格式的图片。
- *.[改进]ryQuickSQL中的AddField方法改为自动替换已存在的同名值。
- *.[修复]ryQuickSQL中的AddFieldCalc方法无法正常计算的BUG。
2023-11-07 16:37:53 +08:00

336 lines
12 KiB
C#

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Windows.Forms;
using System.Xml;
namespace RyWeb
{
/// <summary>
/// WebDav接口
/// </summary>
public class WebDav
{
private string _UserName = "";
private string _Password = "";
private string _WebDavUrl = "";
/// <summary>
/// WebDav初始化
/// </summary>
/// <param name="_WebDavUrl"></param>
/// <param name="_UserName"></param>
/// <param name="_Password"></param>
public WebDav(string _WebDavUrl, string _UserName, string _Password)
{
this._UserName = _UserName;
this._Password = _Password;
this._WebDavUrl = _WebDavUrl;
}
/// <summary>
/// 删除文件
/// </summary>
/// <param name="_WebFilePath">相对路径,不包括域名</param>
/// <returns></returns>
public int DelFile(string _WebFilePath)
{
try
{
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(new Uri(_WebDavUrl + "/" + _WebFilePath));
req.Credentials = new NetworkCredential(_UserName, _Password); //验证密码
req.PreAuthenticate = true;
req.Method = "DELETE";
//req.AllowWriteStreamBuffering = true;
req.GetResponse();
return 1;
}
catch { return 0; }
}
/// <summary>
/// 下载文件
/// </summary>
/// <param name="_WebFilePath"></param>
/// <param name="_SavePath"></param>
/// <returns></returns>
public int Download(string _WebFilePath, string _SavePath)
{
return Download(_WebFilePath, _SavePath,out _);
}
/// <summary>
/// 下载文件
/// </summary>
/// <param name="_WebFilePath"></param>
/// <param name="_SavePath"></param>
/// <param name="error"></param>
/// <returns></returns>
public int Download(string _WebFilePath,string _SavePath,out string error)
{
error = "";
try
{
System.Uri myURi = new System.Uri(_WebFilePath);
WebRequest req = WebRequest.Create(myURi);
req.Credentials = new NetworkCredential(_UserName, _Password); //验证密码
req.Method = "GET";
req.Timeout = System.Threading.Timeout.Infinite;
WebResponse res = req.GetResponse();
Stream inStream = res.GetResponseStream();
FileStream fs = new FileStream(_SavePath, FileMode.OpenOrCreate);
byte[] inData = new byte[4096];
int bytesRead = inStream.Read(inData, 0, inData.Length);
while (bytesRead > 0)
{
fs.Write(inData, 0, bytesRead);
bytesRead = inStream.Read(inData, 0, inData.Length);
}
fs.Close();
inStream.Close();
}
catch(Exception ex)
{
error = ex.Message;
return -1;
}
return 1;
}
/// <summary>
/// 上传文件
/// </summary>
/// <param name="_WebFilePath"></param>
/// <param name="_LocalFile"></param>
/// <returns></returns>
public int Upload(string _WebFilePath, string _LocalFile)
{
return Upload(_WebFilePath, _LocalFile,out _);
}
/// <summary>
/// 上传文件
/// </summary>
/// <param name="_WebFilePath"></param>
/// <param name="_LocalFile"></param>
/// <param name="error"></param>
/// <returns></returns>
public int Upload(string _WebFilePath, string _LocalFile,out string error)
{
error = "";
try
{
System.Net.HttpWebRequest req = (System.Net.HttpWebRequest)WebRequest.Create(new Uri(_WebDavUrl + "/" + _WebFilePath)); //Http和服务器交互
req.Credentials = new NetworkCredential(_UserName, _Password); //验证密码
req.PreAuthenticate = true;
req.Method = "PUT";//采用PUT方式
req.AllowWriteStreamBuffering = true;
Stream reqStream = req.GetRequestStream();
FileStream rdm = new FileStream(_LocalFile, FileMode.Open); //打开本地文件流
byte[] inData = new byte[4096];
int byteRead = rdm.Read(inData, 0, inData.Length); //二进制读文件
while (byteRead > 0)
{
reqStream.Write(inData, 0, byteRead); //响应流写入
byteRead = rdm.Read(inData, 0, inData.Length);
}
rdm.Close();
reqStream.Close();
req.GetResponse(); //提交
}
catch (Exception e)
{
error=e.Message;
return 0;
}
return 1; //正确返回
}
//----新建文件夾----
/// <summary>
/// 新建文件夹
/// </summary>
/// <param name="Path"></param>
/// <returns></returns>
public int CreateDir(string Path)
{
return CreateDir(Path, out _);
}
//----新建文件夾----
/// <summary>
/// 新建文件夹
/// </summary>
/// <param name="Path">文件夹路径</param>
/// <param name="error"></param>
/// <returns></returns>
public int CreateDir(string Path,out string error)
{
error = "";
var dir_split = Path.Split('/');
var path = "";
for (int i = 0; i < dir_split.Length; i++)
{
if (dir_split[i].Length == 0) { continue; }
if (path.Length > 0) { path += "/"; }
path += dir_split[i];
_createdir(path, out var _error);
if(_error.Length>0)
{
error = _error;
}
}
if (error.Length == 0)
{
return 1;
}
else
{
return 0;
}
}
//----新建文件夾----
/// <summary>
/// 新建文件夹
/// </summary>
/// <param name="Path"></param>
/// <param name="error"></param>
/// <returns></returns>
private int _createdir(string Path, out string error)
{
error = "";
try
{
// Create the HttpWebRequest object.
System.Net.HttpWebRequest req = (System.Net.HttpWebRequest)WebRequest.Create(new Uri(_WebDavUrl + "/" + Path)); //Http和服务器交互
req.Credentials = new NetworkCredential(_UserName, _Password); //验证密码
// Specify the method.
req.Method = "MKCOL";
HttpWebResponse objResponse = (System.Net.HttpWebResponse)req.GetResponse();
// Close the HttpWebResponse object.
objResponse.Close();
return 1;
}
catch (Exception ex)
{
error = ex.Message;
return 0;
}
}
/// <summary>
///将文件或目录列出来
/// </summary>
/// <param name="Path"></param>
/// <param name="deep"></param>
/// <returns></returns>
public SortedList<string, ServerFileAttributes> GetContents(string Path, bool deep)
{
var uri = new Uri(_WebDavUrl + "/" + Path);
HttpWebRequest _httpWebRequest = (HttpWebRequest)HttpWebRequest.Create(uri);
_httpWebRequest.Headers.Add("Translate: f");
_httpWebRequest.Credentials = new NetworkCredential(_UserName, _Password); //验证密码
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.UTF8.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[] { '/' }) != uri.AbsoluteUri.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;
}
}
/// <summary>
/// 定义每个文件或目录的属性
/// </summary>
public struct ServerFileAttributes
{
/// <summary>
/// 文件名
/// </summary>
public string Name;
/// <summary>
/// 是否是文件夹
/// </summary>
public bool IsFolder;
/// <summary>
/// 网址
/// </summary>
public string Url;
/// <summary>
/// 最后修改时间
/// </summary>
public DateTime LastModified;
}
}