魏自鵬
摘要:針對(duì)電子文件向檔案數(shù)據(jù)庫歸檔環(huán)節(jié),往往需要大量更改文件名的問題,文章梳理了如何借助C#語言編寫相應(yīng)的桌面應(yīng)用程序,以實(shí)現(xiàn)文件名的批量更改和電子文件的順利入庫,從而打通電子文件向檔案數(shù)據(jù)庫轉(zhuǎn)入的“最后一公里”,切實(shí)提高工作效率,節(jié)省人力資源。
關(guān)鍵詞:C#語言;電子文件;批量處理;更名;歸檔
中圖分類號(hào):G270.7? ? ? 文獻(xiàn)標(biāo)識(shí)碼:A
文章編號(hào):1009-3044(2021)06-0083-03
Abstract: In view of the problem that a large number of file names need to be changed in the process of filing electronic documents into archives database, this paper combs out how to write corresponding desktop application programs with the help of C# language, so as to realize batch change of file names and smooth storage of electronic documents, so as to get through the "last kilometer" of electronic documents transferred to archives database, effectively improve work efficiency and save manpower resources.
Key words: C# language; electronic documents; batch processing; rename; filing
隨著計(jì)算機(jī)技術(shù)的普及應(yīng)用以及檔案信息化、數(shù)字化的不斷推進(jìn),電子文件(包括紙質(zhì)檔案數(shù)字化副本)大量產(chǎn)生,其分類整理、數(shù)據(jù)掛接入庫等已成為常態(tài)化工作[1]。然而,工作中電子文件名多數(shù)不規(guī)范或不符合要求,需要重新修改,以便更快捷地掛接入庫。面對(duì)大量的電子文件名更改工作,如能實(shí)現(xiàn)批量自動(dòng)處理,將能大幅度提高工作效率和準(zhǔn)確性。為此,本文通過對(duì)檔案工作實(shí)踐和流程的深入思考,探討如何利用C#編程語言編寫相應(yīng)桌面應(yīng)用程序以實(shí)現(xiàn)電子文件名批量更改和歸檔入庫。
1 設(shè)計(jì)概述
電子文件名批量處理常用功能包括替換、刪除、添加前后綴、提取、截取、整體更改等??傮w思路是通過遍歷文件夾中的所有電子文件,然后提取電子文件名并轉(zhuǎn)化為字符串,通過對(duì)字符串的修改處理,最后再對(duì)文件重新命名。這些功能可以集成簡單的Windows桌面應(yīng)用程序工具。
2 代碼實(shí)現(xiàn)
電子文件名批量處理功能的代碼實(shí)現(xiàn)主要運(yùn)用String、StringBuilder、File、FileInfo、Directory和DirectoryInfo類以及C#與EXCEL表的互操作[2-3]。
2.1 文件名批量替換
本功能可以實(shí)現(xiàn)文件名字符的批量替換,如將“【2019】”全部替換為“〔2020〕”。為便于說明問題,先做一個(gè)簡單的桌面應(yīng)用實(shí)例(圖1),主要代碼如下:
[? ? ? ? private void btnSelect_Click(object sender, EventArgs e)
{
//選擇文件夾
FolderBrowserDialog folderPath = new FolderBrowserDialog();
if (folderPath.ShowDialog() == DialogResult.OK)
{
this.textBoxFolder.Text = folderPath.SelectedPath;
}
}
private void btnBegin_Click(object sender, EventArgs e)
{
DirectoryInfo directoryInfo = new DirectoryInfo(textBoxFolder.Text);
foreach (FileInfo file in directoryInfo.GetFiles())
{
String strb = file.Name;
strb = strb.Replace(textBoxSource.Text, textBoxReplace.Text);
Boolean boolean = true;
if (file.Name.Equals(strb))
boolean = false;//目的是區(qū)分文件名中字符的大小寫,比如將大寫Y改為小寫y,因?yàn)閃indows中文件名是不區(qū)分大小寫的;
if (boolean)
file.MoveTo(@textBoxFolder.Text + "\\" + strb);
}
} ]
本實(shí)例能夠?qū)崿F(xiàn)文件夾中文件名的批量替換功能,并區(qū)分字符的大小寫。為簡明起見,本文所列實(shí)例只給出主要代碼,省去名稱空間、類庫的引用以及異常處理等,僅供參考。
2.2 添加文件名前、后綴
本功能可實(shí)現(xiàn)在文件名前面或后面添加相應(yīng)字符,也可根據(jù)需要添加遞增數(shù)字,如在添加固定前綴“WS.2020-”后自動(dòng)添加4位數(shù)遞增數(shù)字“0001-n”,其簡單桌面式樣如圖2所示。
1)添加固定前綴的主要代碼
[foreach (FileInfo file in directoryInfo.GetFiles())
{
StringBuilder strb = new StringBuilder(file.Name);
strb.Insert(0, textBoxPrefix.Text.ToString());
file.MoveTo(@textBoxFolder.Text + "\\" + strb);
} ]
2)添加遞增前綴的主要代碼
[private void SortAsFileName(ref FileInfo[] arrFiles)
{
Array.Sort(arrFiles, delegate (FileInfo x, FileInfo y) { return x.Name.CompareTo(y.Name); });
}
DirectoryInfo directoryInfo = new DirectoryInfo(textBoxFolder.Text);
int i = 0;
try
{
i = Convert.ToInt32(textBoxSuffix.Text);
}
catch (Exception)
{
MessageBox.Show("輸入格式不正確,默認(rèn)從0開始!");
}
FileInfo[] arrFiles = directoryInfo.GetFiles();
SortAsFileName(ref arrFiles);//按照文件名稱進(jìn)行排序,也可根據(jù)需要按照其他方式排序;
foreach (FileInfo file in arrFiles)
{
StringBuilder strb = new StringBuilder(file.Name);
int length = textBoxPrefix.Text.ToString().Length;
strb.Insert(length, String.Format("{0:D4}", i++));//保留4位有效數(shù)字,不足部分補(bǔ)零;
file.MoveTo(@textBoxFolder.Text + "\\" + strb);
} ]
添加后綴功能與前綴類似,不再贅述。
2.3 文件名批量截取
本功能主要實(shí)現(xiàn)將文件名中的部分字符截取并保留下來作為文件名(當(dāng)然,同一文件夾中截取后的文件名不能重復(fù)),根據(jù)需要可設(shè)置截取的首尾字符或截取的起始字符位置數(shù)和保存長度(圖3),如從第2個(gè)字符開始,截取6個(gè)字符,然后將文件名改為截取后的字符串名。主要代碼如下:
[foreach (FileInfo file in directoryInfo.GetFiles())
{
string strb = file.Name;
int index1 = int.Parse(textBoxStart.Text);
int index2 = int.Parse(textBoxLength.Text);
int index3 = strb.LastIndexOf(".");
string str1 = strb.Substring(index1 - 1, index2);
string str2 = strb.Substring(index3);
StringBuilder strCombine = new StringBuilder(str1);
strCombine.Append(str2);
file.MoveTo(@textBoxFolder.Text + "\\" + strCombine.ToString());
} ]
2.4 文件名提取及與EXCEL表的互操作
本功能可實(shí)現(xiàn)將文件夾中的文件名提取出來然后導(dǎo)入EXCEL表中的某一列(如第1列,設(shè)為“原文件名”列),然后再在EXCEL表中的某一列(如第5列,設(shè)為“新文件名”列)對(duì)應(yīng)行位置輸入要更改的文件名,之后再將文件夾中的文件名(“原文件名”列)更改為新的文件名(“新文件名”列),這樣可以利用EXCEL表實(shí)現(xiàn)文件名的提取和任意修改[4]。其主要代碼如下:
1)文件名提取并導(dǎo)入EXCEL表
[string filePath = @"D:\ myExcel.xlsx";//設(shè)置要導(dǎo)入的EXCEL表保存路徑
dynamic appExcel = new Application();
appExcel.DisplayAlerts = false;
appExcel.Visible = true;
dynamic excelDoc = appExcel.Workbooks.Add(true);
dynamic worksheet1 = excelDoc.Sheets[1];
worksheet1.Cells[1, "a"] = "原文件名";
worksheet1.Cells[1, "e"] = "新文件名";
int count = 1;
FileInfo[] arrFiles = directoryInfo.GetFiles();
SortAsFileName(ref arrFiles);
foreach (FileInfo file in arrFiles)
{
count++;
worksheet1.Cells[count, "a"] = file.Name;
}
excelDoc.SaveAs(filePath); ]
2) 根據(jù)EXCEL表中“新文件名”列的內(nèi)容修改文件名
[dynamic excelDoc = appExcel.Workbooks.Open(filePath);
dynamic worksheet1 = excelDoc.Sheets[1];
foreach (FileInfo file in directoryInfo.GetFiles())
{
string strb = file.Name;
int index = strb.LastIndexOf(".");
string str1 = strb.Substring(0, index);
string str2;
for (int i = 2; i <= directoryInfo.GetFiles().Length + 1; i++)
{
if (worksheet1.Cells[i, "e"].value == null||worksheet1.Cells[i, "e"].value.ToString() == ""? )
continue;
if (strb.Equals(worksheet1.Cells[i, "a"].value.ToString()))
{
str2 = worksheet1.Cells[i, "e"].value.ToString();
strb = strb.Replace(str1, str2);
}
}
file.MoveTo(@textBoxFolder.Text + "\\" + strb);
} ]
3 實(shí)際應(yīng)用
上述功能可大量應(yīng)用于電子文件、數(shù)字化檔案副本等向檔案系統(tǒng)數(shù)據(jù)庫掛接歸檔過程中。通常情況下,檔案數(shù)據(jù)庫在掛接電子文件時(shí)是按照“檔號(hào)”“文號(hào)”“題名”等字段進(jìn)行批量掛接的,然而日常工作中形成的電子文件名往往與數(shù)據(jù)庫中的字段不一致,且多數(shù)不夠統(tǒng)一規(guī)范,甚至無序,這就需要對(duì)電子文件名進(jìn)行重新修改和調(diào)整,以便能夠批量掛接入庫。如某文件夾下一些電子文件(圖4),欲批量修改為遞增“檔號(hào)”,可先添加固定前綴 “Z119-WS.2020-BGS-Y-”[5],再添加遞增起始數(shù)字“1”,然后再運(yùn)用截取功能從首字符開始截取23個(gè)字符即可實(shí)現(xiàn)按“檔號(hào)”重新命名(圖5),以實(shí)現(xiàn)電子文件按“檔號(hào)”自動(dòng)掛接進(jìn)入檔案數(shù)據(jù)庫。該示例也可運(yùn)用文件名提取功能,先提取出電子文件名保存至EXCEL表中第1列(圖6),再根據(jù)需要在第5列中填充要修改的新文件名(圖7),最后通過程序也能實(shí)現(xiàn)批量更名目的(圖5)。
4 結(jié)束語
本文所有代碼都在Visual Studio 2019中進(jìn)行了成功調(diào)試,并經(jīng)過大量實(shí)際工作的驗(yàn)證,在檔案數(shù)字化加工、電子文件掛接入庫中具有較多應(yīng)用,較好地打通了電子文件向數(shù)據(jù)庫歸檔的“最后一公里”,實(shí)現(xiàn)電子文件歸檔的全程加速,并以客觀標(biāo)準(zhǔn)代替主觀操作,能夠切實(shí)提高工作效率和準(zhǔn)確性,節(jié)省大量人力資源。日常工作中,檔案工作者應(yīng)積極嘗試運(yùn)用計(jì)算機(jī)等先進(jìn)技術(shù),深入思考檔案工作流程,創(chuàng)新工作方法,努力減少重復(fù)繁雜的工作,不斷提高檔案工作的自動(dòng)化和智能化水平。
參考文獻(xiàn):
[1] 龐海濤.檔案數(shù)字化前處理工作概論[M].北京:中國文史出版社,2018.
[2] Benjamin Perkins,Jacob Vibe Hammer,Jon D Reid.C#入門經(jīng)典[M].北京:清華大學(xué)出版社,2016.
[3] 向燕飛.C#程序設(shè)計(jì)案例教程[M].北京:清華大學(xué)出版社,2018.
[4] 軟件開發(fā)技術(shù)聯(lián)盟.C#開發(fā)實(shí)例大全-提高卷[M].北京:清華大學(xué)出版社,2016.
[5] 李明華.歸檔文件整理規(guī)則解讀[M].北京:中國文史出版社,2016.
【通聯(lián)編輯:謝媛媛】