Вытрите Свободное пространство на жестком диске с помощью [закрытого] C#

6
задан Paul Sasik 14 January 2010 в 15:35
поделиться

6 ответов

Простой алгоритм:

  • Создайте большой текстовый файл, полный произвольного текста (лучше всего использовать предварительно созданный файл вместо регенерации случайного по соображениям производительности. Протестируйте его.)
  • Создайте умную схему именования папок и файлов, чтобы иметь возможность отслеживать файлы. Вы также должны отслеживать файлы с помощью вашего приложения, но если оно ломается, особенно в конце первых нескольких тестовых запусков, вы захотите иметь возможность легко найти и очистить вашу удобную работу.
  • Запишите его на жесткий диск, пока он не станет полным
  • Удалите созданные файлы
  • Повторите вышеприведенные шаги еще два раза

Обновление: Более подробное рассмотрение вопроса о стирании при последующем обсуждении:

  • При первой передаче записываем файлы значений 0x0000 (все биты выключены)
  • При второй передаче все биты записываем как 0xFFFF (все биты выключены)
  • При последней передаче повторяем с 0x0000

Вышеуказанное игнорирует несколько идей, например, какой размер файла лучше всего подходит, зависит от вашей файловой системы в любом случае. Вы также можете получить различные поведения от операционной системы, когда вы находитесь рядом с заполненным жестким диском....

3
ответ дан 17 December 2019 в 02:29
поделиться

Этот код из Кодовой проект Я думаю. Я не уверен, когда оригинальная статья есть, но это делает то, что вы просили:

на основании комментариев, я четко надо надо надогать немного больше ..

Вы можете сделать это очень просто, основываясь на ваших требованиях.

  1. Сделайте 1 большой файл, который заполняет оставшийся свободный размер на вашем диске. Тогда просто протрите этот файл.

  2. Сделайте несколько файлов, пока ваш диск не будет заполнен. (Это может быть лучше, если вы хотите использовать машину во время его продолжения). Затем вы можете начать вытирать каждый файл, поэтому, поскольку общий момент, когда система имеет полный жесткий диск DRISJ меньше, чем использование метода 1. Но он, вероятно, будет немного медленнее и использовать немного больше кода.

Преимущество использования - это несколько, легкий код для использования. Вам не нужно играть с низкоуровневыми API, которые будут завинчивать.

using System;
using System.IO;
using System.Security.Cryptography;

namespace QuickStarterShared
{
    public class Wipe
    {
        /// <summary>
        /// Deletes a file in a secure way by overwriting it with
        /// random garbage data n times.
        /// </summary>
        /// <param name="filename">Full path of the file to be deleted</param>
        /// <param name="timesToWrite">Specifies the number of times the file should be overwritten</param>
        public void WipeFile(string filename, int timesToWrite)
        {
#if !DEBUG
            try
            {
#endif
                if (File.Exists(filename))
                {
                    // Set the files attributes to normal in case it's read-only.
                    File.SetAttributes(filename, FileAttributes.Normal);

                    // Calculate the total number of sectors in the file.
                    double sectors = Math.Ceiling(new FileInfo(filename).Length/512.0);

                    // Create a dummy-buffer the size of a sector.
                    byte[] dummyBuffer = new byte[512];

                    // Create a cryptographic Random Number Generator.
                    // This is what I use to create the garbage data.
                    RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();

                    // Open a FileStream to the file.
                    FileStream inputStream = new FileStream(filename, FileMode.Open);
                    for (int currentPass = 0; currentPass < timesToWrite; currentPass++)
                    {
                        // Go to the beginning of the stream
                        inputStream.Position = 0;

                        // Loop all sectors
                        for (int sectorsWritten = 0; sectorsWritten < sectors; sectorsWritten++)
                        {
                            // Fill the dummy-buffer with random data
                            rng.GetBytes(dummyBuffer);
                            // Write it to the stream
                            inputStream.Write(dummyBuffer, 0, dummyBuffer.Length);
                        }
                    }
                    // Truncate the file to 0 bytes.
                    // This will hide the original file-length if you try to recover the file.
                    inputStream.SetLength(0);
                    // Close the stream.
                    inputStream.Close();

                    // As an extra precaution I change the dates of the file so the
                    // original dates are hidden if you try to recover the file.
                    DateTime dt = new DateTime(2037, 1, 1, 0, 0, 0);
                    File.SetCreationTime(filename, dt);
                    File.SetLastAccessTime(filename, dt);
                    File.SetLastWriteTime(filename, dt);

                    File.SetCreationTimeUtc(filename, dt);
                    File.SetLastAccessTimeUtc(filename, dt);
                    File.SetLastWriteTimeUtc(filename, dt);

                    // Finally, delete the file
                    File.Delete(filename);
                }
#if !DEBUG
            }
            catch(Exception e)
            {

            }
#endif
        }
    }

    # region Events
    # region PassInfo
    public delegate void PassInfoEventHandler(PassInfoEventArgs e); 
    public class PassInfoEventArgs : EventArgs
    {
        private readonly int cPass;
        private readonly int tPass;

        public PassInfoEventArgs(int currentPass, int totalPasses)
        {
            cPass = currentPass;
            tPass = totalPasses;
        }

        /// <summary> Get the current pass </summary>
        public int CurrentPass { get { return cPass; } }
        /// <summary> Get the total number of passes to be run </summary> 
        public int TotalPasses { get { return tPass; } }
    }
    # endregion

    # region SectorInfo        
    public delegate void SectorInfoEventHandler(SectorInfoEventArgs e);
    public class SectorInfoEventArgs : EventArgs
    {
        private readonly int cSector;
        private readonly int tSectors;

        public SectorInfoEventArgs(int currentSector, int totalSectors)
        {
            cSector = currentSector;
            tSectors = totalSectors;
        }

        /// <summary> Get the current sector </summary> 
        public int CurrentSector { get { return cSector; } }
        /// <summary> Get the total number of sectors to be run </summary> 
        public int TotalSectors { get { return tSectors; } }
    }
    # endregion

    # region WipeDone        
    public delegate void WipeDoneEventHandler(WipeDoneEventArgs e);
    public class WipeDoneEventArgs : EventArgs
    {
    }
    # endregion

    # region WipeError
    public delegate void WipeErrorEventHandler(WipeErrorEventArgs e);
    public class WipeErrorEventArgs : EventArgs
    {
        private readonly Exception e;

        public WipeErrorEventArgs(Exception error)
        {
            e = error;
        }

        public Exception WipeError{get{ return e;}}
    }
    # endregion
    # endregion
}
1
ответ дан 17 December 2019 в 02:29
поделиться

Вам придется делать некоторые манипуляции с низким уровнем уровней, поэтому вам наверняка придется поговорить с API Win32. Я не сделал такого рода вещей, поэтому я не могу дать вам особенности, но хорошее место для начала смотреть, может быть ссылка API Win32: http://msdn.microsoft.com/en-us/ Библиотека / AA383749% 28VS.85% 29.aspx

Я действительно не эксперт в этой области вообще, но кажется, что мое наивное понимание, которое вам нужно: 1) Получить информацию о том, где начинается и останавливается файловая система 2) Использование не удаленных файлов в качестве ссылки, получите список физических местоположений того, что должно быть свободное пространство 3) Написать 0 к этим местам

Может быть, это не отличный ответ, поскольку я не эксперт в поле, но это было слишком долго для комментариев;) Я надеюсь, что это немного поможет.

0
ответ дан 17 December 2019 в 02:29
поделиться

В этом случае вам может потребоваться использовать что-то вроде MSBuild для управления построениями. Тогда вы можете иметь флаг компиляции, который используется для 32 или 64-разрядной компиляции. Делая это он также позволит вам контролировать, какие DLL вы нажимаете. Это звучит как твой лучший вариант. Если вы не любите msbuild вы также можете использовать nant.

-121--4349625-

Что-то вроде:

perl -p -e 's[\r\n][WIN\n]; s[(?<!WIN)\n][UNIX\n]; s[\r][MAC\n];' FILENAME

, хотя некоторые из этих регэкспов могут нуждаться в доработке и приведении в порядок.

Этот файл будет выведен в конце каждой строки с помощью WIN, MAC или UNIX. Хорошо, если ваш файл каким-то образом ужасный беспорядок (или разница) и имеет смешанные окончания.

-121--1038475-
System.Diagonstics.Process.Start("chipher.exe /WC:\");

Это асинхронный по умолчанию, вы получаете идею.

-1
ответ дан 17 December 2019 в 02:29
поделиться

Проверьте документацию SDELETE , возможно, вы можете получить там подсказку.

0
ответ дан 17 December 2019 в 02:29
поделиться

Это действительно опасно , но ..

Вы можете использовать API FEFRAG APIS (вот обертка C # , чтобы получить удержание привода «карта» и специально нацелена на FreeSpace и записывать мусор к тем частям диска.

3
ответ дан 17 December 2019 в 02:29
поделиться