using System; using System.Collections.Generic; using System.Drawing; using System.IO; using System.Linq; using System.Net.Sockets; using System.Text; namespace HslCommunication.Enthernet { /// /// 与服务器文件引擎交互的客户端类,支持操作Advanced引擎和Ultimate引擎 /// public class IntegrationFileClient : FileClientBase { #region Constructor /// /// 实例化一个对象 /// public IntegrationFileClient() { } #endregion #region Delete File /// /// 删除服务器的文件操作 /// /// 文件名称,带后缀 /// 第一大类 /// 第二大类 /// 第三大类 /// public OperateResult DeleteFile( string fileName, string factory, string group, string id ) { return DeleteFileBase( fileName, factory, group, id ); } #endregion #region Download File /// /// 下载服务器的文件到本地的文件操作 /// /// 文件名称,带后缀 /// 第一大类 /// 第二大类 /// 第三大类 /// 下载的进度报告 /// 准备本地保存的名称 /// public OperateResult DownloadFile( string fileName, string factory, string group, string id, Action processReport, string fileSaveName ) { return DownloadFileBase( factory, group, id, fileName, processReport, fileSaveName ); } /// /// 下载服务器的文件到本地的数据流中 /// /// 文件名称,带后缀 /// 第一大类 /// 第二大类 /// 第三大类 /// 下载的进度报告 /// 流数据 /// public OperateResult DownloadFile( string fileName, string factory, string group, string id, Action processReport, Stream stream ) { return DownloadFileBase( factory, group, id, fileName, processReport, stream ); } /// /// 下载服务器的文件到本地的数据流中 /// /// 文件名称,带后缀 /// 第一大类 /// 第二大类 /// 第三大类 /// 下载的进度报告 /// 内存文件 /// public OperateResult DownloadFile( string fileName, string factory, string group, string id, Action processReport, out Bitmap bitmap ) { MemoryStream stream = new MemoryStream( ); OperateResult result = DownloadFileBase( factory, group, id, fileName, processReport, stream ); if (result.IsSuccess) { bitmap = new Bitmap( stream ); } else { bitmap = null; result.IsSuccess = false; } stream.Dispose( ); return result; } #endregion #region Upload File /// /// 上传本地的文件到服务器操作 /// /// 本地的完整路径的文件名称 /// 服务器存储的文件名称,带后缀 /// 第一大类 /// 第二大类 /// 第三大类 /// 文件的额外描述 /// 文件的上传人 /// 上传的进度报告 /// public OperateResult UploadFile( string fileName, string serverName, string factory, string group, string id, string fileTag, string fileUpload, Action processReport ) { return UploadFileBase( fileName, serverName, factory, group, id, fileTag, fileUpload, processReport ); } /// /// 上传数据流到服务器操作 /// /// 数据流内容 /// 服务器存储的文件名称,带后缀 /// 第一大类 /// 第二大类 /// 第三大类 /// 文件的额外描述 /// 文件的上传人 /// 上传的进度报告 /// public OperateResult UploadFile( Stream stream, string serverName, string factory, string group, string id, string fileTag, string fileUpload, Action processReport ) { return UploadFileBase( stream, serverName, factory, group, id, fileTag, fileUpload, processReport ); } /// /// 上传内存图片到服务器操作 /// /// 内存图片,不能为空 /// 服务器存储的文件名称,带后缀 /// 第一大类 /// 第二大类 /// 第三大类 /// 文件的额外描述 /// 文件的上传人 /// 上传的进度报告 /// /// public OperateResult UploadFile( Bitmap bitmap, string serverName, string factory, string group, string id, string fileTag, string fileUpload, Action processReport ) { MemoryStream stream = new MemoryStream( ); if (bitmap.RawFormat != null) bitmap.Save( stream, bitmap.RawFormat ); else bitmap.Save( stream, System.Drawing.Imaging.ImageFormat.Bmp ); OperateResult result = UploadFileBase( stream, serverName, factory, group, id, fileTag, fileUpload, processReport ); stream.Dispose( ); return result; } #endregion #region Private Method /// /// 根据三种分类信息,还原成在服务器的相对路径,包含文件 /// /// 文件名称,包含后缀名 /// 第一类 /// 第二类 /// 第三类 /// private string TranslateFileName( string fileName, string factory, string group, string id ) { string file_save_server_name = fileName; if (id.IndexOf( '\\' ) >= 0) id = id.Replace( '\\', '_' ); if (group.IndexOf( '\\' ) >= 0) group = id.Replace( '\\', '_' ); if (factory.IndexOf( '\\' ) >= 0) id = factory.Replace( '\\', '_' ); if (id?.Length > 0) file_save_server_name = id + @"\" + file_save_server_name; if (group?.Length > 0) file_save_server_name = group + @"\" + file_save_server_name; if (factory?.Length > 0) file_save_server_name = factory + @"\" + file_save_server_name; return file_save_server_name; } /// /// 根据三种分类信息,还原成在服务器的相对路径,仅仅路径 /// /// 第一类 /// 第二类 /// 第三类 /// private string TranslatePathName( string factory, string group, string id ) { string file_save_server_name = ""; if (id.IndexOf( '\\' ) >= 0) id = id.Replace( '\\', '_' ); if (group.IndexOf( '\\' ) >= 0) group = id.Replace( '\\', '_' ); if (factory.IndexOf( '\\' ) >= 0) id = factory.Replace( '\\', '_' ); if (id?.Length > 0) file_save_server_name = @"\" + id; if (group?.Length > 0) file_save_server_name = @"\" + group + file_save_server_name; if (factory?.Length > 0) file_save_server_name = @"\" + factory + file_save_server_name; return file_save_server_name; } #endregion #region Get FileNames /// /// 获取指定路径下的所有的文档 /// /// 获取得到的文件合集 /// 第一大类 /// 第二大类 /// 第三大类 /// public OperateResult DownloadPathFileNames( out GroupFileItem[] fileNames, string factory, string group, string id ) { return DownloadStringArrays( out fileNames, HslProtocol.ProtocolFileDirectoryFiles, factory, group, id ); } #endregion #region Get FolderNames /// /// 获取指定路径下的所有的文档 /// /// /// /// /// /// public OperateResult DownloadPathFolders( out string[] folders, string factory, string group, string id ) { return DownloadStringArrays( out folders, HslProtocol.ProtocolFileDirectories, factory, group, id ); } #endregion #region Private Method /// /// 获取指定路径下的所有的文档 /// /// 想要获取的队列 /// 指令 /// 第一大类 /// 第二大类 /// 第三大类 /// 数组的类型 /// private OperateResult DownloadStringArrays( out T[] arrays, int protocol, string factory, string group, string id ) { OperateResult result = new OperateResult( ); // 连接服务器 // connect server OperateResult socketResult = CreateSocketAndConnect( ServerIpEndPoint, ConnectTimeOut ); if (!socketResult.IsSuccess) { arrays = new T[0]; return socketResult; } // 上传信息 OperateResult send = SendStringAndCheckReceive( socketResult.Content, protocol, "nosense" ); if (!send.IsSuccess) { arrays = new T[0]; return send; } // 上传三级分类 OperateResult sendClass = SendFactoryGroupId( socketResult.Content, factory, group, id ); if (!sendClass.IsSuccess) { arrays = new T[0]; return sendClass; } // 接收数据信息 OperateResult receive = ReceiveStringContentFromSocket( socketResult.Content ); if(!receive.IsSuccess) { arrays = new T[0]; return receive; } socketResult.Content?.Close( ); // 数据转化 try { arrays = Newtonsoft.Json.Linq.JArray.Parse( receive.Content2 ).ToObject( ); return OperateResult.CreateSuccessResult( ); } catch(Exception ex) { arrays = new T[0]; return new OperateResult( ) { Message = ex.Message }; } } #endregion } }