
本文实例讲述了C#实现的文件 *** 作封装类。分享给大家供大家参考,具体如下:
最近发现群共享里面有个C# 文件 *** 作封装类,其方法是调用windows API 来 *** 作的文件的删除、移动、复制、重命名 *** 作。下载下来一试,发现果然不错,特在此记录,以防丢失!
文件 *** 作类代码如下:
using System;using System.Runtime.InteropServices;using System.IO;namespace Lxfile{ /// <summary> /// 文件 *** 作代理,该类提供类似于windows的文件 *** 作体验 /// </summary> public class fileOperateProxy { #region 【内部类型定义】 private struct SHfileOPSTRUCT { public IntPtr hwnd; //父窗口句柄 public wFunc wFunc; //要执行的动作 public string pFrom; //源文件路径,可以是多个文件,以结尾符号"本站下载"结束 public string pTo; //目标路径,可以是路径或文件名 public fileOP_FLAGS fFlags; //标志,附加选项 public bool fAnyOperationsAborted; //是否可被中断 public IntPtr hnameMapPings; //文件映射名字,可在其它 Shell 函数中使用 public string lpszProgressTitle; // 只在 FOF_SIMPLEPROGRESS 时,指定对话框的标题。 } private enum wFunc { FO_MOVE = 0x0001,//移动文件 FO_copY = 0x0002,//复制文件 FO_DELETE = 0x0003,//删除文件,只是用pFrom FO_REname = 0x0004 //文件重命名 } private enum fileOP_FLAGS { FOF_MulTIDESTfileS = 0x0001,//pTo 指定了多个目标文件,而不是单个目录 FOF_CONFIRMMOUSE = 0x0002,FOF_SILENT = 0x0044,// 不显示一个进度对话框 FOF_REnameONColliSION = 0x0008,// 碰到有抵触的名字时,自动分配前缀 FOF_NOCONFIRMATION = 0x10,// 不对用户显示提示 FOF_WANTMAPPingHANDLE = 0x0020,// 填充 hnameMapPings 字段,必须使用 SHFreenameMapPings 释放 FOF_ALLOWUNDO = 0x40,// 允许撤销 FOF_fileSONLY = 0x0080,// 使用 *.* 时,只对文件 *** 作 FOF_SIMPLEPROGRESS = 0x0100,// 简单进度条,意味者不显示文件名。 FOF_NOCONFIRMMKDIR = 0x0200,// 建新目录时不需要用户确定 FOF_NOERRORUI = 0x0400,// 不显示出错用户界面 FOF_NOcopYSecurityATTRIBS = 0x0800,// 不复制 NT 文件的安全属性 FOF_norECURSION = 0x1000 // 不递归目录 } #endregion 【内部类型定义】 #region 【Dllimport】 [Dllimport("shell32.dll")] private static extern int SHfileOperation(ref SHfileOPSTRUCT lpfileOp); #endregion 【Dllimport】 #region 【删除文件 *** 作】 /// <summary> /// 删除单个文件。 /// </summary> /// <param name="filename">删除的文件名</param> /// <param name="toRecycle">指示是将文件放入回收站还是永久删除,true-放入回收站,false-永久删除</param> /// <param name="showDialog">指示是否显示确认对话框,true-显示确认删除对话框,false-不显示确认删除对话框</param> /// <param name="showProgress">指示是否显示进度对话框,true-显示,false-不显示。该参数当指定永久删除文件时有效</param> /// <param name="errorMsg">反馈错误消息的字符串</param> /// <returns> *** 作执行结果标识,删除文件成功返回0,否则,返回错误代码</returns> public static int Deletefile(string filename,bool toRecycle,bool showDialog,bool showProgress,ref string errorMsg) { try { string fname = GetFullname(filename); return ToDelete(fname,toRecycle,showDialog,showProgress,ref errorMsg); } catch (Exception ex) { errorMsg = ex.Message; return -200; } } /// <summary> /// 删除一组文件。 /// </summary> /// <param name="filenames">字符串数组,表示一组文件名</param> /// <param name="toRecycle">指示是将文件放入回收站还是永久删除,true-放入回收站,false-永久删除</param> /// <param name="showDialog">指示是否显示确认对话框,true-显示确认删除对话框,false-不显示确认删除对话框</param> /// <param name="showProgress">指示是否显示进度对话框,true-显示,false-不显示。该参数当指定永久删除文件时有效</param> /// <param name="errorMsg">反馈错误消息的字符串</param> /// <returns> *** 作执行结果标识,删除文件成功返回0,否则,返回错误代码</returns> public static int Deletefiles(string[] filenames,ref string errorMsg) { try { string fname = ""; foreach (string str in filenames) { fname += GetFullname(str) + ""; //组件文件组字符串 } return ToDelete(fname,ref errorMsg); } catch (Exception ex) { errorMsg = ex.Message; return -200; } } #endregion 【删除文件 *** 作】 #region 【移动文件 *** 作】 /// <summary> /// 移动一个文件到指定路径下 /// </summary> /// <param name="sourcefilename">要移动的文件名</param> /// <param name="destinationPath">移动到的目的路径</param> /// <param name="showDialog">指示是否显示确认对话框,true-显示确认对话框,false-不显示确认对话框</param> /// <param name="showProgress">指示是否显示进度对话框</param> /// <param name="autoRename">指示当文件名重复时,是否自动为新文件加上后缀名</param> /// <param name="errorMsg">反馈错误消息的字符串</param> /// <returns>返回移动 *** 作是否成功的标识,成功返回0,失败返回错误代码</returns> public static int Movefile(string sourcefilename,string destinationPath,bool autoRename,ref string errorMsg) { try { string sfname = GetFullname(sourcefilename); string dfname = GetFullname(destinationPath); return ToMoveOrcopy(wFunc.FO_MOVE,sfname,dfname,autoRename,ref errorMsg); } catch (Exception ex) { errorMsg = ex.Message; return -200; } } /// <summary> /// 移动一组文件到指定的路径下 /// </summary> /// <param name="sourcefilenames">要移动的文件名数组</param> /// <param name="destinationPath">移动到的目的路径</param> /// <param name="showDialog">指示是否显示确认对话框,true-显示确认对话框,false-不显示确认对话框</param> /// <param name="showProgress">指示是否显示进度对话框</param> /// <param name="autoRename">指示当文件名重复时,是否自动为新文件加上后缀名</param> /// <param name="errorMsg">反馈错误消息的字符串</param> /// <returns>返回移动 *** 作是否成功的标识,成功返回0,失败返回错误代码,-200:表示其他异常</returns> public static int Movefiles(string[] sourcefilenames,ref string errorMsg) { try { string sfname = ""; foreach (string str in sourcefilenames) { sfname += GetFullname(str) + ""; //组件文件组字符串 } string dfname = GetFullname(destinationPath); return ToMoveOrcopy(wFunc.FO_MOVE,ref errorMsg); } catch (Exception ex) { errorMsg = ex.Message; return -200; } } #endregion 【移动文件 *** 作】 #region 【复制文件 *** 作】 /// <summary> /// 复制一个文件到指定的文件名或路径 /// </summary> /// <param name="sourcefilename">要复制的文件名</param> /// <param name="destinationfilename">复制到的目的文件名或路径</param> /// <param name="showDialog">指示是否显示确认对话框,true-显示确认对话框,false-不显示确认对话框</param> /// <param name="showProgress">指示是否显示进度对话框</param> /// <param name="autoRename">指示当文件名重复时,是否自动为新文件加上后缀名</param> /// <returns>返回移动 *** 作是否成功的标识,成功返回0,失败返回错误代码,-200:表示其他异常</returns> public static int copyfile(string sourcefilename,string destinationfilename,ref string errorMsg) { try { string sfname = GetFullname(sourcefilename); string dfname = GetFullname(destinationfilename); return ToMoveOrcopy(wFunc.FO_copY,ref errorMsg); } catch (Exception ex) { errorMsg = ex.Message; return -200; } } /// <summary> /// 复制一组文件到指定的路径 /// </summary> /// <param name="sourcefilenames">要复制的文件名数组</param> /// <param name="destinationPath">复制到的目的路径</param> /// <param name="showDialog">指示是否显示确认对话框,true-显示确认对话框,false-不显示确认对话框</param> /// <param name="showProgress">指示是否显示进度对话框</param> /// <param name="autoRename">指示当文件名重复时,是否自动为新文件加上后缀名</param> /// <returns>返回移动 *** 作是否成功的标识,成功返回0,失败返回错误代码,-200:表示其他异常</returns> public static int copyfiles(string[] sourcefilenames,ref string errorMsg) { try { string sfname = ""; foreach (string str in sourcefilenames) { sfname += GetFullname(str) + ""; //组件文件组字符串 } string dfname = GetFullname(destinationPath); return ToMoveOrcopy(wFunc.FO_copY,ref errorMsg); } catch (Exception ex) { errorMsg = ex.Message; return -200; } } #endregion 【复制文件 *** 作】 #region 【重命名文件】 /// <summary> /// 重命名一个文件为新名称,建议您使用更方便的Microsoft.VisualBasic.fileSystem.Rename();替换该方法 /// </summary> /// <param name="sourcefilename">要复制的文件名</param> /// <param name="destinationfilename">复制到的目的文件名或路径</param> /// <param name="showDialog">指示是否显示确认对话框,true-显示确认对话框,false-不显示确认对话框</param> /// <returns>返回移动 *** 作是否成功的标识,成功返回0,失败返回错误代码,-200:表示其他异常</returns> [Obsolete("建议使用 Microsoft.VisualBasic.fileSystem.Rename()方法")] public static int Renamefile(string sourcefilename,ref string errorMsg) { try { SHfileOPSTRUCT lpfileOp = new SHfileOPSTRUCT(); lpfileOp.wFunc = wFunc.FO_REname; lpfileOp.pFrom = GetFullname(sourcefilename) + ""; //将文件名以结尾字符""结束 lpfileOp.pTo = GetFullname(destinationfilename) + ""; lpfileOp.fFlags = fileOP_FLAGS.FOF_NOERRORUI; if (!showDialog) lpfileOp.fFlags |= fileOP_FLAGS.FOF_NOCONFIRMATION; //设定不显示提示对话框 lpfileOp.fAnyOperationsAborted = true; int n = SHfileOperation(ref lpfileOp); if (n == 0) return 0; string tmp = GetErrorString(n); errorMsg = string.Format("{0}({1})",tmp,sourcefilename); return n; } catch (Exception ex) { errorMsg = ex.Message; return -200; } } /// <summary> /// 利用Microsoft.VisualBasic.fileSystem.Rename()方法实现 /// </summary> /// <param name="filePath"></param> /// <param name="newfilename"></param> public static voID Renamefile(string filePath,string newfilename) { try { string extensname = Path.GetExtension(filePath); string newname = newfilename + extensname; Microsoft.VisualBasic.fileIO.fileSystem.Renamefile(filePath,newname); } catch (Exception ex) { throw ex; } } #endregion 【重命名文件】 /// <summary> /// 删除单个或多个文件 /// </summary> /// <param name="filename">删除的文件名,如果是多个文件,文件名之间以字符串结尾符''隔开</param> /// <param name="toRecycle">指示是将文件放入回收站还是永久删除,true-放入回收站,false-永久删除</param> /// <param name="showDialog">指示是否显示确认对话框,true-显示确认删除对话框,false-不显示确认删除对话框</param> /// <param name="showProgress">指示是否显示进度对话框,true-显示,false-不显示。该参数当指定永久删除文件时有效</param> /// <param name="errorMsg">反馈错误消息的字符串</param> /// <returns> *** 作执行结果标识,删除文件成功返回0,否则,返回错误代码</returns> private static int ToDelete(string filename,ref string errorMsg) { SHfileOPSTRUCT lpfileOp = new SHfileOPSTRUCT(); lpfileOp.wFunc = wFunc.FO_DELETE; lpfileOp.pFrom = filename + ""; //将文件名以结尾字符""结束 lpfileOp.fFlags = fileOP_FLAGS.FOF_NOERRORUI; if (toRecycle) lpfileOp.fFlags |= fileOP_FLAGS.FOF_ALLOWUNDO; //设定删除到回收站 if (!showDialog) lpfileOp.fFlags |= fileOP_FLAGS.FOF_NOCONFIRMATION; //设定不显示提示对话框 if (!showProgress) lpfileOp.fFlags |= fileOP_FLAGS.FOF_SILENT; //设定不显示进度对话框 lpfileOp.fAnyOperationsAborted = true; int n = SHfileOperation(ref lpfileOp); if (n == 0) return 0; string tmp = GetErrorString(n); //.av 文件正常删除了但也提示 402 错误,不知道为什么。屏蔽之。 if ((filename.Tolower().EndsWith(".av") && n.ToString("X") == "402")) return 0; errorMsg = string.Format("{0}({1})",filename); return n; } /// <summary> /// 移动或复制一个或多个文件到指定路径下 /// </summary> /// <param name="flag"> *** 作类型,是移动 *** 作还是复制 *** 作</param> /// <param name="sourcefilename">要移动或复制的文件名,如果是多个文件,文件名之间以字符串结尾符''隔开</param> /// <param name="destinationfilename">移动到的目的位置</param> /// <param name="showDialog">指示是否显示确认对话框,true-显示确认对话框,false-不显示确认对话框</param> /// <param name="showProgress">指示是否显示进度对话框</param> /// <param name="autoRename">指示当文件名重复时,是否自动为新文件加上后缀名</param> /// <param name="errorMsg">反馈错误消息的字符串</param> /// <returns>返回移动 *** 作是否成功的标识,成功返回0,失败返回错误代码</returns> private static int ToMoveOrcopy(wFunc flag,string sourcefilename,ref string errorMsg) { SHfileOPSTRUCT lpfileOp = new SHfileOPSTRUCT(); lpfileOp.wFunc = flag; lpfileOp.pFrom = sourcefilename + ""; //将文件名以结尾字符""结束 lpfileOp.pTo = destinationfilename + ""; lpfileOp.fFlags = fileOP_FLAGS.FOF_NOERRORUI; lpfileOp.fFlags |= fileOP_FLAGS.FOF_NOCONFIRMMKDIR; //指定在需要时可以直接创建路径 if (!showDialog) lpfileOp.fFlags |= fileOP_FLAGS.FOF_NOCONFIRMATION; //设定不显示提示对话框 if (!showProgress) lpfileOp.fFlags |= fileOP_FLAGS.FOF_SILENT; //设定不显示进度对话框 if (autoRename) lpfileOp.fFlags |= fileOP_FLAGS.FOF_REnameONColliSION; //自动为重名文件添加名称后缀 lpfileOp.fAnyOperationsAborted = true; int n = SHfileOperation(ref lpfileOp); if (n == 0) return 0; string tmp = GetErrorString(n); errorMsg = string.Format("{0}({1})",sourcefilename); return n; } /// <summary> /// 获取一个文件的全名 /// </summary> /// <param name="filename">文件名</param> /// <returns>返回生成文件的完整路径名</returns> private static string GetFullname(string filename) { fileInfo fi = new fileInfo(filename); return fi.Fullname; } /// <summary> /// 解释错误代码 /// </summary> /// <param name="n">代码号</param> /// <returns>返回关于错误代码的文字描述</returns> private static string GetErrorString(int n) { if (n == 0) return string.Empty; switch (n) { case 2: return "系统找不到指定的文件。"; case 7: return "存储控制块被销毁。您是否选择的“取消” *** 作?"; case 113: return "文件已存在!"; case 115: return "重命名文件 *** 作,原始文件和目标文件必须具有相同的路径名。不能使用相对路径。"; case 117: return "I/O控制错误"; case 123: return "指定了重复的文件名"; case 116: return "The source is a root directory,which cannot be moved or renamed."; case 118: return "Security settings denIEd access to the source."; case 124: return "The path in the source or destination or both was invalID."; case 65536: return "An unspecifIEd error occurred on the destination."; case 1026: return "在试图移动或拷贝一个不存在的文件."; case 1223: return " *** 作被取消!"; default: return "未识别的错误代码:" + n; } } }}附:完整实例代码点击此处。
更多关于C#相关内容感兴趣的读者可查看本站专题:《C#文件 *** 作常用技巧汇总》、《C#遍历算法与技巧总结》、《C#程序设计之线程使用技巧总结》、《C# *** 作Excel技巧总结》、《C#中XML文件 *** 作技巧汇总》、《C#常见控件用法教程》、《WinForm控件用法总结》、《C#数据结构与算法教程》、《C#数组 *** 作技巧总结》及《C#面向对象程序设计入门教程》
希望本文所述对大家C#程序设计有所帮助。
总结以上是内存溢出为你收集整理的C#实现的文件 *** 作封装类完整实例【删除,移动,复制,重命名】全部内容,希望文章能够帮你解决C#实现的文件 *** 作封装类完整实例【删除,移动,复制,重命名】所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)