C#强力粉碎文件代码分享,升级中用到

360的文件粉碎机还是很强大的,在我们客户端winform升级的时候,必须将有些文件进行强力删除后下载更新,如果删除失败很有可能整个 程序就无法更新到最新的版本,所以这里参考了网上的资料整理了一个文件粉碎的小demo,总结了一个类出来,方便以后升级或者其他开发工作的调用

程序运行界面截图

操作gif动画图片

整理的实际类,为了以后使用,提高工作效率

//-------------------------------------------------------------------------------------
// All Rights Reserved , Copyright (C) 2015 , ZTO , Ltd .
//-------------------------------------------------------------------------------------

using System;
using System.Diagnostics;
using System.IO;
using System.Text.RegularExpressions;

namespace ZTO.WayBill.Utilities
{
    /// <summary>
    /// 文件帮助类
    ///
    /// 修改纪录
    ///
    ///          2015-6-5  版本:1.0 YangHengLian 创建主键,注意命名空间的排序。
    /// 
    /// 版本:1.0
    ///
    /// <author>
    ///        <name>YangHengLian</name>
    ///        <date>2015-6-5</date>
    /// </author>
    /// </summary>
    public class FileHelper
    {
        /// <summary>
        /// 强力粉碎文件,文件如果被打开,很难粉碎
        /// </summary>
        /// <param name="filename">文件全路径</param>
        /// <param name="deleteCount">删除次数</param>
        /// <param name="randomData">随机数据填充文件,默认true</param>
        /// <param name="blanks">空白填充文件,默认false</param>
        /// <returns>true:粉碎成功,false:粉碎失败</returns>
        public static bool KillFile(string filename, int deleteCount, bool randomData = true, bool blanks = false)
        {
            const int bufferLength = 1024000;
            bool ret = true;
            try
            {
                using (FileStream stream = new FileStream(filename, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite))
                {
                    FileInfo f = new FileInfo(filename);
                    long count = f.Length;
                    long offset = 0;
                    var rowDataBuffer = new byte[bufferLength];
                    while (count >= 0)
                    {
                        int iNumOfDataRead = stream.Read(rowDataBuffer, 0, bufferLength);
                        if (iNumOfDataRead == 0)
                        {
                            break;
                        }
                        if (randomData)
                        {
                            Random randombyte = new Random();
                            randombyte.NextBytes(rowDataBuffer);
                        }
                        else if (blanks)
                        {
                            for (int i = 0; i < iNumOfDataRead; i++)
                                rowDataBuffer[i] = 0;
                        }
                        else
                        {
                            for (int i = 0; i < iNumOfDataRead; i++)
                                rowDataBuffer[i] = Convert.ToByte(Convert.ToChar(deleteCount));
                        }
                        // 写新内容到文件。
                        for (int i = 0; i < deleteCount; i++)
                        {
                            stream.Seek(offset, SeekOrigin.Begin);
                            stream.Write(rowDataBuffer, 0, iNumOfDataRead);
                        }
                        offset += iNumOfDataRead;
                        count -= iNumOfDataRead;
                    }
                }
                //每一个文件名字符代替随机数从0到9。
                string newName = "";
                do
                {
                    Random random = new Random();
                    string cleanName = Path.GetFileName(filename);
                    string dirName = Path.GetDirectoryName(filename);
                    int iMoreRandomLetters = random.Next(9);
                    // 为了更安全,不要只使用原文件名的大小,添加一些随机字母。
                    for (int i = 0; i < cleanName.Length + iMoreRandomLetters; i++)
                    {
                        newName += random.Next(9).ToString();
                    }
                    newName = dirName + "\\" + newName;
                } while (File.Exists(newName));
                // 重命名文件的新的随机的名字。
                File.Move(filename, newName);
                File.Delete(newName);
            }
            catch
            {
                //可能其他原因删除失败了,使用我们自己的方法强制删除
                try
                {
                    string fileName = filename;//要检查被那个进程占用的文件
                    Process tool = new Process { StartInfo = { FileName = "handle.exe", Arguments = fileName + " /accepteula", UseShellExecute = false, RedirectStandardOutput = true } };
                    tool.Start();
                    tool.WaitForExit();
                    string outputTool = tool.StandardOutput.ReadToEnd();
                    string matchPattern = @"(?<=\s+pid:\s+)\b(\d+)\b(?=\s+)";
                    foreach (Match match in Regex.Matches(outputTool, matchPattern))
                    {

                        //结束掉所有正在使用这个文件的程序
                        Process.GetProcessById(int.Parse(match.Value)).Kill();
                    }
                    File.Delete(fileName);
                }
                catch
                {
                    ret = false;
                }
            }
            return ret;
        }
    }
}

例子demo:http://download.csdn.net/detail/mryanghenglian/8775447

posted @ 2015-06-05 13:18  小菜鸟叽叽喳喳  阅读(3844)  评论(7编辑  收藏  举报