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#程序设计有所帮助。