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 = ;
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 = ;
var rowDataBuffer = new byte[bufferLength];
while (count >= )
{
int iNumOfDataRead = stream.Read(rowDataBuffer, , bufferLength);
if (iNumOfDataRead == )
{
break;
}
if (randomData)
{
Random randombyte = new Random();
randombyte.NextBytes(rowDataBuffer);
}
else if (blanks)
{
for (int i = ; i < iNumOfDataRead; i++)
rowDataBuffer[i] = ;
}
else
{
for (int i = ; i < iNumOfDataRead; i++)
rowDataBuffer[i] = Convert.ToByte(Convert.ToChar(deleteCount));
}
// 写新内容到文件。
for (int i = ; i < deleteCount; i++)
{
stream.Seek(offset, SeekOrigin.Begin);
stream.Write(rowDataBuffer, , 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();
// 为了更安全,不要只使用原文件名的大小,添加一些随机字母。
for (int i = ; i < cleanName.Length + iMoreRandomLetters; i++)
{
newName += random.Next().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

C#强力粉碎文件代码分享,升级中用到的更多相关文章

  1. SharePoint 压缩打包文件代码分享

    前言 最近碰到这样一个需求,用户需要批量打包下载sharepoint文档库中的文档,所以,就需要开发一个打包下载的服务. 然后,把打包的代码分享给大家,也许会有需要的人. static void Ma ...

  2. .net之工作流工程展示及代码分享(三)数据存储引擎

    数据存储引擎是本项目里比较有特色的模块. 特色一,使用接口来对应不同的数据库.数据库可以是Oracle.Sqlserver.MogoDB.甚至是XML文件.采用接口进行对应: public inter ...

  3. ImportError: No module named _sqlite3 - 代码分享

    ImportError: No module named _sqlite3 - 代码分享 ImportError: No module named _sqlite3 作者:86市场网       点击 ...

  4. Airlaunch 快捷设置代码分享

    Airlaunch 快捷设置代码分享设置:prefs:root=SETTING蜂窝网络:prefs:root=MOBILE_DATA_SETTINGS_IDWIFI:prefs:root=WIFI定位 ...

  5. codecombat之KithGard地牢19-37关代码分享

    codecombat中国游戏网址:http://www.codecombat.cn/ 全部代码为javascript代码分享 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 19 ...

  6. Java生鲜电商平台-生鲜售后系统的退款架构设计与代码分享

    Java生鲜电商平台-生鲜售后系统的退款架构设计与代码分享 说明:任何一个电商行业都涉及到退货与退款的问题,但是生鲜电商行业还设有一个显著的特点,那就是换货.在人性面前,各种各样的退货,退款,换货的售 ...

  7. JAVA基础代码分享--求圆面积

    问题描述 用户输入圆的半径,计算并显示圆的面积 代码分享 /** * @author hpu-gs * 2015/11/25 */ public class Circle { public stati ...

  8. JAVA基础代码分享--DVD管理

    问题描述 为某音像店开发一个迷你DVD管理器,最多可存6张DVD,实现碟片的管理. 管理器具备的功能主要有: 1.查看DVD信息. 菜单选择查看功能,展示DVD的信息. 2.新增DVD信息 选择新增功 ...

  9. JAVA基础代码分享--学生成绩管理

    问题描述: 从键盘读入学生成绩,找出最高分,并输出学生成绩等级. 成绩>=最高分-10  等级为’A’   成绩>=最高分-20  等级为’B’ 成绩>=最高分-30  等级为’C’ ...

随机推荐

  1. 【终极解决方案】为应用程序池“XXX”提供服务的进程在与 Windows Process Activation Service 通信时出现严重错误。该进程 ID 为“XXXX”。数据字段包含错误号。

    困扰我大半年的错误,今天偶然间被解决了,特此分享给被同样问题纠结的朋友们! 之前的求助帖,无人应答: http://www.cnblogs.com/freeton/archive/2012/08/28 ...

  2. 《objective-c基础教程》学习笔记(九)—— Foundation框架介绍

    在之前的博文中,我们创建的项目文件的时候,默认都有引用#import <Foundation/foundation.h> 这个头文件.但是,之前我们对Foundation都没有展开介绍.这 ...

  3. 在spring,mybatis整合配置中走的弯路(1)

    在接触一个新东西,总免不了走一些弯路,也正是在这些弯路中,我们不断的成长. 从git上把之前写的代码扒下来,看看我在当初使用spring与mybatis中所走的弯路,路过的君子也可引以为戒. < ...

  4. Linux/Ubuntu sudo不用输入密码的方法

    通常我们并不以root身份登录,但是当我们执行某些命令 (command)时需要用到root权限,我们通常都是用"sudo command"来执行command.由于使用Ubunt ...

  5. Privacy Policy

    MINE Privacy Policy This unit values your privacy. You are using our service, we may collect and use ...

  6. 【Android学习】数据传递三种方式

    1.Application 注意在清单文件中的Application节点下注册android:name属性, 继承Application类,重写onCreate方法, 使用数据时,实例化自定义类时需要 ...

  7. K3 WISE开发手册

    1.VB插件工程的命名.命名空间和生成的DLL命名要一致,否则导致注册不成功!

  8. Marven笔记贴

    本篇只是作为自学Marven的笔记贴,基本上都是网上的各种资料的汇总,方便自己和需要的人,不用一个个去找浪费时间了. 什么是Marven You want to start with a projec ...

  9. epoll源码实现分析[整理]

    epoll用法回顾 先简单回顾下如何使用C库封装的3个epoll相关的系统调用.更详细的用法参见http://www.cnblogs.com/apprentice89/archive/2013/05/ ...

  10. 关于FileStream读取大文件问题

    小的文本文件(100M以下)直接用File类的ReadAllText()和WriteAllText()方法 这两个方法内部其实就是封装了StreamReader类的ReadToEnd()和Stream ...