C#实现彻底删除文件的方法
作者:shichen2014 发布时间:2022-06-25 22:40:29
标签:C#,删除,文件
本文实例讲述了C#实现彻底删除文件的方法。分享给大家供大家参考。具体实现方法如下:
经常用360的文件粉碎,删除隐私文件貌似还不错的。不过C#也可以实现彻底删除文件。试了下用360文件恢复恢复不了源文件了。
主要代码如下:
public class AbsoluteFile
{
public event EventHandler FinishDeleteFileEvent = null;
public event EventHandler FinishDeleteFolderEvent = null;
public event EventHandler DeleteErrorEvent = null;
public string ErrorString = string.Empty;
public void DoAbsoluteDeleteFile(object filePath)
{
try
{
string filename = filePath.ToString();
if (string.IsNullOrEmpty(filename))
{
return;
}
if (File.Exists(filename))
{
File.SetAttributes(filename, FileAttributes.Normal);
double sectors = Math.Ceiling(new FileInfo(filename).Length / 512.0);
byte[] dummyBuffer = new byte[512];
RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
FileStream inputStream = new FileStream(filename, FileMode.Open);
inputStream.Position = 0;
for (int sectorsWritten = 0; sectorsWritten < sectors; sectorsWritten++)
{
rng.GetBytes(dummyBuffer);
inputStream.Write(dummyBuffer, 0, dummyBuffer.Length);
sectorsWritten++;
}
inputStream.SetLength(0);
inputStream.Close();
DateTime dt = new DateTime(2049, 1, 1, 0, 0, 0);
File.SetCreationTime(filename, dt);
File.SetLastAccessTime(filename, dt);
File.SetLastWriteTime(filename, dt);
File.Delete(filename);
WipeDone();
}
}
catch (Exception e)
{
WipeError(e);
}
}
public void DoDeleteFolder(object folder)
{
string folderPath = folder.ToString();
if (string.IsNullOrEmpty(folderPath))
{
return;
}
DirectoryInfo direct = new DirectoryInfo(folderPath);
FileSystemInfo[] filesystem = direct.GetFileSystemInfos();
if (filesystem == null || filesystem.Length == 0)
{
direct.Delete();
}
else
{
foreach (FileSystemInfo fileItem in filesystem)
{
if (fileItem is FileInfo)
{
this.DoAbsoluteDeleteFile(fileItem.FullName);
}
else
{
DoDeleteFolder(fileItem.FullName);
}
}
}
if (this.FinishDeleteFolderEvent != null)
{
this.FinishDeleteFolderEvent(this, null);
}
}
private void WipeError(Exception e)
{
if (DeleteErrorEvent != null)
{
ErrorString = e.Message;
DeleteErrorEvent(this, null);
}
}
private void WipeDone()
{
if (FinishDeleteFileEvent != null)
{
FinishDeleteFileEvent(this, null);
}
}
}
顺便写了个简单的界面:
后台代码如下所示:
public partial class Form1 : Form
{
private Thread dfileThread = null;
private string fileObjectPath = string.Empty;
private bool isFile = true;
public delegate void DefaulEventDelegate(object sender, EventArgs e);
public Form1()
{
InitializeComponent();
}
private void btnSelectFile_Click(object sender, EventArgs e)
{
isFile = true;
this.openFileDialog1 = new OpenFileDialog();
openFileDialog1.Multiselect = true;
openFileDialog1.Title = "请选择文件";
openFileDialog1.Filter = "所有文件(*.*)|*.*";
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
this.txtFilePath.Text = openFileDialog1.FileName;
}
fileObjectPath = this.txtFilePath.Text.Trim();
}
private void btnSelectFolder_Click(object sender, EventArgs e)
{
isFile = false;
this.folderBrowserDialog1 = new FolderBrowserDialog();
folderBrowserDialog1.Description = "请选择文件路径";
if (folderBrowserDialog1.ShowDialog() == DialogResult.OK)
{
this.txtFolder.Text = folderBrowserDialog1.SelectedPath;
}
fileObjectPath = this.txtFolder.Text.Trim();
}
private void btnAbsoluteDelete_Click(object sender, EventArgs e)
{
this.lblHint.Visible = true;
if(string.IsNullOrEmpty(fileObjectPath))
{
MessageBox.Show("请选择要粉碎的文件和文件夹!");
return;
}
AbsoluteFile dfile = new AbsoluteFile();
dfile.DeleteErrorEvent += new EventHandler(Dfile_DeleteErrorEvent);
if (isFile)
{
dfile.FinishDeleteFileEvent += new EventHandler(Dfile_FinishDeleteFileEvent);
dfileThread = new Thread(new ParameterizedThreadStart(dfile.DoAbsoluteDeleteFile));
dfileThread.IsBackground = true;
dfileThread.Start(fileObjectPath);
}
else
{
dfile.FinishDeleteFolderEvent += new EventHandler(Dfile_FinishDeleteFolderEvent);
dfileThread = new Thread(new ParameterizedThreadStart(dfile.DoDeleteFolder));
dfileThread.IsBackground = true;
dfileThread.Start(fileObjectPath);
}
this.lblHint.Text = @"正在删除...";
}
void Dfile_DeleteErrorEvent(object sender, EventArgs e)
{
if (!this.InvokeRequired)
{
MessageBox.Show((sender as AbsoluteFile).ErrorString);
}
else
{
this.BeginInvoke(new DefaulEventDelegate(Dfile_DeleteErrorEvent), new object[] { sender, e });
}
}
void Dfile_FinishDeleteFolderEvent(object sender, EventArgs e)
{
if (!this.InvokeRequired)
{
this.lblHint.Visible = false;
MessageBox.Show("删除完毕!");
}
else
{
this.BeginInvoke(new DefaulEventDelegate(Dfile_FinishDeleteFolderEvent),new object[] { sender,e });
}
}
void Dfile_FinishDeleteFileEvent(object sender, EventArgs e)
{
if (!this.InvokeRequired)
{
this.lblHint.Visible = false;
MessageBox.Show("删除完毕!");
}
else
{
this.BeginInvoke(new DefaulEventDelegate(Dfile_FinishDeleteFileEvent), new object[] { sender, e });
}
}
}
完整实例代码点击此处本站下载。
希望本文所述对大家的C#程序设计有所帮助。


猜你喜欢
- using Word;下面的例子中包括C#对Word文档的创建、插入表格、设置样式等操作:(例子中代码有些涉及数据信息部分被省略,重要是介绍
- ofType和javaType的区别JavaType和ofType都是用来指定对象类型的,但是JavaType是用来指定pojo中属性的类型
- 本文以一个简单实例讲述了C#实现自定义双击事件的方法,分享给大家供大家参考之用。具体方法如下:主要功能代码如下:public partial
- 一、概述在上一篇的叙述中,我们通过图层的方式完成了图片颜色的填充(详情请戳:Android不规则图像填充颜色小游戏),不过在着色游戏中更多的
- 本文实例讲述了C#实现日期格式转换的公共方法类。分享给大家供大家参考,具体如下:这里演示了C#中一些日期格式的转换。创建公共方法类(Util
- 我们知道,编写一个Java程序后,如果想让自己编写的代码可以正常运行,我们便需要对它进行编译和运行,而Java环境变量的配置就显得尤为重要,
- 在J2EE项目的开发中,不管是对底层的数据库操作过程,还是业务层的处理过程,还是控制层的处理过程,都不可避免会遇到各种可预知的、不可预知的异
- 一、什么是状态管理大到整个app的状态,用户使用app是登录状态,还是游客状态;小到一个按钮的状态,按钮是点击选中状态还是未点击状态等等,这
- 前言为什么要学SpringBoot和Mybatis呢,我觉得作为一个合格的后端程序员增删改查(CRUD)肯定是要会的,而且是最基本的一项技能
- 一 .前言某年某月某天,同事说需要一个文件排他锁功能,需求如下:(1)写操作是排他属性(2)适用于同一进程的多线程/也适用于多进程的排他操作
- 这篇文章主要介绍了JDBC自定义连接池过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参
- 说明在学习jvm相关知识时,一般会讲到类字节码相关内容,为了更清晰的了解类字码具体内容,一般我们会使用javap命令进行查看,但是仍然不够直
- 大家对于 Spring 的 scope 应该都不会默认。所谓 scope,字面理解就是“作用域”、“范围”,如果一个 bean 的 scop
- spring在启动时会自己把bean(java组件)注册到ioc容器里,实现控制反转,在开发人员使用spring开发应用程序时,你是看不到n
- Android 图片选择可以达到的效果:1.第一个图片的位置放照相机,点击打开照相机2.其余的是显示全部存储的图片,点击一次是查
- 当我们要创建一个Tcp/Ip Server connection ,我们需要一个范围在1000到65535之间的端口 。但是本机一个端口只能
- 1.依赖maven依赖如下,需要说明的是,spring-boot-starter-data-redis里默认是使用lettuce作为redi
- 一、准备工作mybatis-plus作为mybatis的增强工具,它的出现极大的简化了开发中的数据库操作,但是长久以来,它的联表查询能力一直
- 下面通过代码看下JAVA查询树结构数据(省市区)使用hutool工具实现代码:@PostMapping("/getTree&quo
- 本文实例为大家分享了C#生成PDF文件流的具体代码,供大家参考,具体内容如下1、设置字体static BaseFont FontBase =