唐山轨道机控制端TCP服务
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

232 lines
8.7 KiB

8 months ago
using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Threading.Tasks;
using WebDav;
using System.Web;
using System.Net.Http;
namespace EGFramework{
public class EGWebDav : IModule
{
public string ServerUrl { set; get; } = "";
private string UserName { set; get; } = "";
private string Password { set; get; } = "";
public bool IsInit { set; get; }
private WebDavClient WebDavClient { set; get; }
private string CurrentPath { set; get; } = "/";
public List<WebDavFileMsg> CurrentFileList { set; get; } = new List<WebDavFileMsg>();
public void Init()
{
}
public IArchitecture GetArchitecture()
{
return EGArchitectureImplement.Interface;
}
public void InitClient(string serverUrl, string userName,string password){
this.ServerUrl = serverUrl;
this.UserName = userName;
this.Password = password;
Dictionary<string,string> headersAdd = new Dictionary<string, string>
{
{ "Connection", "keep-alive" },
{ "Authorization", "Basic "+ EGWebDavExtension.EncodeCredentials(userName,password) }
};
WebDavClient = new WebDavClient(new WebDavClientParams
{
BaseAddress = new Uri(ServerUrl),
Credentials = new NetworkCredential(userName, password),
DefaultRequestHeaders = headersAdd
});
Console.WriteLine("Client has been init");
}
//---------download or upload from WebDav server---------//
/// <summary>
/// Download a file from dav path
/// </summary>
/// <param name="downloadUri">Such as /dav/Picture/Picture1.jpg</param>
/// <param name="localPath">download destination,such as C:\Users\W35\Pictures</param>
/// <param name="fileName">you can define file by this name,or by uri</param>
/// <returns></returns>
public async Task<bool> DownloadFile(string downloadUri,string localPath,string fileName = ""){
if (fileName.Equals("")){
fileName = Path.GetFileName(downloadUri);
}
using (var response = await WebDavClient.GetRawFile(downloadUri))
{
if(response.IsSuccessful == true){
// use response.Stream
using (FileStream DestinationStream = File.Create(localPath + "/" + fileName))
{
await response.Stream.CopyToAsync(DestinationStream);
//Print("【WebDav】" + fileName + "下载成功!");
}
return true;
}else{
return false;
}
}
}
public async Task<bool> DownloadFilProcessed(string downloadUri,string localPath,string fileName = ""){
if (fileName.Equals("")){
fileName = Path.GetFileName(downloadUri);
}
using (var response = await WebDavClient.GetProcessedFile(downloadUri))
{
if(response.IsSuccessful == true){
// use response.Stream
using (FileStream DestinationStream = File.Create(localPath + "/" + fileName))
{
await response.Stream.CopyToAsync(DestinationStream);
//Print("【WebDav】" + fileName + "下载成功!");
}
return true;
}else{
return false;
}
}
}
/// <summary>
/// Upload a file by localUrl
/// </summary>
/// <param name="localUrl">Such as C:\Users\W35\Pictures\Picture1.jpg</param>
/// <param name="uploadPath">upload destination,such as /dav/Picture</param>
/// <param name="fileName">you can define file by this name,or by local url</param>
/// <returns></returns>
public async Task<bool> UploadFile(string localUrl,string uploadPath,string fileName = ""){
if (fileName.Equals("")){
fileName = Path.GetFileName(localUrl);
}
// use response.Stream
var result = await WebDavClient.PutFile(uploadPath+"/"+fileName, File.OpenRead(localUrl));
if(result.IsSuccessful){
return true;
}else{
return false;
}
}
//-----------operate disk-----------//
/// <summary>
/// Default root path is "/",any path should be start with "/"
/// </summary>
/// <param name="currentPath"></param>
/// <returns></returns>
public async Task<List<WebDavFileMsg>> GetList(string currentPath){
PropfindResponse result = await WebDavClient.Propfind(ServerUrl+currentPath);
List<WebDavFileMsg> ResultFileList = new List<WebDavFileMsg>();
if (result.IsSuccessful)
{
foreach (WebDavResource res in result.Resources)
{
ResultFileList.Add(new WebDavFileMsg{
FileName = res.DisplayName ,
IsCollection = res.IsCollection ,
ContentLength = res.ContentLength ,
Uri = res.Uri ,
LastUpdateTime = res.LastModifiedDate
});
}
}
return ResultFileList;
}
/// <summary>
/// simple CD command, prop find all file message to CurrentFileList.
/// </summary>
/// <param name="destinationPath"></param>
/// <returns></returns>
public async Task ChangeDictionary(string destinationPath){
CurrentPath = destinationPath;
PropfindResponse result = await WebDavClient.Propfind(ServerUrl+CurrentPath);
CurrentFileList.Clear();
if (result.IsSuccessful)
{
foreach (WebDavResource res in result.Resources)
{
CurrentFileList.Add(new WebDavFileMsg{
FileName = res.DisplayName ,
IsCollection = res.IsCollection ,
ContentLength = res.ContentLength ,
Uri = res.Uri ,
LastUpdateTime = res.LastModifiedDate
});
}
}
}
/// <summary>
/// create a directory
/// </summary>
/// <param name="dictionaryName"></param>
/// <returns></returns>
public async Task MakeDictionary(string dictionaryName){
await WebDavClient.Mkcol(dictionaryName);
}
/// <summary>
/// simple cp command, copy a file with differentName.
/// </summary>
/// <param name="sourceFile"></param>
/// <param name="copyFile"></param>
/// <returns></returns>
public async Task Copy(string sourceFile,string copyFile){
await WebDavClient.Copy(sourceFile,copyFile);
}
/// <summary>
/// simple mv command, move a file with change fileName or different path.
/// </summary>
/// <param name="sourceFile"></param>
/// <param name="moveFile"></param>
/// <returns></returns>
public async Task Move(string sourceFile,string moveFile){
await WebDavClient.Move(sourceFile,moveFile);
}
/// <summary>
/// simple rm command,delete a file.
/// </summary>
/// <param name="fileName"></param>
/// <returns></returns>
public async Task Remove(string fileName){
await WebDavClient.Delete(fileName);
}
}
public struct WebDavFileMsg{
public string FileName { set; get; }
public bool IsCollection { set; get; }
/// <summary>
/// unit is kb
/// </summary>
public long? ContentLength { set; get; }
public string Uri { set; get; }
public DateTime? LastUpdateTime { set; get; }
}
public static class EGWebDavExtension{
public static EGWebDav EGWebDav(this IEGFramework self)
{
return EGArchitectureImplement.Interface.GetModule<EGWebDav>();
}
public static string EncodeCredentials(string username, string password)
{
string credentials = $"{username}:{password}";
byte[] credentialsBytes = System.Text.Encoding.UTF8.GetBytes(credentials);
string encodedCredentials = Convert.ToBase64String(credentialsBytes);
return encodedCredentials;
}
}
}