返回首页

---更新更好的控制台的东西,现在使用的加密随机数发生器。

我知道你们有些人发现自己在这种情况下,要求您从您的硬盘驱动器中删除的东西,从而使您数据不可恢复。

好了,有没有一个很好的方法,通过C#没有一些tomfoolery ...所以我在此SuperDelete你。此代码将永久删除您传递的任何文件,删除的文件之前,覆盖现有的数据加密随机数的指定次数。这使得以前存在的数据,几乎没用到任何人。

只要数据被刷新到每个文件的驱动器后写(因此比在FileStream的foreach),您的系统不具有某种先进的地方打开和关闭多个文件,将缓存数据写入缓存,您的数据将如死了,一旦这个代码是完成它。

建议覆盖的10倍,是覆盖名义伺服定位在所有硬盘驱动器发生错误,但是你可以推跟进你想使自己感到安全的任何值{BR​​}
我也建议您阅读本文的数据存储和恢复。 A0}

代码:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.IO;

using System.Security.Cryptography;



namespace SuperDelete

{

class Program

{

// For large files this is the best performing buffer size

static byte[] buffer = new byte[32768];



/// <summary>

/// Main application entry point

/// 

/// Usage: SuperDelete.exe filename number_of_wipes



/// Example: SuperDelete.exe \"C:\\mySecrets.txt\" 10"

/// </summary>

static void Main(string[] args)

{

Console.WriteLine("Usage: SuperDelete.exe <filename> <number of wipes>");

Console.WriteLine("Example: SuperDelete.exe \"C:\\mySecrets.txt\" 10");

try

{

Console.WriteLine("");

Console.WriteLine("Are you sure you want to SuperDelete the file {0}?  (Y/N)", args[0]);



if (Console.ReadKey().Key == ConsoleKey.Y)

SuperDeleteFile(args[0], Convert.ToInt32(args[1]));

}

catch (Exception e)

{

Console.WriteLine("Failed to super delete :(");

Console.WriteLine(e.Message);

}

}



/// <summary>

/// Super delete that file!

/// </summary>

/// <param name="fileName">Name of the file to delete</param>

/// <param name="passes">Number of passes to use in wiping the file.  Recommended is 10</param>

public static void SuperDeleteFile(string fileName, int passes)

{

Console.WriteLine("");

Console.WriteLine("Deleting...");



int cursorTop = Console.CursorTop;

int cursorLeft = Console.CursorLeft;            



for (int i = 0; i < passes; i++)

{

using (FileStream fileToOverwrite = File.Open(fileName, FileMode.Open, FileAccess.Write, FileShare.None))

{



// 24 is the RSA-AES CSP

RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider(new CspParameters(24));



rng.GetBytes(buffer);



// Writing more than the file size (unless it comes out to be the exact size of the buffer *n) will mask the original filesize

long bytesToWrite = fileToOverwrite.Length;

long originalFileSize = fileToOverwrite.Length;



while (bytesToWrite > 0)

{

Console.CursorLeft = cursorLeft;

Console.CursorTop = cursorTop;



string messageOne = string.Format("Pass {0}, wiping bytes {1} - {2} of {3}. ", i, originalFileSize - bytesToWrite, (originalFileSize - bytesToWrite) + buffer.Length, originalFileSize);

string messageTwo = string.Format("This pass has %{0} left to complete.", Convert.ToInt64((Convert.ToDouble(bytesToWrite) / Convert.ToDouble(originalFileSize)) * 100));



Console.WriteLine(PadToLength(messageOne, Console.BufferWidth));

Console.WriteLine(PadToLength(messageTwo, Console.BufferWidth));



fileToOverwrite.Write(buffer, 0, buffer.Length);



bytesToWrite -= buffer.Length;

}

}

}



File.Delete(fileName);

}



static string PadToLength(string original, int length)

{

if (original.Length >= length)

return original;



StringBuilder sb = new StringBuilder(original);



for (int i = original.Length +1; i < length; i++)

{

sb.Append(" ");

}



return sb.ToString();

}

}

}


完整的程序,包括禁用写入缓存,请购买我的超级删除应用。

回答

评论会员:游客 时间:2012/01/27
在某些硬盘驱动器,如果控制器检测到一个部门是"弱",它可以被重新映射到另一个磁盘的一部分。如果发生这种情况,数据的副本可能会留在放弃了原来的部门,并没有重写块的金额将删除旧的副本此外,在许多闪光设备,数据可能只被删除32个或更多的行业群体。为了解决这个问题,重写一个部门一个命令将导致控制器部门重新映射到一个新的磁盘上的空白点,并标记为废弃的旧副本。如果你有一个32空的空间音乐会驱动器,可能改写一个MEG的文件没有物理擦除的数据一千倍
。AspDotNetDev
评论会员:游客 时间:2012/01/27
我只是写。{S1}SSD的是,通常做什么你描述的硬盘驱动器的一个例子。[imgsrc=http://www.orcode.com/img/ico/thumbs_up.gif