代码如下:
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 }); } } }