C#实现的文件操作封装类完整实例【删除,移动,复制,重命名】
作者:Rising_Sun 发布时间:2022-09-14 20:41:14
标签:C#,文件,封装类
本文实例讲述了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; //源文件路径,可以是多个文件,以结尾符号"\0"结束
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, bool toRecycle, bool showDialog, bool showProgress, ref string errorMsg)
{
try
{
string fName = "";
foreach (string str in fileNames)
{
fName += GetFullName(str) + "\0"; //组件文件组字符串
}
return ToDelete(fName, toRecycle, showDialog, showProgress, 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 showDialog, bool showProgress, bool autoRename, ref string errorMsg)
{
try
{
string sfName = GetFullName(sourceFileName);
string dfName = GetFullName(destinationPath);
return ToMoveOrCopy(wFunc.FO_MOVE, sfName, dfName, showDialog, showProgress, 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, string destinationPath, bool showDialog, bool showProgress, bool autoRename, ref string errorMsg)
{
try
{
string sfName = "";
foreach (string str in sourceFileNames)
{
sfName += GetFullName(str) + "\0"; //组件文件组字符串
}
string dfName = GetFullName(destinationPath);
return ToMoveOrCopy(wFunc.FO_MOVE, sfName, dfName, showDialog, showProgress, autoRename, 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, bool showDialog, bool showProgress, bool autoRename, ref string errorMsg)
{
try
{
string sfName = GetFullName(sourceFileName);
string dfName = GetFullName(destinationFileName);
return ToMoveOrCopy(wFunc.FO_COPY, sfName, dfName, showDialog, showProgress, 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>
/// <returns>返回移动操作是否成功的标识,成功返回0,失败返回错误代码,-200:表示其他异常</returns>
public static int CopyFiles(string[] sourceFileNames, string destinationPath, bool showDialog, bool showProgress, bool autoRename, ref string errorMsg)
{
try
{
string sfName = "";
foreach (string str in sourceFileNames)
{
sfName += GetFullName(str) + "\0"; //组件文件组字符串
}
string dfName = GetFullName(destinationPath);
return ToMoveOrCopy(wFunc.FO_COPY, sfName, dfName, showDialog, showProgress, autoRename, 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, string destinationFileName, bool showDialog, ref string errorMsg)
{
try
{
SHFILEOPSTRUCT lpFileOp = new SHFILEOPSTRUCT();
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;
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">删除的文件名,如果是多个文件,文件名之间以字符串结尾符'\0'隔开</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, bool toRecycle, bool showDialog, bool showProgress, ref string errorMsg)
{
SHFILEOPSTRUCT lpFileOp = new SHFILEOPSTRUCT();
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;
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})", tmp, fileName);
return n;
}
/// <summary>
/// 移动或复制一个或多个文件到指定路径下
/// </summary>
/// <param name="flag">操作类型,是移动操作还是复制操作</param>
/// <param name="sourceFileName">要移动或复制的文件名,如果是多个文件,文件名之间以字符串结尾符'\0'隔开</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, string destinationFileName, bool showDialog, bool showProgress, bool autoRename, ref string errorMsg)
{
SHFILEOPSTRUCT lpFileOp = new SHFILEOPSTRUCT();
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;
int n = SHFileOperation(ref lpFileOp);
if (n == 0)
return 0;
string tmp = GetErrorString(n);
errorMsg = string.Format("{0}({1})", tmp, 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#程序设计有所帮助。


猜你喜欢
- /// <summary> /// List转换成DataSet /// </summary> /// <ty
- 准备三个框架结合的lib包Spring3结合Struts2的步骤如下:1:开启Struts2结合Spring3,在struts.xml中添加
- 问题描述设有n个会议的集合C={1,2,…,n},其中每个会议都要求使用同一个资源(如会议室),而在同一时间内只能有一
- 本文实例为大家分享了unity实现翻页效果的具体代码,供大家参考,具体内容如下一、示意图二、步骤创建物体ToPanel;添加组件Scroll
- Java计算一段程序的运行时间介绍了两种方法,一种是毫秒级别的计算,另一种是更精确的纳秒级别的计算。毫秒级别计算时间  
- 数据传输在Android开发过程中,我们常常通过Intent在各个组件之间传递数据。例如在使用startActivity(android.c
- JAVA枚举,比你想象中还要有用!我经常发现自己在Java中使用枚举来表示某个对象的一组潜在值。在编译时确定类型可以具有什么值的能力是一种强
- 程序结构:一、配置 1. 在pom.xml中添加依赖pom.xml文件如下:<?xml version="1.0&
- 在Spring4之后,要使用注解开发,必须要保证aop的包导入了使用注解需要导入context约束,增加注解的支持!<?xml ver
- 前言 CLion是一款专为开发C及C++所设计
- 基本框架<?xml version="1.0" encoding="utf-8"?>&l
- 一、什么是Memcached?Memcached是danga.com开发的分布式内存对象缓存系统,所谓分布式,意味着它不是本地的,而是基于网
- 1. 简单工厂模式简介简单工厂模式(Simple Factory),又被称为"静态工厂方法模式"。它属于"创建
- 使用注解的形式,装配在id字段,自动调用fegin赋值给目标字段。使用效果1.先给vo类中字段添加注解 2.调用feignData
- 本文实例为大家分享了Android studio设计简易计算器的具体代码,供大家参考,具体内容如下效果显示:第一步,简单的界面布局<?
- 前言:C# 10 对于 Lambda 做了很多的优化,我们可以在 C# 中更加方便地使用委托和 Lambda 了,下面就来看一些示例1、Na
- java.math.BigDecimal及加减乘除计算BigDecimal简介BigDecimal用来对需要更大或更小的数进行任意精度的运算
- 本章先讲解Java随机数的几种产生方式,然后通过示例对其进行演示。广义上讲,Java中的随机数的有三种产生方式:(01). 通过System
- SpringBoot配置文件的替换使用spring.profiles.active在工作中,测试或上线的时候一定会遇到的问题就是修改配置。一
- 今天没事跟群里面侃大山,有个哥们说道Android Wheel这个控件,以为是Andriod内置的控件,google一把,发现是个githu