IntegrationFileClient.cs 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Drawing;
  4. using System.IO;
  5. using System.Linq;
  6. using System.Net.Sockets;
  7. using System.Text;
  8. namespace HslCommunication.Enthernet
  9. {
  10. /// <summary>
  11. /// 与服务器文件引擎交互的客户端类,支持操作Advanced引擎和Ultimate引擎
  12. /// </summary>
  13. public class IntegrationFileClient : FileClientBase
  14. {
  15. #region Constructor
  16. /// <summary>
  17. /// 实例化一个对象
  18. /// </summary>
  19. public IntegrationFileClient()
  20. {
  21. }
  22. #endregion
  23. #region Delete File
  24. /// <summary>
  25. /// 删除服务器的文件操作
  26. /// </summary>
  27. /// <param name="fileName">文件名称,带后缀</param>
  28. /// <param name="factory">第一大类</param>
  29. /// <param name="group">第二大类</param>
  30. /// <param name="id">第三大类</param>
  31. /// <returns></returns>
  32. public OperateResult DeleteFile(
  33. string fileName,
  34. string factory,
  35. string group,
  36. string id )
  37. {
  38. return DeleteFileBase( fileName, factory, group, id );
  39. }
  40. #endregion
  41. #region Download File
  42. /// <summary>
  43. /// 下载服务器的文件到本地的文件操作
  44. /// </summary>
  45. /// <param name="fileName">文件名称,带后缀</param>
  46. /// <param name="factory">第一大类</param>
  47. /// <param name="group">第二大类</param>
  48. /// <param name="id">第三大类</param>
  49. /// <param name="processReport">下载的进度报告</param>
  50. /// <param name="fileSaveName">准备本地保存的名称</param>
  51. /// <returns></returns>
  52. public OperateResult DownloadFile(
  53. string fileName,
  54. string factory,
  55. string group,
  56. string id,
  57. Action<long, long> processReport,
  58. string fileSaveName
  59. )
  60. {
  61. return DownloadFileBase( factory, group, id, fileName, processReport, fileSaveName );
  62. }
  63. /// <summary>
  64. /// 下载服务器的文件到本地的数据流中
  65. /// </summary>
  66. /// <param name="fileName">文件名称,带后缀</param>
  67. /// <param name="factory">第一大类</param>
  68. /// <param name="group">第二大类</param>
  69. /// <param name="id">第三大类</param>
  70. /// <param name="processReport">下载的进度报告</param>
  71. /// <param name="stream">流数据</param>
  72. /// <returns></returns>
  73. public OperateResult DownloadFile(
  74. string fileName,
  75. string factory,
  76. string group,
  77. string id,
  78. Action<long, long> processReport,
  79. Stream stream
  80. )
  81. {
  82. return DownloadFileBase( factory, group, id, fileName, processReport, stream );
  83. }
  84. /// <summary>
  85. /// 下载服务器的文件到本地的数据流中
  86. /// </summary>
  87. /// <param name="fileName">文件名称,带后缀</param>
  88. /// <param name="factory">第一大类</param>
  89. /// <param name="group">第二大类</param>
  90. /// <param name="id">第三大类</param>
  91. /// <param name="processReport">下载的进度报告</param>
  92. /// <param name="bitmap">内存文件</param>
  93. /// <returns></returns>
  94. public OperateResult DownloadFile(
  95. string fileName,
  96. string factory,
  97. string group,
  98. string id,
  99. Action<long, long> processReport,
  100. out Bitmap bitmap
  101. )
  102. {
  103. MemoryStream stream = new MemoryStream( );
  104. OperateResult result = DownloadFileBase( factory, group, id, fileName, processReport, stream );
  105. if (result.IsSuccess)
  106. {
  107. bitmap = new Bitmap( stream );
  108. }
  109. else
  110. {
  111. bitmap = null;
  112. result.IsSuccess = false;
  113. }
  114. stream.Dispose( );
  115. return result;
  116. }
  117. #endregion
  118. #region Upload File
  119. /// <summary>
  120. /// 上传本地的文件到服务器操作
  121. /// </summary>
  122. /// <param name="fileName">本地的完整路径的文件名称</param>
  123. /// <param name="serverName">服务器存储的文件名称,带后缀</param>
  124. /// <param name="factory">第一大类</param>
  125. /// <param name="group">第二大类</param>
  126. /// <param name="id">第三大类</param>
  127. /// <param name="fileTag">文件的额外描述</param>
  128. /// <param name="fileUpload">文件的上传人</param>
  129. /// <param name="processReport">上传的进度报告</param>
  130. /// <returns></returns>
  131. public OperateResult UploadFile(
  132. string fileName,
  133. string serverName,
  134. string factory,
  135. string group,
  136. string id,
  137. string fileTag,
  138. string fileUpload,
  139. Action<long, long> processReport )
  140. {
  141. return UploadFileBase( fileName, serverName, factory, group, id, fileTag, fileUpload, processReport );
  142. }
  143. /// <summary>
  144. /// 上传数据流到服务器操作
  145. /// </summary>
  146. /// <param name="stream">数据流内容</param>
  147. /// <param name="serverName">服务器存储的文件名称,带后缀</param>
  148. /// <param name="factory">第一大类</param>
  149. /// <param name="group">第二大类</param>
  150. /// <param name="id">第三大类</param>
  151. /// <param name="fileTag">文件的额外描述</param>
  152. /// <param name="fileUpload">文件的上传人</param>
  153. /// <param name="processReport">上传的进度报告</param>
  154. /// <returns></returns>
  155. public OperateResult UploadFile(
  156. Stream stream,
  157. string serverName,
  158. string factory,
  159. string group,
  160. string id,
  161. string fileTag,
  162. string fileUpload,
  163. Action<long, long> processReport )
  164. {
  165. return UploadFileBase( stream, serverName, factory, group, id, fileTag, fileUpload, processReport );
  166. }
  167. /// <summary>
  168. /// 上传内存图片到服务器操作
  169. /// </summary>
  170. /// <param name="bitmap">内存图片,不能为空</param>
  171. /// <param name="serverName">服务器存储的文件名称,带后缀</param>
  172. /// <param name="factory">第一大类</param>
  173. /// <param name="group">第二大类</param>
  174. /// <param name="id">第三大类</param>
  175. /// <param name="fileTag">文件的额外描述</param>
  176. /// <param name="fileUpload">文件的上传人</param>
  177. /// <param name="processReport">上传的进度报告</param>
  178. /// <returns></returns>
  179. /// <exception cref="ArgumentNullException"></exception>
  180. public OperateResult UploadFile(
  181. Bitmap bitmap,
  182. string serverName,
  183. string factory,
  184. string group,
  185. string id,
  186. string fileTag,
  187. string fileUpload,
  188. Action<long, long> processReport )
  189. {
  190. MemoryStream stream = new MemoryStream( );
  191. if (bitmap.RawFormat != null) bitmap.Save( stream, bitmap.RawFormat );
  192. else bitmap.Save( stream, System.Drawing.Imaging.ImageFormat.Bmp );
  193. OperateResult result = UploadFileBase( stream, serverName, factory, group, id, fileTag, fileUpload, processReport );
  194. stream.Dispose( );
  195. return result;
  196. }
  197. #endregion
  198. #region Private Method
  199. /// <summary>
  200. /// 根据三种分类信息,还原成在服务器的相对路径,包含文件
  201. /// </summary>
  202. /// <param name="fileName">文件名称,包含后缀名</param>
  203. /// <param name="factory">第一类</param>
  204. /// <param name="group">第二类</param>
  205. /// <param name="id">第三类</param>
  206. /// <returns></returns>
  207. private string TranslateFileName( string fileName, string factory, string group, string id )
  208. {
  209. string file_save_server_name = fileName;
  210. if (id.IndexOf( '\\' ) >= 0) id = id.Replace( '\\', '_' );
  211. if (group.IndexOf( '\\' ) >= 0) group = id.Replace( '\\', '_' );
  212. if (factory.IndexOf( '\\' ) >= 0) id = factory.Replace( '\\', '_' );
  213. if (id?.Length > 0) file_save_server_name = id + @"\" + file_save_server_name;
  214. if (group?.Length > 0) file_save_server_name = group + @"\" + file_save_server_name;
  215. if (factory?.Length > 0) file_save_server_name = factory + @"\" + file_save_server_name;
  216. return file_save_server_name;
  217. }
  218. /// <summary>
  219. /// 根据三种分类信息,还原成在服务器的相对路径,仅仅路径
  220. /// </summary>
  221. /// <param name="factory">第一类</param>
  222. /// <param name="group">第二类</param>
  223. /// <param name="id">第三类</param>
  224. /// <returns></returns>
  225. private string TranslatePathName( string factory, string group, string id )
  226. {
  227. string file_save_server_name = "";
  228. if (id.IndexOf( '\\' ) >= 0) id = id.Replace( '\\', '_' );
  229. if (group.IndexOf( '\\' ) >= 0) group = id.Replace( '\\', '_' );
  230. if (factory.IndexOf( '\\' ) >= 0) id = factory.Replace( '\\', '_' );
  231. if (id?.Length > 0) file_save_server_name = @"\" + id;
  232. if (group?.Length > 0) file_save_server_name = @"\" + group + file_save_server_name;
  233. if (factory?.Length > 0) file_save_server_name = @"\" + factory + file_save_server_name;
  234. return file_save_server_name;
  235. }
  236. #endregion
  237. #region Get FileNames
  238. /// <summary>
  239. /// 获取指定路径下的所有的文档
  240. /// </summary>
  241. /// <param name="fileNames">获取得到的文件合集</param>
  242. /// <param name="factory">第一大类</param>
  243. /// <param name="group">第二大类</param>
  244. /// <param name="id">第三大类</param>
  245. /// <returns></returns>
  246. public OperateResult DownloadPathFileNames(
  247. out GroupFileItem[] fileNames,
  248. string factory,
  249. string group,
  250. string id
  251. )
  252. {
  253. return DownloadStringArrays(
  254. out fileNames,
  255. HslProtocol.ProtocolFileDirectoryFiles,
  256. factory,
  257. group,
  258. id
  259. );
  260. }
  261. #endregion
  262. #region Get FolderNames
  263. /// <summary>
  264. /// 获取指定路径下的所有的文档
  265. /// </summary>
  266. /// <param name="folders"></param>
  267. /// <param name="factory"></param>
  268. /// <param name="group"></param>
  269. /// <param name="id"></param>
  270. /// <returns></returns>
  271. public OperateResult DownloadPathFolders(
  272. out string[] folders,
  273. string factory,
  274. string group,
  275. string id
  276. )
  277. {
  278. return DownloadStringArrays(
  279. out folders,
  280. HslProtocol.ProtocolFileDirectories,
  281. factory,
  282. group,
  283. id );
  284. }
  285. #endregion
  286. #region Private Method
  287. /// <summary>
  288. /// 获取指定路径下的所有的文档
  289. /// </summary>
  290. /// <param name="arrays">想要获取的队列</param>
  291. /// <param name="protocol">指令</param>
  292. /// <param name="factory">第一大类</param>
  293. /// <param name="group">第二大类</param>
  294. /// <param name="id">第三大类</param>
  295. /// <typeparam name="T">数组的类型</typeparam>
  296. /// <returns></returns>
  297. private OperateResult DownloadStringArrays<T>(
  298. out T[] arrays,
  299. int protocol,
  300. string factory,
  301. string group,
  302. string id
  303. )
  304. {
  305. OperateResult result = new OperateResult( );
  306. // 连接服务器
  307. // connect server
  308. OperateResult<Socket> socketResult = CreateSocketAndConnect( ServerIpEndPoint, ConnectTimeOut );
  309. if (!socketResult.IsSuccess) {
  310. arrays = new T[0];
  311. return socketResult;
  312. }
  313. // 上传信息
  314. OperateResult send = SendStringAndCheckReceive( socketResult.Content, protocol, "nosense" );
  315. if (!send.IsSuccess) {
  316. arrays = new T[0];
  317. return send;
  318. }
  319. // 上传三级分类
  320. OperateResult sendClass = SendFactoryGroupId( socketResult.Content, factory, group, id );
  321. if (!sendClass.IsSuccess)
  322. {
  323. arrays = new T[0];
  324. return sendClass;
  325. }
  326. // 接收数据信息
  327. OperateResult<int,string> receive = ReceiveStringContentFromSocket( socketResult.Content );
  328. if(!receive.IsSuccess)
  329. {
  330. arrays = new T[0];
  331. return receive;
  332. }
  333. socketResult.Content?.Close( );
  334. // 数据转化
  335. try
  336. {
  337. arrays = Newtonsoft.Json.Linq.JArray.Parse( receive.Content2 ).ToObject<T[]>( );
  338. return OperateResult.CreateSuccessResult( );
  339. }
  340. catch(Exception ex)
  341. {
  342. arrays = new T[0];
  343. return new OperateResult( )
  344. {
  345. Message = ex.Message
  346. };
  347. }
  348. }
  349. #endregion
  350. }
  351. }