資料庫中海量檔案的批量轉移方法

來源:互聯網
上載者:User

事情的經過是這樣子的!資料庫A表添加一條記錄,**系統中B目錄下就會多出5n個檔案。隨著系統運行3年多,B目錄中的檔案數已高達2M多,而這些檔案恰恰又是使用者高度頻繁訪問的。於是問題就來了,一方面是使用者訪問檔案速度變慢了;另一方面是檔案太多,很難維護。

怎麼辦呢?思許良久,發現A表中有個錄入時間欄位是不會變更的。如果截取錄入時間的年份+月份組成,用來建立B目錄下的子目錄名,把當年當月新增的檔案統一歸檔於該子目錄下,不就可以嗎?新增的檔案好處理,可對於舊檔案歸檔需要費點周折,因為檔案得遷移到新的子目錄裡。

下面是關於檔案遷移的主要代碼:

 
  1.  static void Main(string[] args)   
  2. {   
  3.    string paperPath = ConfigurationManager.AppSettings["PaperBuildPath"];   
  4.   Console.WriteLine(string.Format("試卷目錄:{0}", paperPath));   
  5.  Console.WriteLine();   
  6.   Console.WriteLine("目錄是否正確? 正確請按任意鍵......");   
  7.   Console.WriteLine();   
  8.  Console.ReadKey();   
  9.   string[] files = Directory.GetFiles(paperPath);   
  10.  int num = 0;   
  11.   PublicExam[] list = Gateway.Default.FindArray<PublicExam>();   
  12.  foreach (PublicExam publicExam in list)   
  13. {   
  14.   foreach (string file in files)   
  15.     {   
  16.       //源檔案名稱(去除路徑後)   
  17.       string fileName = file.Split('\\').Last();   
  18.  if (fileName.StartsWith(publicExam.FGuid.ToString(), StringComparison.CurrentCultureIgnoreCase))   
  19.       {   
  20.          //目標檔案夾   
  21.          string destFilePath = paperPath + publicExam.FInputTime.ToString("yyyyMM");   
  22.       if (Directory.Exists(destFilePath) == false)   
  23.            Directory.CreateDirectory(destFilePath);   
  24.       //目標檔案名   
  25.        string destFileName = destFilePath + "\\" + fileName;   
  26.       if (File.Exists(destFileName))   
  27.           File.Delete(destFileName);   
  28.          Console.WriteLine(string.Format("正在遷移檔案:{0}", fileName));   
  29.       //遷移檔案   
  30.        File.Move(file, destFileName);   
  31.       num++;   
  32.        }   
  33.      }   
  34.     }   
  35.   Console.WriteLine();   
  36.  Console.WriteLine(string.Format("共遷移{0}個檔案,請按任意鍵退出......", num));   
  37.    Console.ReadKey();   
  38.  }  

上面例子參考了MSDN 關於File Class 和 Directory Class 的使用方法。

執行如下:

Tips:

目錄名(年份+月份) 如:201101

c#   => DateTime.Now.ToString("yyyyMM")

SQL => convert(varchar(6),getdate(),112)

當然僅僅檔案遷移是不夠的,還有很多工作要做,比如修改程式;更新資料庫表記錄等等。我知道,這次“手術”不符合開放-關閉原則。

帶您瞭解Oracle檔案系統機制

詳解MongoDB實現儲存物理檔案和SQUID加速

對DB2外部檔案格式的闡述

DB2外部檔案格式淺析

Oracle資料庫檔案管理經驗談

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.