IO.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353
  1. /*----------------------------------------------------------------
  2. // Copyright (C) 2007 liu523@QQ.COM
  3. // 版权所有。
  4. // 开发者:liu523@QQ.COM团队
  5. // 文件名:IO.cs
  6. // 文件功能描述: 文件传输管理类。
  7. //----------------------------------------------------------------*/
  8. using System;
  9. using System.IO;
  10. using System.Drawing;
  11. using System.Windows.Forms;
  12. using System.Collections;
  13. using System.Management;
  14. using RemoteControlLib.Bases;
  15. using RemoteControlLib.Codes;
  16. namespace RemoteControlLib.Common
  17. {
  18. /// <summary>
  19. ///文件传输管理类
  20. /// </summary>
  21. public class IO
  22. {
  23. /// <summary>
  24. /// 远程获取文件
  25. /// </summary>
  26. /// <param name="fileName"></param>
  27. public static void DownloadFile(BaseCommunication sender, string fileName, string savepath)
  28. {
  29. FileCode fileMng = new FileCode(fileName);
  30. fileMng.Head = CodeHead.GET_FILE;
  31. fileMng.SavePath = savepath;
  32. if (sender != null)
  33. sender.SendCode(fileMng);
  34. }
  35. /// <summary>
  36. /// 发送文件
  37. /// </summary>
  38. /// <param name="fileName"></param>
  39. public static void ReadyUploadFile(BaseCommunication sender, string fileName, string savepath)
  40. {
  41. FileCode fileMng = new FileCode(fileName);
  42. fileMng.Head = CodeHead.SEND_FILE;
  43. fileMng.SavePath = savepath;
  44. fileMng.readFile();
  45. if (sender != null)
  46. sender.SendCode(fileMng);
  47. }
  48. /// <summary>
  49. /// 发送文件
  50. /// </summary>
  51. /// <param name="code"></param>
  52. public static void UploadFile(BaseCommunication sender, FileCode code)
  53. {
  54. code.Head = CodeHead.SEND_FILE;
  55. code.readFile();
  56. if (sender != null)
  57. sender.SendCode(code);
  58. }
  59. /// <summary>
  60. /// 保存文件
  61. /// </summary>
  62. /// <param name="fileMng"></param>
  63. public static void SaveFile(BaseCommunication sender, FileCode fileMng)
  64. {
  65. fileMng.SaveFile();
  66. if (sender != null)
  67. {
  68. BaseCode code = new BaseCode();
  69. code.Head = CodeHead.FILE_TRAN_END;
  70. sender.SendCode(code);
  71. }
  72. }
  73. /// <summary>
  74. /// 文件传输完成
  75. /// </summary>
  76. /// <param name="sender"></param>
  77. public static void EndTranFile(BaseCommunication sender)
  78. {
  79. BaseCode code = new BaseCode();
  80. code.Head = CodeHead.FILE_TRAN_END;
  81. sender.SendCode(code);
  82. }
  83. /// <summary>
  84. /// 获取文件的详细信息
  85. /// </summary>
  86. /// <param name="file">文件名</param>
  87. /// <returns></returns>
  88. public static string GetFileDetial(string file)
  89. {
  90. string type;
  91. string fileSize;
  92. string updatedTime;
  93. try
  94. {
  95. int index = file.LastIndexOf('.');
  96. type = file.Substring(index + 1);
  97. }
  98. catch
  99. {
  100. type = "未知";
  101. }
  102. try
  103. {
  104. fileSize = GetFileSize(file);
  105. }
  106. catch
  107. {
  108. fileSize = "未知";
  109. }
  110. try
  111. {
  112. updatedTime = File.GetLastWriteTime(file).ToString();
  113. }
  114. catch
  115. {
  116. updatedTime = "未知";
  117. }
  118. return "类型:" + type + "修改日期:" + updatedTime + "\t大小:" + fileSize;
  119. }
  120. /// <summary>
  121. /// 获取文件的大小
  122. /// </summary>
  123. /// <param name="file">文件名</param>
  124. /// <returns></returns>
  125. private static string GetFileSize(string file)
  126. {
  127. double KB = 1024;
  128. double MB = 1024 * KB;
  129. double GB = 1024 * MB;
  130. long byteCount = GetFileLength(file);
  131. if (byteCount < KB)
  132. return byteCount + "B";
  133. else if (byteCount < MB)
  134. return Math.Round(byteCount / KB, 2) + "KB";
  135. else if (byteCount < GB)
  136. return Math.Round(byteCount / MB, 2) + "MB";
  137. else
  138. return Math.Round(byteCount / GB, 2) + "GB";
  139. }
  140. /// <summary>
  141. /// 获取文件长度(单位:字节)
  142. /// </summary>
  143. /// <param name="file"></param>
  144. /// <returns></returns>
  145. private static long GetFileLength(string file)
  146. {
  147. FileStream fileStream = new FileStream(file, FileMode.Open, FileAccess.Read);
  148. long fileLength = fileStream.Length;
  149. fileStream.Close();
  150. return fileLength;
  151. }
  152. /// <summary>
  153. /// 打开根目录
  154. /// </summary>
  155. /// <param name="lView">显示结果的列表视图控件</param>
  156. /// <param name="imageHashtable">文件图标的键值(哈希表)</param>
  157. public static void OpenRoot(ListView lView, Hashtable imageHashtable)
  158. {
  159. DisksCode diskcode = IO.GetDisks();
  160. if (diskcode != null)
  161. ShowDisks(diskcode, lView, imageHashtable, false);
  162. }
  163. /// <summary>
  164. /// 显示主机的磁盘
  165. /// </summary>
  166. /// <param name="diskcode">磁盘指令</param>
  167. /// <param name="lView">显示结果的列表视图控件</param>
  168. /// <param name="imageHashtable">文件图标的键值(哈希表)</param>
  169. /// <param name="serverDisk">是否服务器的磁盘</param>
  170. public static void ShowDisks(DisksCode diskcode, ListView lView, Hashtable imageHashtable, bool serverDisk)
  171. {
  172. DiskStruct[] disk = diskcode.Disks;
  173. if (disk != null && disk.Length != 0)
  174. {
  175. lView.Items.Clear();
  176. ListViewItem[] dItems = new ListViewItem[disk.Length];
  177. string name;
  178. lView.Tag = "";
  179. for (int i = 0; i < disk.Length; i++)
  180. {
  181. name = IO.DiskToString(disk[i].Name, serverDisk);
  182. dItems[i] = new ListViewItem(name);
  183. //文件夹图标
  184. dItems[i].ImageKey = (string)imageHashtable["Disk"];
  185. dItems[i].Tag = disk[i];
  186. lView.Items.Add(dItems[i]);
  187. }
  188. }
  189. }
  190. /// <summary>
  191. /// 打开指定路径
  192. /// </summary>
  193. /// <param name="path">路径</param>
  194. /// <param name="lView">显示结果的列表视图控件</param>
  195. /// <param name="imageHashtable">文件图标的键值(哈希表)</param>
  196. public static void OpenDirectory(string path, ListView lView, Hashtable imageHashtable)
  197. {
  198. if (path == "")
  199. OpenRoot(lView, imageHashtable);
  200. else
  201. {
  202. ExplorerCode explorer = new ExplorerCode();
  203. explorer.Enter(path);
  204. ShowHostDirectory(explorer, lView, imageHashtable);
  205. }
  206. }
  207. /// <summary>
  208. /// 显示主机上的文件
  209. /// </summary>
  210. /// <param name="explorer">主机指令</param>
  211. /// <param name="lView">显示结果的列表视图控件</param>
  212. /// <param name="imageHashtable">文件图标的键值(哈希表)</param>
  213. public static void ShowHostDirectory(ExplorerCode explorer, ListView lView, Hashtable imageHashtable)
  214. {
  215. DirectoryStruct[] directorys;
  216. FileStruct[] files;
  217. if (!explorer.Available)
  218. {
  219. MessageBox.Show("当前路径无法访问!");
  220. return;
  221. }
  222. lView.Items.Clear();
  223. directorys = explorer.Directorys;
  224. files = explorer.Files;
  225. lView.Tag = explorer.Path;
  226. //添加回退功能
  227. string parentPath = IO.GetParentPath(explorer.Path);
  228. DirectoryStruct lastDirectory = new DirectoryStruct(parentPath);
  229. ListViewItem lastItem = new ListViewItem(Constant.ParentPath);
  230. lastItem.ImageKey = (string)imageHashtable["LastPath"];
  231. lastItem.Tag = lastDirectory;
  232. lView.Items.Add(lastItem);
  233. ListViewItem[] dItems = new ListViewItem[directorys.Length];
  234. string name;
  235. for (int i = 0; i < directorys.Length; i++)
  236. {
  237. name = IO.GetName(directorys[i].Name);
  238. if (name != "")
  239. {
  240. dItems[i] = new ListViewItem(name);
  241. //文件夹图标
  242. dItems[i].ImageKey = (string)imageHashtable["Directory"];
  243. dItems[i].Tag = directorys[i];
  244. lView.Items.Add(dItems[i]);
  245. }
  246. }
  247. ListViewItem[] fItems = new ListViewItem[files.Length];
  248. string type;
  249. for (int i = 0; i < files.Length; i++)
  250. {
  251. name = IO.GetName(files[i].Name);
  252. if (name != "")
  253. {
  254. fItems[i] = new ListViewItem(name);
  255. //文件图标
  256. type = IO.GetFileType(files[i].Name).ToLower();
  257. if (imageHashtable.Contains(type))
  258. fItems[i].ImageKey = (string)imageHashtable[type];
  259. else
  260. fItems[i].ImageKey = (string)imageHashtable["Unknown"];
  261. fItems[i].Tag = files[i];
  262. lView.Items.Add(fItems[i]);
  263. }
  264. }
  265. }
  266. /// <summary>
  267. /// 获取上一层路径
  268. /// </summary>
  269. /// <param name="fullname">全名</param>
  270. /// <returns></returns>
  271. public static string GetParentPath(string fullname)
  272. {
  273. int index = fullname.LastIndexOf("\\");
  274. if ( index + 1 >= fullname.Length || index <=0)
  275. return "";
  276. if(index == 2)
  277. return fullname.Substring(0, index+1);
  278. return fullname.Substring(0, index);
  279. }
  280. /// <summary>
  281. /// 获取文件或文件夹的名字(非全名)
  282. /// </summary>
  283. /// <param name="fullname">文件或文件夹全名</param>
  284. /// <returns></returns>
  285. public static string GetName(string fullname)
  286. {
  287. int index = fullname.LastIndexOf("\\");
  288. if (index + 1 >= fullname.Length || index == -1)
  289. return "";
  290. return fullname.Substring(index + 1);
  291. }
  292. /// <summary>
  293. ///获取文件类型
  294. /// </summary>
  295. /// <param name="file"></param>
  296. /// <returns></returns>
  297. public static string GetFileType(string file)
  298. {
  299. int index = file.LastIndexOf('.');
  300. if (index + 1 >= file.Length || index == -1)
  301. return Constant.UnknowFileType;
  302. return file.Substring(index + 1);
  303. }
  304. /// <summary>
  305. /// 获取所有盘符
  306. /// </summary>
  307. /// <returns></returns>
  308. public static DisksCode GetDisks()
  309. {
  310. string[] diskslist = Directory.GetLogicalDrives();
  311. DisksCode diskcode = new DisksCode();
  312. diskcode.Disks = new DiskStruct[diskslist.Length];
  313. for (int i = 0; i < diskslist.Length; i++)
  314. diskcode.Disks[i] = new DiskStruct(diskslist[i].Substring(0,2));
  315. return diskcode;
  316. }
  317. /// <summary>
  318. /// 为磁盘取个友好的名字
  319. /// </summary>
  320. /// <param name="diskName">磁盘名</param>
  321. /// <param name="serverDisk">是否服务器的磁盘</param>
  322. /// <returns>(例如: diskName="C:",serverDisk=true ,则返回" 远程磁盘(C:)")</returns>
  323. public static string DiskToString(string diskName, bool serverDisk)
  324. {
  325. return (serverDisk ? "远程磁盘(" + diskName + ")" : "本地磁盘(" + diskName + ")");
  326. }
  327. }
  328. }