C#实现彻底删除文件的方法

所属分类: 软件编程 / C#教程 阅读数: 80
收藏 0 赞 0 分享

本文实例讲述了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#程序设计有所帮助。

更多精彩内容其他人还在看

C#抽象类与抽象方法详解

这篇文章主要为大家详细介绍了C#抽象类与抽象方法的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

C#代码实现扑克牌排序的几种方式

今天小编就为大家分享一篇关于C#代码实现扑克牌排序,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
收藏 0 赞 0 分享

C#泛型概念的简介与泛型的使用

今天小编就为大家分享一篇关于C#泛型概念的简介与泛型的使用,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
收藏 0 赞 0 分享

C# 7.0 使用下划线忽略使用的变量的原因分析

这篇文章主要介绍了C# 7.0 使用下划线忽略使用的变量的原因浅析,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

C# 中使用正则表达式匹配字符的含义

正则表达式的作用用来描述字符串的特征。本文重点给大家介绍C# 中使用正则表达式匹配字符的含义,非常不错,具有一定的参考借鉴价值,需要的朋友参考下吧
收藏 0 赞 0 分享

C# Dictionary和SortedDictionary的简介

今天小编就为大家分享一篇关于C# Dictionary和SortedDictionary的简介,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
收藏 0 赞 0 分享

C#中SQL Command的基本用法

今天小编就为大家分享一篇关于C#中SQL Command的基本用法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
收藏 0 赞 0 分享

C#使用SQL DataReader访问数据的优点和实例

今天小编就为大家分享一篇关于C#使用SQL DataReader访问数据的优点和实例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
收藏 0 赞 0 分享

C#使用SQL Dataset数据集代码实例

今天小编就为大家分享一篇关于的文章,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
收藏 0 赞 0 分享

C#使用SQL DataAdapter数据适配代码实例

今天小编就为大家分享一篇关于C#使用SQL DataAdapter数据适配代码实例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
收藏 0 赞 0 分享
查看更多