项目中使用了磁盘阵列柜,每秒有上百兆的数据存入磁盘,这就有了从磁盘删除文件的需求。为了满足这一需求,我做了一个用于删除过期数据的系统服务。说来这个东西本身是很简单的,但是由于数据量的巨大价值磁盘阵列空间容量的巨大(8T,1T=1024G),在实际操作中也遇到了不少麻烦。
需求很简单,遍历磁盘指定目录下的所有目录和文件,根据一个比较规则判定文件是否过期,如果过期就删除。最初的设计也很简单,三个步骤:遍历 -> 过期检测 -> 删除。有了需求和程序框架设计,于是开始实施。
在C#中,DirectoryInfo和FileInfo为我们提供了足够的方法,在程序第一次成型的时候我主要使用了下面的方法:
遍历:DirectoryInfo.GetDirectories(),DirectoryInfo.GetFiles()
删除:DirectoryInfo.Delete(),FileInfo.Delete()
本机使用时效果很好,但实际上服务器运行就出现了问题:磁盘过大,文件过多,导致执行效率极其缓慢,甚至无法遍历出文件夹和文件,删除一个文件就需要好几分钟。当然,这和磁盘I/O有关,需要在有限的I/O下提高效率。
为了提高效率,改用API的方式。使用SHFileOperation来进行文件、文件夹的删除操作。代码见下:
using System; using System.Runtime.InteropServices; namespace FileDirectoryAPI { public class DeleteAPI { [DllImport("shell32.dll")] private static extern int SHFileOperation(ref SHFILEOPSTRUCT lpFileOp); ////// 执行删除。成功返回空,否则返回错误信息。 /// /// /// public static string Delete(string path) {