C#实现的文件操作封装类完整实例【删除,移动,复制,重命名】
本文实例讲述了C#实现的文件操作封装类。分享给大家供大家参考,具体如下:
最近发现群共享里面有个C#文件操作封装类,其方法是调用WindowsAPI来操作的文件的删除、移动、复制、重命名操作。下载下来一试,发现果然不错,特在此记录,以防丢失!
文件操作类代码如下:
usingSystem; usingSystem.Runtime.InteropServices; usingSystem.IO; namespaceLxFile { //////文件操作代理,该类提供类似于Windows的文件操作体验 /// publicclassFileOperateProxy { #region【内部类型定义】 privatestructSHFILEOPSTRUCT { publicIntPtrhwnd;//父窗口句柄 publicwFuncwFunc;//要执行的动作 publicstringpFrom;//源文件路径,可以是多个文件,以结尾符号"\0"结束 publicstringpTo;//目标路径,可以是路径或文件名 publicFILEOP_FLAGSfFlags;//标志,附加选项 publicboolfAnyOperationsAborted;//是否可被中断 publicIntPtrhNameMappings;//文件映射名字,可在其它Shell函数中使用 publicstringlpszProgressTitle;//只在FOF_SIMPLEPROGRESS时,指定对话框的标题。 } privateenumwFunc { FO_MOVE=0x0001,//移动文件 FO_COPY=0x0002,//复制文件 FO_DELETE=0x0003,//删除文件,只是用pFrom FO_RENAME=0x0004//文件重命名 } privateenumFILEOP_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")] privatestaticexternintSHFileOperation(refSHFILEOPSTRUCTlpFileOp); #endregion【DllImport】 #region【删除文件操作】 //////删除单个文件。 /// ///删除的文件名 /// 指示是将文件放入回收站还是永久删除,true-放入回收站,false-永久删除 /// 指示是否显示确认对话框,true-显示确认删除对话框,false-不显示确认删除对话框 /// 指示是否显示进度对话框,true-显示,false-不显示。该参数当指定永久删除文件时有效 /// 反馈错误消息的字符串 /// 操作执行结果标识,删除文件成功返回0,否则,返回错误代码 publicstaticintDeleteFile(stringfileName,booltoRecycle,boolshowDialog,boolshowProgress,refstringerrorMsg) { try { stringfName=GetFullName(fileName); returnToDelete(fName,toRecycle,showDialog,showProgress,referrorMsg); } catch(Exceptionex) { errorMsg=ex.Message; return-200; } } //////删除一组文件。 /// ///字符串数组,表示一组文件名 /// 指示是将文件放入回收站还是永久删除,true-放入回收站,false-永久删除 /// 指示是否显示确认对话框,true-显示确认删除对话框,false-不显示确认删除对话框 /// 指示是否显示进度对话框,true-显示,false-不显示。该参数当指定永久删除文件时有效 /// 反馈错误消息的字符串 /// 操作执行结果标识,删除文件成功返回0,否则,返回错误代码 publicstaticintDeleteFiles(string[]fileNames,booltoRecycle,boolshowDialog,boolshowProgress,refstringerrorMsg) { try { stringfName=""; foreach(stringstrinfileNames) { fName+=GetFullName(str)+"\0";//组件文件组字符串 } returnToDelete(fName,toRecycle,showDialog,showProgress,referrorMsg); } catch(Exceptionex) { errorMsg=ex.Message; return-200; } } #endregion【删除文件操作】 #region【移动文件操作】 //////移动一个文件到指定路径下 /// ///要移动的文件名 /// 移动到的目的路径 /// 指示是否显示确认对话框,true-显示确认对话框,false-不显示确认对话框 /// 指示是否显示进度对话框 /// 指示当文件名重复时,是否自动为新文件加上后缀名 /// 反馈错误消息的字符串 /// 返回移动操作是否成功的标识,成功返回0,失败返回错误代码 publicstaticintMoveFile(stringsourceFileName,stringdestinationPath,boolshowDialog,boolshowProgress,boolautoRename,refstringerrorMsg) { try { stringsfName=GetFullName(sourceFileName); stringdfName=GetFullName(destinationPath); returnToMoveOrCopy(wFunc.FO_MOVE,sfName,dfName,showDialog,showProgress,autoRename,referrorMsg); } catch(Exceptionex) { errorMsg=ex.Message; return-200; } } //////移动一组文件到指定的路径下 /// ///要移动的文件名数组 /// 移动到的目的路径 /// 指示是否显示确认对话框,true-显示确认对话框,false-不显示确认对话框 /// 指示是否显示进度对话框 /// 指示当文件名重复时,是否自动为新文件加上后缀名 /// 反馈错误消息的字符串 /// 返回移动操作是否成功的标识,成功返回0,失败返回错误代码,-200:表示其他异常 publicstaticintMoveFiles(string[]sourceFileNames,stringdestinationPath,boolshowDialog,boolshowProgress,boolautoRename,refstringerrorMsg) { try { stringsfName=""; foreach(stringstrinsourceFileNames) { sfName+=GetFullName(str)+"\0";//组件文件组字符串 } stringdfName=GetFullName(destinationPath); returnToMoveOrCopy(wFunc.FO_MOVE,sfName,dfName,showDialog,showProgress,autoRename,referrorMsg); } catch(Exceptionex) { errorMsg=ex.Message; return-200; } } #endregion【移动文件操作】 #region【复制文件操作】 //////复制一个文件到指定的文件名或路径 /// ///要复制的文件名 /// 复制到的目的文件名或路径 /// 指示是否显示确认对话框,true-显示确认对话框,false-不显示确认对话框 /// 指示是否显示进度对话框 /// 指示当文件名重复时,是否自动为新文件加上后缀名 /// 返回移动操作是否成功的标识,成功返回0,失败返回错误代码,-200:表示其他异常 publicstaticintCopyFile(stringsourceFileName,stringdestinationFileName,boolshowDialog,boolshowProgress,boolautoRename,refstringerrorMsg) { try { stringsfName=GetFullName(sourceFileName); stringdfName=GetFullName(destinationFileName); returnToMoveOrCopy(wFunc.FO_COPY,sfName,dfName,showDialog,showProgress,autoRename,referrorMsg); } catch(Exceptionex) { errorMsg=ex.Message; return-200; } } //////复制一组文件到指定的路径 /// ///要复制的文件名数组 /// 复制到的目的路径 /// 指示是否显示确认对话框,true-显示确认对话框,false-不显示确认对话框 /// 指示是否显示进度对话框 /// 指示当文件名重复时,是否自动为新文件加上后缀名 /// 返回移动操作是否成功的标识,成功返回0,失败返回错误代码,-200:表示其他异常 publicstaticintCopyFiles(string[]sourceFileNames,stringdestinationPath,boolshowDialog,boolshowProgress,boolautoRename,refstringerrorMsg) { try { stringsfName=""; foreach(stringstrinsourceFileNames) { sfName+=GetFullName(str)+"\0";//组件文件组字符串 } stringdfName=GetFullName(destinationPath); returnToMoveOrCopy(wFunc.FO_COPY,sfName,dfName,showDialog,showProgress,autoRename,referrorMsg); } catch(Exceptionex) { errorMsg=ex.Message; return-200; } } #endregion【复制文件操作】 #region【重命名文件】 //////重命名一个文件为新名称,建议您使用更方便的Microsoft.VisualBasic.FileSystem.ReName();替换该方法 /// ///要复制的文件名 /// 复制到的目的文件名或路径 /// 指示是否显示确认对话框,true-显示确认对话框,false-不显示确认对话框 /// 返回移动操作是否成功的标识,成功返回0,失败返回错误代码,-200:表示其他异常 [Obsolete("建议使用Microsoft.VisualBasic.FileSystem.ReName()方法")] publicstaticintReNameFile(stringsourceFileName,stringdestinationFileName,boolshowDialog,refstringerrorMsg) { try { SHFILEOPSTRUCTlpFileOp=newSHFILEOPSTRUCT(); lpFileOp.wFunc=wFunc.FO_RENAME; lpFileOp.pFrom=GetFullName(sourceFileName)+"\0\0";//将文件名以结尾字符"\0\0"结束 lpFileOp.pTo=GetFullName(destinationFileName)+"\0\0"; lpFileOp.fFlags=FILEOP_FLAGS.FOF_NOERRORUI; if(!showDialog) lpFileOp.fFlags|=FILEOP_FLAGS.FOF_NOCONFIRMATION;//设定不显示提示对话框 lpFileOp.fAnyOperationsAborted=true; intn=SHFileOperation(reflpFileOp); if(n==0) return0; stringtmp=GetErrorString(n); errorMsg=string.Format("{0}({1})",tmp,sourceFileName); returnn; } catch(Exceptionex) { errorMsg=ex.Message; return-200; } } //////利用Microsoft.VisualBasic.FileSystem.ReName()方法实现 /// ////// publicstaticvoidReNameFile(stringfilePath,stringnewFileName) { try { stringextensName=Path.GetExtension(filePath); stringnewName=newFileName+extensName; Microsoft.VisualBasic.FileIO.FileSystem.RenameFile(filePath,newName); } catch(Exceptionex) { throwex; } } #endregion【重命名文件】 /// ///删除单个或多个文件 /// ///删除的文件名,如果是多个文件,文件名之间以字符串结尾符'\0'隔开 /// 指示是将文件放入回收站还是永久删除,true-放入回收站,false-永久删除 /// 指示是否显示确认对话框,true-显示确认删除对话框,false-不显示确认删除对话框 /// 指示是否显示进度对话框,true-显示,false-不显示。该参数当指定永久删除文件时有效 /// 反馈错误消息的字符串 /// 操作执行结果标识,删除文件成功返回0,否则,返回错误代码 privatestaticintToDelete(stringfileName,booltoRecycle,boolshowDialog,boolshowProgress,refstringerrorMsg) { SHFILEOPSTRUCTlpFileOp=newSHFILEOPSTRUCT(); lpFileOp.wFunc=wFunc.FO_DELETE; lpFileOp.pFrom=fileName+"\0";//将文件名以结尾字符"\0"结束 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; intn=SHFileOperation(reflpFileOp); if(n==0) return0; stringtmp=GetErrorString(n); //.av文件正常删除了但也提示402错误,不知道为什么。屏蔽之。 if((fileName.ToLower().EndsWith(".av")&&n.ToString("X")=="402")) return0; errorMsg=string.Format("{0}({1})",tmp,fileName); returnn; } //////移动或复制一个或多个文件到指定路径下 /// ///操作类型,是移动操作还是复制操作 /// 要移动或复制的文件名,如果是多个文件,文件名之间以字符串结尾符'\0'隔开 /// 移动到的目的位置 /// 指示是否显示确认对话框,true-显示确认对话框,false-不显示确认对话框 /// 指示是否显示进度对话框 /// 指示当文件名重复时,是否自动为新文件加上后缀名 /// 反馈错误消息的字符串 /// 返回移动操作是否成功的标识,成功返回0,失败返回错误代码 privatestaticintToMoveOrCopy(wFuncflag,stringsourceFileName,stringdestinationFileName,boolshowDialog,boolshowProgress,boolautoRename,refstringerrorMsg) { SHFILEOPSTRUCTlpFileOp=newSHFILEOPSTRUCT(); lpFileOp.wFunc=flag; lpFileOp.pFrom=sourceFileName+"\0";//将文件名以结尾字符"\0\0"结束 lpFileOp.pTo=destinationFileName+"\0\0"; 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; intn=SHFileOperation(reflpFileOp); if(n==0) return0; stringtmp=GetErrorString(n); errorMsg=string.Format("{0}({1})",tmp,sourceFileName); returnn; } //////获取一个文件的全名 /// ///文件名 /// 返回生成文件的完整路径名 privatestaticstringGetFullName(stringfileName) { FileInfofi=newFileInfo(fileName); returnfi.FullName; } //////解释错误代码 /// ///代码号 /// 返回关于错误代码的文字描述 privatestaticstringGetErrorString(intn) { if(n==0)returnstring.Empty; switch(n) { case2: return"系统找不到指定的文件。"; case7: return"存储控制块被销毁。您是否选择的“取消”操作?"; case113: return"文件已存在!"; case115: return"重命名文件操作,原始文件和目标文件必须具有相同的路径名。不能使用相对路径。"; case117: return"I/O控制错误"; case123: return"指定了重复的文件名"; case116: return"Thesourceisarootdirectory,whichcannotbemovedorrenamed."; case118: return"Securitysettingsdeniedaccesstothesource."; case124: return"Thepathinthesourceordestinationorbothwasinvalid."; case65536: return"Anunspecifiederroroccurredonthedestination."; case1026: return"在试图移动或拷贝一个不存在的文件."; case1223: return"操作被取消!"; default: return"未识别的错误代码:"+n; } } } }
附:完整实例代码点击此处本站下载。
更多关于C#相关内容感兴趣的读者可查看本站专题:《C#文件操作常用技巧汇总》、《C#遍历算法与技巧总结》、《C#程序设计之线程使用技巧总结》、《C#操作Excel技巧总结》、《C#中XML文件操作技巧汇总》、《C#常见控件用法教程》、《WinForm控件用法总结》、《C#数据结构与算法教程》、《C#数组操作技巧总结》及《C#面向对象程序设计入门教程》
希望本文所述对大家C#程序设计有所帮助。