---更新更好的控制台的东西,现在使用的加密随机数发生器。
我知道你们有些人发现自己在这种情况下,要求您从您的硬盘驱动器中删除的东西,从而使您数据不可恢复。
好了,有没有一个很好的方法,通过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();
}
}
}
完整的程序,包括禁用写入缓存,请购买我的超级删除应用。