C#中使用API(SHFileOperation)进行文件操作,特别说明了回收站相关参数

本文介绍了在C#中如何使用API SHFileOperation进行文件和目录的操作,以提高删除效率。特别强调了SHFILEOPSTRUCT.fFlags属性中的FOF_ALLOWUNDO标志,说明了其在删除操作中的作用,即默认删除到回收站,并指出了如何实现直接删除不进入回收站的方法。
摘要由CSDN通过智能技术生成
项目中使用了磁盘阵列柜,每秒有上百兆的数据存入磁盘,这就有了从磁盘删除文件的需求。为了满足这一需求,我做了一个用于删除过期数据的系统服务。说来这个东西本身是很简单的,但是由于数据量的巨大价值磁盘阵列空间容量的巨大(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)
        {
     
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值