It has been a while since I last posted a code sample. So here is one for you guys to take a look at. Below is the file/directory shredder class.
class FileUtilities { private static Random Randomizer = new Random(); public static bool Shred(string directoryPath, bool shouldDelete = true) { bool success = true; try { string[] files = Directory.GetFiles(directoryPath, "*", SearchOption.AllDirectories); foreach (string file in files) success &= FileUtilities.ShredFile(file, shouldDelete); string[] directories = Directory.GetDirectories( directoryPath, "*", SearchOption.AllDirectories ).OrderByDescending( str => str.Split('\\').Length - 1 ).ToArray(); foreach (string directory in directories) success &= FileUtilities.ShredDirectory(directory, shouldDelete); success &= FileUtilities.ShredDirectory(directoryPath, shouldDelete); } catch { success = false; } return success; } public static bool ShredDirectory(string directoryPath, bool shouldDelete = true) { bool success = true; try { DirectoryInfo directoryInfo = new DirectoryInfo(directoryPath); string[] directoryBits = directoryPath.Split('\\'); directoryBits[directoryBits.Length - 1] = FileUtilities.RandomName(directoryInfo.Name.Length); string newDirectoryPath = String.Join("\\", directoryBits); directoryInfo.MoveTo(newDirectoryPath); if (shouldDelete) directoryInfo.Delete(); } catch { success = false; } return success; } public static bool ShredFile(string filePath, bool shouldDelete = true) { bool success = true; try { FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Write); for (long i = 0; i < fs.Length; i++) fs.WriteByte((byte)Randomizer.Next(0, 255)); fs.Close(); FileInfo fileInfo = new FileInfo(filePath); fileInfo.MoveTo(fileInfo.DirectoryName + @"\" + FileUtilities.RandomName(fileInfo.Name.Length)); if (shouldDelete) fileInfo.Delete(); } catch { success = false; } return success; } private static string RandomName(int length) { string fileNameChars = "abcdefghijklmnopqrstuvwxyz1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ~!@¤#$£§%^&()+`={}][;,"; string newFileName = String.Empty; for (int i = 0; i < length; i++) newFileName += fileNameChars[Randomizer.Next(0, fileNameChars.Length)]; return newFileName; } }
The usage calls for these functions as as follows:
bool success = FileUtilities.Shred(@"D:\Temp"); // This method will recursively shred a file / folder. bool success = FileUtilities.ShredDirectory(@"D:\Temp"); // This method will shred the contents of a folder and the root folder. bool success = FileUtilities.ShredFile(@"D:\Temp\test.txt"); // This method will shred a specified file.[
I will not go through the code line-by-line to explain it as I feel most of the code is pretty self-explanatory. However if there are any questions feel free to post a comment.