C#實(shí)現(xiàn)的文件操作封裝類完整實(shí)例【刪除,移動(dòng),復(fù)制,重命名】
本文實(shí)例講述了C#實(shí)現(xiàn)的文件操作封裝類。分享給大家供大家參考,具體如下:
最近發(fā)現(xiàn)群共享里面有個(gè)C# 文件操作封裝類,其方法是調(diào)用Windows API 來操作的文件的刪除、移動(dòng)、復(fù)制、重命名操作。下載下來一試,發(fā)現(xiàn)果然不錯(cuò),特在此記錄,以防丟失!
文件操作類代碼如下:
using System;
using System.Runtime.InteropServices;
using System.IO;
namespace LxFile
{
/// <summary>
/// 文件操作代理,該類提供類似于Windows的文件操作體驗(yàn)
/// </summary>
public class FileOperateProxy
{
#region 【內(nèi)部類型定義】
private struct SHFILEOPSTRUCT
{
public IntPtr hwnd; //父窗口句柄
public wFunc wFunc; //要執(zhí)行的動(dòng)作
public string pFrom; //源文件路徑,可以是多個(gè)文件,以結(jié)尾符號(hào)"\0"結(jié)束
public string pTo; //目標(biāo)路徑,可以是路徑或文件名
public FILEOP_FLAGS fFlags; //標(biāo)志,附加選項(xiàng)
public bool fAnyOperationsAborted; //是否可被中斷
public IntPtr hNameMappings; //文件映射名字,可在其它 Shell 函數(shù)中使用
public string lpszProgressTitle; // 只在 FOF_SIMPLEPROGRESS 時(shí),指定對(duì)話框的標(biāo)題。
}
private enum wFunc
{
FO_MOVE = 0x0001, //移動(dòng)文件
FO_COPY = 0x0002, //復(fù)制文件
FO_DELETE = 0x0003, //刪除文件,只是用pFrom
FO_RENAME = 0x0004 //文件重命名
}
private enum FILEOP_FLAGS
{
FOF_MULTIDESTFILES = 0x0001, //pTo 指定了多個(gè)目標(biāo)文件,而不是單個(gè)目錄
FOF_CONFIRMMOUSE = 0x0002,
FOF_SILENT = 0x0044, // 不顯示一個(gè)進(jìn)度對(duì)話框
FOF_RENAMEONCOLLISION = 0x0008, // 碰到有抵觸的名字時(shí),自動(dòng)分配前綴
FOF_NOCONFIRMATION = 0x10, // 不對(duì)用戶顯示提示
FOF_WANTMAPPINGHANDLE = 0x0020, // 填充 hNameMappings 字段,必須使用 SHFreeNameMappings 釋放
FOF_ALLOWUNDO = 0x40, // 允許撤銷
FOF_FILESONLY = 0x0080, // 使用 *.* 時(shí), 只對(duì)文件操作
FOF_SIMPLEPROGRESS = 0x0100, // 簡(jiǎn)單進(jìn)度條,意味者不顯示文件名。
FOF_NOCONFIRMMKDIR = 0x0200, // 建新目錄時(shí)不需要用戶確定
FOF_NOERRORUI = 0x0400, // 不顯示出錯(cuò)用戶界面
FOF_NOCOPYSECURITYATTRIBS = 0x0800, // 不復(fù)制 NT 文件的安全屬性
FOF_NORECURSION = 0x1000 // 不遞歸目錄
}
#endregion 【內(nèi)部類型定義】
#region 【DllImport】
[DllImport("shell32.dll")]
private static extern int SHFileOperation(ref SHFILEOPSTRUCT lpFileOp);
#endregion 【DllImport】
#region 【刪除文件操作】
/// <summary>
/// 刪除單個(gè)文件。
/// </summary>
/// <param name="fileName">刪除的文件名</param>
/// <param name="toRecycle">指示是將文件放入回收站還是永久刪除,true-放入回收站,false-永久刪除</param>
/// <param name="showDialog">指示是否顯示確認(rèn)對(duì)話框,true-顯示確認(rèn)刪除對(duì)話框,false-不顯示確認(rèn)刪除對(duì)話框</param>
/// <param name="showProgress">指示是否顯示進(jìn)度對(duì)話框,true-顯示,false-不顯示。該參數(shù)當(dāng)指定永久刪除文件時(shí)有效</param>
/// <param name="errorMsg">反饋錯(cuò)誤消息的字符串</param>
/// <returns>操作執(zhí)行結(jié)果標(biāo)識(shí),刪除文件成功返回0,否則,返回錯(cuò)誤代碼</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">字符串?dāng)?shù)組,表示一組文件名</param>
/// <param name="toRecycle">指示是將文件放入回收站還是永久刪除,true-放入回收站,false-永久刪除</param>
/// <param name="showDialog">指示是否顯示確認(rèn)對(duì)話框,true-顯示確認(rèn)刪除對(duì)話框,false-不顯示確認(rèn)刪除對(duì)話框</param>
/// <param name="showProgress">指示是否顯示進(jìn)度對(duì)話框,true-顯示,false-不顯示。該參數(shù)當(dāng)指定永久刪除文件時(shí)有效</param>
/// <param name="errorMsg">反饋錯(cuò)誤消息的字符串</param>
/// <returns>操作執(zhí)行結(jié)果標(biāo)識(shí),刪除文件成功返回0,否則,返回錯(cuò)誤代碼</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 【移動(dòng)文件操作】
/// <summary>
/// 移動(dòng)一個(gè)文件到指定路徑下
/// </summary>
/// <param name="sourceFileName">要移動(dòng)的文件名</param>
/// <param name="destinationPath">移動(dòng)到的目的路徑</param>
/// <param name="showDialog">指示是否顯示確認(rèn)對(duì)話框,true-顯示確認(rèn)對(duì)話框,false-不顯示確認(rèn)對(duì)話框</param>
/// <param name="showProgress">指示是否顯示進(jìn)度對(duì)話框</param>
/// <param name="autoRename">指示當(dāng)文件名重復(fù)時(shí),是否自動(dòng)為新文件加上后綴名</param>
/// <param name="errorMsg">反饋錯(cuò)誤消息的字符串</param>
/// <returns>返回移動(dòng)操作是否成功的標(biāo)識(shí),成功返回0,失敗返回錯(cuò)誤代碼</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>
/// 移動(dòng)一組文件到指定的路徑下
/// </summary>
/// <param name="sourceFileNames">要移動(dòng)的文件名數(shù)組</param>
/// <param name="destinationPath">移動(dòng)到的目的路徑</param>
/// <param name="showDialog">指示是否顯示確認(rèn)對(duì)話框,true-顯示確認(rèn)對(duì)話框,false-不顯示確認(rèn)對(duì)話框</param>
/// <param name="showProgress">指示是否顯示進(jìn)度對(duì)話框</param>
/// <param name="autoRename">指示當(dāng)文件名重復(fù)時(shí),是否自動(dòng)為新文件加上后綴名</param>
/// <param name="errorMsg">反饋錯(cuò)誤消息的字符串</param>
/// <returns>返回移動(dòng)操作是否成功的標(biāo)識(shí),成功返回0,失敗返回錯(cuò)誤代碼,-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 【移動(dòng)文件操作】
#region 【復(fù)制文件操作】
/// <summary>
/// 復(fù)制一個(gè)文件到指定的文件名或路徑
/// </summary>
/// <param name="sourceFileName">要復(fù)制的文件名</param>
/// <param name="destinationFileName">復(fù)制到的目的文件名或路徑</param>
/// <param name="showDialog">指示是否顯示確認(rèn)對(duì)話框,true-顯示確認(rèn)對(duì)話框,false-不顯示確認(rèn)對(duì)話框</param>
/// <param name="showProgress">指示是否顯示進(jìn)度對(duì)話框</param>
/// <param name="autoRename">指示當(dāng)文件名重復(fù)時(shí),是否自動(dòng)為新文件加上后綴名</param>
/// <returns>返回移動(dòng)操作是否成功的標(biāo)識(shí),成功返回0,失敗返回錯(cuò)誤代碼,-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>
/// 復(fù)制一組文件到指定的路徑
/// </summary>
/// <param name="sourceFileNames">要復(fù)制的文件名數(shù)組</param>
/// <param name="destinationPath">復(fù)制到的目的路徑</param>
/// <param name="showDialog">指示是否顯示確認(rèn)對(duì)話框,true-顯示確認(rèn)對(duì)話框,false-不顯示確認(rèn)對(duì)話框</param>
/// <param name="showProgress">指示是否顯示進(jìn)度對(duì)話框</param>
/// <param name="autoRename">指示當(dāng)文件名重復(fù)時(shí),是否自動(dòng)為新文件加上后綴名</param>
/// <returns>返回移動(dòng)操作是否成功的標(biāo)識(shí),成功返回0,失敗返回錯(cuò)誤代碼,-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 【復(fù)制文件操作】
#region 【重命名文件】
/// <summary>
/// 重命名一個(gè)文件為新名稱,建議您使用更方便的Microsoft.VisualBasic.FileSystem.ReName();替換該方法
/// </summary>
/// <param name="sourceFileName">要復(fù)制的文件名</param>
/// <param name="destinationFileName">復(fù)制到的目的文件名或路徑</param>
/// <param name="showDialog">指示是否顯示確認(rèn)對(duì)話框,true-顯示確認(rèn)對(duì)話框,false-不顯示確認(rèn)對(duì)話框</param>
/// <returns>返回移動(dòng)操作是否成功的標(biāo)識(shí),成功返回0,失敗返回錯(cuò)誤代碼,-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"; //將文件名以結(jié)尾字符"\0\0"結(jié)束
lpFileOp.pTo = GetFullName(destinationFileName) + "\0\0";
lpFileOp.fFlags = FILEOP_FLAGS.FOF_NOERRORUI;
if (!showDialog)
lpFileOp.fFlags |= FILEOP_FLAGS.FOF_NOCONFIRMATION; //設(shè)定不顯示提示對(duì)話框
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()方法實(shí)現(xiàn)
/// </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>
/// 刪除單個(gè)或多個(gè)文件
/// </summary>
/// <param name="fileName">刪除的文件名,如果是多個(gè)文件,文件名之間以字符串結(jié)尾符'\0'隔開</param>
/// <param name="toRecycle">指示是將文件放入回收站還是永久刪除,true-放入回收站,false-永久刪除</param>
/// <param name="showDialog">指示是否顯示確認(rèn)對(duì)話框,true-顯示確認(rèn)刪除對(duì)話框,false-不顯示確認(rèn)刪除對(duì)話框</param>
/// <param name="showProgress">指示是否顯示進(jìn)度對(duì)話框,true-顯示,false-不顯示。該參數(shù)當(dāng)指定永久刪除文件時(shí)有效</param>
/// <param name="errorMsg">反饋錯(cuò)誤消息的字符串</param>
/// <returns>操作執(zhí)行結(jié)果標(biāo)識(shí),刪除文件成功返回0,否則,返回錯(cuò)誤代碼</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"; //將文件名以結(jié)尾字符"\0"結(jié)束
lpFileOp.fFlags = FILEOP_FLAGS.FOF_NOERRORUI;
if (toRecycle)
lpFileOp.fFlags |= FILEOP_FLAGS.FOF_ALLOWUNDO; //設(shè)定刪除到回收站
if (!showDialog)
lpFileOp.fFlags |= FILEOP_FLAGS.FOF_NOCONFIRMATION; //設(shè)定不顯示提示對(duì)話框
if (!showProgress)
lpFileOp.fFlags |= FILEOP_FLAGS.FOF_SILENT; //設(shè)定不顯示進(jìn)度對(duì)話框
lpFileOp.fAnyOperationsAborted = true;
int n = SHFileOperation(ref lpFileOp);
if (n == 0)
return 0;
string tmp = GetErrorString(n);
//.av 文件正常刪除了但也提示 402 錯(cuò)誤,不知道為什么。屏蔽之。
if ((fileName.ToLower().EndsWith(".av") && n.ToString("X") == "402"))
return 0;
errorMsg = string.Format("{0}({1})", tmp, fileName);
return n;
}
/// <summary>
/// 移動(dòng)或復(fù)制一個(gè)或多個(gè)文件到指定路徑下
/// </summary>
/// <param name="flag">操作類型,是移動(dòng)操作還是復(fù)制操作</param>
/// <param name="sourceFileName">要移動(dòng)或復(fù)制的文件名,如果是多個(gè)文件,文件名之間以字符串結(jié)尾符'\0'隔開</param>
/// <param name="destinationFileName">移動(dòng)到的目的位置</param>
/// <param name="showDialog">指示是否顯示確認(rèn)對(duì)話框,true-顯示確認(rèn)對(duì)話框,false-不顯示確認(rèn)對(duì)話框</param>
/// <param name="showProgress">指示是否顯示進(jìn)度對(duì)話框</param>
/// <param name="autoRename">指示當(dāng)文件名重復(fù)時(shí),是否自動(dòng)為新文件加上后綴名</param>
/// <param name="errorMsg">反饋錯(cuò)誤消息的字符串</param>
/// <returns>返回移動(dòng)操作是否成功的標(biāo)識(shí),成功返回0,失敗返回錯(cuò)誤代碼</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"; //將文件名以結(jié)尾字符"\0\0"結(jié)束
lpFileOp.pTo = destinationFileName + "\0\0";
lpFileOp.fFlags = FILEOP_FLAGS.FOF_NOERRORUI;
lpFileOp.fFlags |= FILEOP_FLAGS.FOF_NOCONFIRMMKDIR; //指定在需要時(shí)可以直接創(chuàng)建路徑
if (!showDialog)
lpFileOp.fFlags |= FILEOP_FLAGS.FOF_NOCONFIRMATION; //設(shè)定不顯示提示對(duì)話框
if (!showProgress)
lpFileOp.fFlags |= FILEOP_FLAGS.FOF_SILENT; //設(shè)定不顯示進(jìn)度對(duì)話框
if (autoRename)
lpFileOp.fFlags |= FILEOP_FLAGS.FOF_RENAMEONCOLLISION; //自動(dòng)為重名文件添加名稱后綴
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>
/// 獲取一個(gè)文件的全名
/// </summary>
/// <param name="fileName">文件名</param>
/// <returns>返回生成文件的完整路徑名</returns>
private static string GetFullName(string fileName)
{
FileInfo fi = new FileInfo(fileName);
return fi.FullName;
}
/// <summary>
/// 解釋錯(cuò)誤代碼
/// </summary>
/// <param name="n">代碼號(hào)</param>
/// <returns>返回關(guān)于錯(cuò)誤代碼的文字描述</returns>
private static string GetErrorString(int n)
{
if (n == 0) return string.Empty;
switch (n)
{
case 2:
return "系統(tǒng)找不到指定的文件。";
case 7:
return "存儲(chǔ)控制塊被銷毀。您是否選擇的“取消”操作?";
case 113:
return "文件已存在!";
case 115:
return "重命名文件操作,原始文件和目標(biāo)文件必須具有相同的路徑名。不能使用相對(duì)路徑。";
case 117:
return "I/O控制錯(cuò)誤";
case 123:
return "指定了重復(fù)的文件名";
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 "在試圖移動(dòng)或拷貝一個(gè)不存在的文件.";
case 1223:
return "操作被取消!";
default:
return "未識(shí)別的錯(cuò)誤代碼:" + n;
}
}
}
}
附:完整實(shí)例代碼點(diǎn)擊此處本站下載。
更多關(guān)于C#相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《C#文件操作常用技巧匯總》、《C#遍歷算法與技巧總結(jié)》、《C#程序設(shè)計(jì)之線程使用技巧總結(jié)》、《C#操作Excel技巧總結(jié)》、《C#中XML文件操作技巧匯總》、《C#常見控件用法教程》、《WinForm控件用法總結(jié)》、《C#數(shù)據(jù)結(jié)構(gòu)與算法教程》、《C#數(shù)組操作技巧總結(jié)》及《C#面向?qū)ο蟪绦蛟O(shè)計(jì)入門教程》
希望本文所述對(duì)大家C#程序設(shè)計(jì)有所幫助。
相關(guān)文章
C#/VB.NET 在PDF中添加文件包(Portfolio)的方法
這篇文章主要介紹了C#/VB.NET 在PDF中添加文件包(Portfolio)的方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2020-06-06
C#實(shí)現(xiàn)自定義打印文字和圖片的示例代碼
本文主要介紹了C#實(shí)現(xiàn)自定義打印文字和圖片的示例代碼,C#中打印其實(shí)就是自己繪圖+調(diào)用系統(tǒng)打印函數(shù),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04
C#實(shí)現(xiàn)讀取txt文件生成Word文檔
大家好,本篇文章主要講的是C#實(shí)現(xiàn)讀取txt文件生成Word文檔,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下2022-01-01
C#實(shí)現(xiàn)ComboBox自動(dòng)匹配字符
本文介紹C#如何實(shí)現(xiàn)ComboBox自動(dòng)匹配字符1.采用CustomSource當(dāng)做提示集合2. 直接使用下拉列表中的項(xiàng)作為匹配的集合,需要了解的朋友可以參考下2012-12-12
C#利用Spire.Pdf包實(shí)現(xiàn)為PDF添加數(shù)字簽名
Spire.PDF for .NET 是一款專業(yè)的基于.NET平臺(tái)的PDF文檔控制組件。它能夠讓開發(fā)人員在不使用Adobe Acrobat和其他外部控件的情況下,運(yùn)用.NET 應(yīng)用程序創(chuàng)建,閱讀,編寫和操縱PDF 文檔。本文將利用其實(shí)現(xiàn)添加數(shù)字簽名,需要的可以參考一下2022-08-08
C#基礎(chǔ):基于const與readonly的深入研究
本篇文章是對(duì)c#中const與readonly進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
C#打包部署并把.net framework框架打到安裝包的方法步驟
打包c(diǎn)#程序時(shí),有時(shí)需要添加.net framework組件到安裝包,本文就來介紹一下C#打包部署并把.net framework框架打到安裝包的方法步驟,具有一定的參考價(jià)值,感興趣的可以了解一下2023-10-10
詳解C#中的定時(shí)器Timer類及其垃圾回收機(jī)制
這篇文章主要介紹了C#中的定時(shí)器Timer類及其垃圾回收機(jī)制,講解了Timer相關(guān)的單線程異步工作,需要的朋友可以參考下2016-04-04

