欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#實現(xiàn)的文件操作封裝類完整實例【刪除,移動,復制,重命名】

 更新時間:2017年03月10日 10:13:52   作者:Rising_Sun  
這篇文章主要介紹了C#實現(xiàn)的文件操作封裝類,結合完整實例形式分析了C#封裝文件的刪除,移動,復制,重命名等操作相關實現(xiàn)技巧,需要的朋友可以參考下

本文實例講述了C#實現(xiàn)的文件操作封裝類。分享給大家供大家參考,具體如下:

最近發(fā)現(xiàn)群共享里面有個C# 文件操作封裝類,其方法是調用Windows API 來操作的文件的刪除、移動、復制、重命名操作。下載下來一試,發(fā)現(xiàn)果然不錯,特在此記錄,以防丟失!

文件操作類代碼如下:

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;     //要執(zhí)行的動作
      public string pFrom;    //源文件路徑,可以是多個文件,以結尾符號"\0"結束
      public string pTo;     //目標路徑,可以是路徑或文件名
      public FILEOP_FLAGS fFlags;       //標志,附加選項
      public bool fAnyOperationsAborted;   //是否可被中斷
      public IntPtr hNameMappings;      //文件映射名字,可在其它 Shell 函數(shù)中使用
      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-不顯示。該參數(shù)當指定永久刪除文件時有效</param>
    /// <param name="errorMsg">反饋錯誤消息的字符串</param>
    /// <returns>操作執(zhí)行結果標識,刪除文件成功返回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">字符串數(shù)組,表示一組文件名</param>
    /// <param name="toRecycle">指示是將文件放入回收站還是永久刪除,true-放入回收站,false-永久刪除</param>
    /// <param name="showDialog">指示是否顯示確認對話框,true-顯示確認刪除對話框,false-不顯示確認刪除對話框</param>
    /// <param name="showProgress">指示是否顯示進度對話框,true-顯示,false-不顯示。該參數(shù)當指定永久刪除文件時有效</param>
    /// <param name="errorMsg">反饋錯誤消息的字符串</param>
    /// <returns>操作執(zhí)行結果標識,刪除文件成功返回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">要移動的文件名數(shù)組</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">要復制的文件名數(shù)組</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()方法實現(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>
    /// 刪除單個或多個文件
    /// </summary>
    /// <param name="fileName">刪除的文件名,如果是多個文件,文件名之間以字符串結尾符'\0'隔開</param>
    /// <param name="toRecycle">指示是將文件放入回收站還是永久刪除,true-放入回收站,false-永久刪除</param>
    /// <param name="showDialog">指示是否顯示確認對話框,true-顯示確認刪除對話框,false-不顯示確認刪除對話框</param>
    /// <param name="showProgress">指示是否顯示進度對話框,true-顯示,false-不顯示。該參數(shù)當指定永久刪除文件時有效</param>
    /// <param name="errorMsg">反饋錯誤消息的字符串</param>
    /// <returns>操作執(zhí)行結果標識,刪除文件成功返回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; //指定在需要時可以直接創(chuàng)建路徑
      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 "系統(tǒng)找不到指定的文件。";
        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#數(shù)據(jù)結構與算法教程》、《C#數(shù)組操作技巧總結》及《C#面向對象程序設計入門教程

希望本文所述對大家C#程序設計有所幫助。

相關文章

  • C#/VB.NET 在PDF中添加文件包(Portfolio)的方法

    C#/VB.NET 在PDF中添加文件包(Portfolio)的方法

    這篇文章主要介紹了C#/VB.NET 在PDF中添加文件包(Portfolio)的方法,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2020-06-06
  • C#實現(xiàn)自定義打印文字和圖片的示例代碼

    C#實現(xiàn)自定義打印文字和圖片的示例代碼

    本文主要介紹了C#實現(xiàn)自定義打印文字和圖片的示例代碼,C#中打印其實就是自己繪圖+調用系統(tǒng)打印函數(shù),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-04-04
  • C#實現(xiàn)讀取txt文件生成Word文檔

    C#實現(xiàn)讀取txt文件生成Word文檔

    大家好,本篇文章主要講的是C#實現(xiàn)讀取txt文件生成Word文檔,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-01-01
  • C#實現(xiàn)ComboBox自動匹配字符

    C#實現(xiàn)ComboBox自動匹配字符

    本文介紹C#如何實現(xiàn)ComboBox自動匹配字符1.采用CustomSource當做提示集合2. 直接使用下拉列表中的項作為匹配的集合,需要了解的朋友可以參考下
    2012-12-12
  • Unity常用命令模式詳解

    Unity常用命令模式詳解

    這篇文章主要為大家詳細介紹了Unity常用命令模式的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-03-03
  • C#利用Spire.Pdf包實現(xiàn)為PDF添加數(shù)字簽名

    C#利用Spire.Pdf包實現(xiàn)為PDF添加數(shù)字簽名

    Spire.PDF for .NET 是一款專業(yè)的基于.NET平臺的PDF文檔控制組件。它能夠讓開發(fā)人員在不使用Adobe Acrobat和其他外部控件的情況下,運用.NET 應用程序創(chuàng)建,閱讀,編寫和操縱PDF 文檔。本文將利用其實現(xiàn)添加數(shù)字簽名,需要的可以參考一下
    2022-08-08
  • C#基礎:基于const與readonly的深入研究

    C#基礎:基于const與readonly的深入研究

    本篇文章是對c#中const與readonly進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • c#項目將dll打包到exe中的步驟

    c#項目將dll打包到exe中的步驟

    這篇文章主要介紹了c#項目將dll打包到exe中的步驟,幫助大家更好的理解和學習使用c#,感興趣的朋友可以了解下
    2021-04-04
  • C#打包部署并把.net framework框架打到安裝包的方法步驟

    C#打包部署并把.net framework框架打到安裝包的方法步驟

    打包c#程序時,有時需要添加.net framework組件到安裝包,本文就來介紹一下C#打包部署并把.net framework框架打到安裝包的方法步驟,具有一定的參考價值,感興趣的可以了解一下
    2023-10-10
  • 詳解C#中的定時器Timer類及其垃圾回收機制

    詳解C#中的定時器Timer類及其垃圾回收機制

    這篇文章主要介紹了C#中的定時器Timer類及其垃圾回收機制,講解了Timer相關的單線程異步工作,需要的朋友可以參考下
    2016-04-04

最新評論