隐藏

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

发布:2022/3/3 10:29:33作者:管理员 来源:本站 浏览次数:1003

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