Затирание файла с использованием FileStream - C#
Формулировка задачи:
Всем привет !
Есть такая open source прога - eraser, она позволяет затирать файлы, т.е. перезаписывать кластеры файла какими нибудь рандомными данными.
Так вот, она это делает с помощью потоков FileStream, насколько я понял. Собственно вопрос,
как это ей удается ??
Когда я пробую перезаписать файл, то информация пишется в другие кластеры, а на кластерах, где был файл, вся информация остается Нашел функцию, которая удаляет файл в eraser - находится в method.cs, опять же, если я правильно все понялpublic override void Erase(Stream stream, long erasureLength, Prng prng, ErasureMethodProgressFunction callback) { //Randomize the order of the passes ErasureMethodPass[] randomizedPasses = PassesSet; if (RandomizePasses) randomizedPasses = ShufflePasses(randomizedPasses); //Remember the starting position of the stream. long strmStart = stream.Position; long strmLength = Math.Min(stream.Length - strmStart, erasureLength); long totalData = CalculateEraseDataSize(null, strmLength); //Allocate memory for a buffer holding data for the pass. byte[] buffer = new byte[Math.Min(DiskOperationUnit, strmLength)]; //Run every pass! for (int pass = 0; pass < Passes; ++pass) { //Do a progress callback first. if (callback != null) callback(0, totalData, pass + 1); //Start from the beginning again stream.Seek(strmStart, SeekOrigin.Begin); //Write the buffer to disk. long toWrite = strmLength; int dataStopped = buffer.Length; while (toWrite > 0) { //Calculate how much of the buffer to write to disk. int amount = (int)Math.Min(toWrite, buffer.Length - dataStopped); //If we have no data left, get more! if (amount == 0) { randomizedPasses[pass].Execute(buffer, prng); dataStopped = 0; continue; } //Write the data. stream.Write(buffer, dataStopped, amount); stream.Flush(); toWrite -= amount; //Do a progress callback. if (callback != null) callback(amount, totalData, pass + 1); } } }
Решение задачи: «Затирание файла с использованием FileStream»
textual
Листинг программы
FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Write, FileShare.None, 8, FileOptions.WriteThrough);