數(shù)據(jù)庫(kù)中海量文件的批量轉(zhuǎn)移方法
事情的經(jīng)過是這樣子的!數(shù)據(jù)庫(kù)A表添加一條記錄,**系統(tǒng)中B目錄下就會(huì)多出5n個(gè)文件。隨著系統(tǒng)運(yùn)行3年多,B目錄中的文件數(shù)已高達(dá)2M多,而這些文件恰恰又是用戶高度頻繁訪問的。于是問題就來(lái)了,一方面是用戶訪問文件速度變慢了;另一方面是文件太多,很難維護(hù)。
怎么辦呢?思許良久,發(fā)現(xiàn)A表中有個(gè)錄入時(shí)間字段是不會(huì)變更的。如果截取錄入時(shí)間的年份+月份組成,用來(lái)創(chuàng)建B目錄下的子目錄名,把當(dāng)年當(dāng)月新增的文件統(tǒng)一歸檔于該子目錄下,不就可以嗎?新增的文件好處理,可對(duì)于舊文件歸檔需要費(fèi)點(diǎn)周折,因?yàn)槲募眠w移到新的子目錄里。
下面是關(guān)于文件遷移的主要代碼:
- static void Main(string[] args)
- {
- string paperPath = ConfigurationManager.AppSettings["PaperBuildPath"];
- Console.WriteLine(string.Format("試卷目錄:{0}", paperPath));
- Console.WriteLine();
- Console.WriteLine("目錄是否正確? 正確請(qǐng)按任意鍵......");
- Console.WriteLine();
- Console.ReadKey();
- string[] files = Directory.GetFiles(paperPath);
- int num = 0;
- PublicExam[] list = Gateway.Default.FindArray<PublicExam>();
- foreach (PublicExam publicExam in list)
- {
- foreach (string file in files)
- {
- //源文件名(去除路徑后)
- string fileName = file.Split('\\').Last();
- if (fileName.StartsWith(publicExam.FGuid.ToString(), StringComparison.CurrentCultureIgnoreCase))
- {
- //目標(biāo)文件夾
- string destFilePath = paperPath + publicExam.FInputTime.ToString("yyyyMM");
- if (Directory.Exists(destFilePath) == false)
- Directory.CreateDirectory(destFilePath);
- //目標(biāo)文件名
- string destFileName = destFilePath + "\\" + fileName;
- if (File.Exists(destFileName))
- File.Delete(destFileName);
- Console.WriteLine(string.Format("正在遷移文件:{0}", fileName));
- //遷移文件
- File.Move(file, destFileName);
- num++;
- }
- }
- }
- Console.WriteLine();
- Console.WriteLine(string.Format("共遷移{0}個(gè)文件,請(qǐng)按任意鍵退出......", num));
- Console.ReadKey();
- }
上面例子參考了MSDN 關(guān)于File Class 和 Directory Class 的使用方法。
執(zhí)行效果圖如下:
Tips:
目錄名(年份+月份) 如:201101
c# => DateTime.Now.ToString("yyyyMM")
SQL => convert(varchar(6),getdate(),112)
當(dāng)然僅僅文件遷移是不夠的,還有很多工作要做,比如修改程序;更新數(shù)據(jù)庫(kù)表記錄等等。我知道,這次“手術(shù)”不符合開放-關(guān)閉原則。
原文鏈接:http://www.cnblogs.com/hailibu/archive/2011/01/05/1926361.html
【編輯推薦】
詳解MongoDB實(shí)現(xiàn)存儲(chǔ)物理文件和SQUID加速
Oracle數(shù)據(jù)庫(kù)文件管理經(jīng)驗(yàn)談