魏自鹏
摘要:针对电子文件向档案数据库归档环节,往往需要大量更改文件名的问题,文章梳理了如何借助C#语言编写相应的桌面应用程序,以实现文件名的批量更改和电子文件的顺利入库,从而打通电子文件向档案数据库转入的“最后一公里”,切实提高工作效率,节省人力资源。
关键词:C#语言;电子文件;批量处理;更名;归档
中图分类号:G270.7 文献标识码:A
文章编号: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
随着计算机技术的普及应用以及档案信息化、数字化的不断推进,电子文件(包括纸质档案数字化副本)大量产生,其分类整理、数据挂接入库等已成为常态化工作[1]。然而,工作中电子文件名多数不规范或不符合要求,需要重新修改,以便更快捷地挂接入库。面对大量的电子文件名更改工作,如能实现批量自动处理,将能大幅度提高工作效率和准确性。为此,本文通过对档案工作实践和流程的深入思考,探讨如何利用C#编程语言编写相应桌面应用程序以实现电子文件名批量更改和归档入库。
1 设计概述
電子文件名批量处理常用功能包括替换、删除、添加前后缀、提取、截取、整体更改等。总体思路是通过遍历文件夹中的所有电子文件,然后提取电子文件名并转化为字符串,通过对字符串的修改处理,最后再对文件重新命名。这些功能可以集成简单的Windows桌面应用程序工具。
2 代码实现
电子文件名批量处理功能的代码实现主要运用String、StringBuilder、File、FileInfo、Directory和DirectoryInfo类以及C#与EXCEL表的互操作[2-3]。
2.1 文件名批量替换
本功能可以实现文件名字符的批量替换,如将“【2019】”全部替换为“〔2020〕”。为便于说明问题,先做一个简单的桌面应用实例(图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;//目的是区分文件名中字符的大小写,比如将大写Y改为小写y,因为Windows中文件名是不区分大小写的;
if (boolean)
file.MoveTo(@textBoxFolder.Text + "\\" + strb);
}
} ]
本实例能够实现文件夹中文件名的批量替换功能,并区分字符的大小写。为简明起见,本文所列实例只给出主要代码,省去名称空间、类库的引用以及异常处理等,仅供参考。
2.2 添加文件名前、后缀
本功能可实现在文件名前面或后面添加相应字符,也可根据需要添加递增数字,如在添加固定前缀“WS.2020-”后自动添加4位数递增数字“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("输入格式不正确,默认从0开始!");
}
FileInfo[] arrFiles = directoryInfo.GetFiles();
SortAsFileName(ref arrFiles);//按照文件名称进行排序,也可根据需要按照其他方式排序;
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位有效数字,不足部分补零;
file.MoveTo(@textBoxFolder.Text + "\\" + strb);
} ]
添加后缀功能与前缀类似,不再赘述。
2.3 文件名批量截取
本功能主要实现将文件名中的部分字符截取并保留下来作为文件名(当然,同一文件夹中截取后的文件名不能重复),根据需要可设置截取的首尾字符或截取的起始字符位置数和保存长度(图3),如从第2个字符开始,截取6个字符,然后将文件名改为截取后的字符串名。主要代码如下:
[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表的互操作
本功能可实现将文件夹中的文件名提取出来然后导入EXCEL表中的某一列(如第1列,设为“原文件名”列),然后再在EXCEL表中的某一列(如第5列,设为“新文件名”列)对应行位置输入要更改的文件名,之后再将文件夹中的文件名(“原文件名”列)更改为新的文件名(“新文件名”列),这样可以利用EXCEL表实现文件名的提取和任意修改[4]。其主要代码如下:
1)文件名提取并导入EXCEL表
[string filePath = @"D:\ myExcel.xlsx";//设置要导入的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) 根據EXCEL表中“新文件名”列的内容修改文件名
[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 实际应用
上述功能可大量应用于电子文件、数字化档案副本等向档案系统数据库挂接归档过程中。通常情况下,档案数据库在挂接电子文件时是按照“档号”“文号”“题名”等字段进行批量挂接的,然而日常工作中形成的电子文件名往往与数据库中的字段不一致,且多数不够统一规范,甚至无序,这就需要对电子文件名进行重新修改和调整,以便能够批量挂接入库。如某文件夹下一些电子文件(图4),欲批量修改为递增“档号”,可先添加固定前缀 “Z119-WS.2020-BGS-Y-”[5],再添加递增起始数字“1”,然后再运用截取功能从首字符开始截取23个字符即可实现按“档号”重新命名(图5),以实现电子文件按“档号”自动挂接进入档案数据库。该示例也可运用文件名提取功能,先提取出电子文件名保存至EXCEL表中第1列(图6),再根据需要在第5列中填充要修改的新文件名(图7),最后通过程序也能实现批量更名目的(图5)。
4 结束语
本文所有代码都在Visual Studio 2019中进行了成功调试,并经过大量实际工作的验证,在档案数字化加工、电子文件挂接入库中具有较多应用,较好地打通了电子文件向数据库归档的“最后一公里”,实现电子文件归档的全程加速,并以客观标准代替主观操作,能够切实提高工作效率和准确性,节省大量人力资源。日常工作中,档案工作者应积极尝试运用计算机等先进技术,深入思考档案工作流程,创新工作方法,努力减少重复繁杂的工作,不断提高档案工作的自动化和智能化水平。
参考文献:
[1] 庞海涛.档案数字化前处理工作概论[M].北京:中国文史出版社,2018.
[2] Benjamin Perkins,Jacob Vibe Hammer,Jon D Reid.C#入门经典[M].北京:清华大学出版社,2016.
[3] 向燕飞.C#程序设计案例教程[M].北京:清华大学出版社,2018.
[4] 软件开发技术联盟.C#开发实例大全-提高卷[M].北京:清华大学出版社,2016.
[5] 李明华.归档文件整理规则解读[M].北京:中国文史出版社,2016.
【通联编辑:谢媛媛】