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

 更新时间:2014年11月17日 12:07:21   投稿:shichen2014  
这篇文章主要介绍了C#实现彻底删除文件的方法,可实现类似360粉碎文件的效果,是非常实用的技巧,需要的朋友可以参考下

本文实例讲述了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#实现Base64处理的加密解密,编码解码示例

    C#实现Base64处理的加密解密,编码解码示例

    这篇文章主要介绍了C#实现Base64处理的加密解密,编码解码,结合实例形式分析了基于C#实现的base64编码解码操作相关技巧,需要的朋友可以参考下
    2017-01-01
  • C# JWT权限验证的实现

    C# JWT权限验证的实现

    本文主要介绍了C# JWT权限验证的实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • Unity实现游戏存档框架

    Unity实现游戏存档框架

    这篇文章主要为大家详细介绍了Unity实现游戏存档框架,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-01-01
  • C#中的==运算符用法讲解

    C#中的==运算符用法讲解

    本文详细讲解了C#中的==运算符的用法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-02-02
  • C#下实现创建和删除目录的实例代码

    C#下实现创建和删除目录的实例代码

    这篇文章主要介绍了C#下实现创建和删除目录的方法,功能非常实用,需要的朋友可以参考下
    2014-08-08
  • 详解C# WinForm如何实现自动更新程序

    详解C# WinForm如何实现自动更新程序

    在C/S这种模式中,自动更新程序就显得尤为重要,它不像B/S模式,直接发布到服务器上,浏览器点个刷新就可以了。本文就为大家准备了WinForm实现自动更新程序的示例代码,需要的可以参考一下
    2022-10-10
  • Unity实现简单换装系统

    Unity实现简单换装系统

    这篇文章主要为大家详细介绍了Unity实现简单换装系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-04-04
  • C#用递归算法实现:一列数的规则如下: 1、1、2、3、5、8、13、21、34,求第30位数是多少

    C#用递归算法实现:一列数的规则如下: 1、1、2、3、5、8、13、21、34,求第30位数是多少

    本文主要介绍三种方法,解决面试中常见的问题,求第30位数是多少的问题,希望能给大家一个参考。
    2016-06-06
  • C#接口在派生类和外部类中的调用方法示例

    C#接口在派生类和外部类中的调用方法示例

    这篇文章主要介绍了C#接口在派生类和外部类中的调用方法,结合实例形式分析了C#接口的定义与具体使用方法,需要的朋友可以参考下
    2017-02-02
  • C#创建临时文件的方法

    C#创建临时文件的方法

    这篇文章主要介绍了C#创建临时文件的方法,涉及C#中Path.GetTempFileName方法获取与操作临时文件的使用技巧,非常具有实用价值,需要的朋友可以参考下
    2015-04-04

最新评论