Резервное копирование большого количества файлов без перечисления

Есть ли способ в .NET сделать резервную копию каталога, содержащего несколько подкаталогов, каждый из которых потенциально может содержать 10 000 или более файлов размером примерно 100–500 КБ без перечисления? Вариант использования здесь — постепенное резервное копирование файлов на USB-накопитель и NAS, но из-за количества файлов это может занять очень много времени. Я знаком с VSS и создал несколько пользовательских приложений для резервного копирования, использующих его, но мне было интересно, есть ли способ сделать снимок тома, содержащего эти файлы, и сохранить только моментальный снимок без необходимости открывать моментальный снимок как смонтированный образ и копировать каждый файл. Конечная цель состоит в том, чтобы сократить время, затрачиваемое на операцию копирования.


person Smitty    schedule 21.04.2017    source источник
comment
Вы проверили, приемлема ли производительность ZipFile.CreateFromDirectory?   -  person Eugene Komisarenko    schedule 21.04.2017
comment
@EugeneKomisarenko - Я думал об этом на самом деле и все еще обдумываю. Я мог бы заархивировать все в zip и даже добавить к нему, насколько я понимаю. Мне пришлось бы пересоздавать архив с определенной периодичностью, чтобы убедиться, что у меня есть последние версии измененных файлов. Я упустил в своем вопросе, что это, вероятно, будет иметь форму добавочной резервной копии.   -  person Smitty    schedule 21.04.2017


Ответы (3)


функция резервного копирования Windows Server может быть хорошей альтернативой встроенные решения. Если вы используете Windows Server 2016, вы можете найти это статья, объясняющая новые интересные функции.

person Eugene Komisarenko    schedule 21.04.2017
comment
Я собираюсь серьезно рассмотреть это. Очевидно, это уровень блоков, так что это лучше, чем операции на уровне отдельных файлов. - person Smitty; 22.04.2017
comment
Похоже, я собираюсь пойти по этому пути. Я нашел, где я могу написать небольшое приложение .NET для вызова некоторых из команды Windows Server Backup PowerShell, которые могут запускать запланированные и одноразовые резервные копии. Причина, по которой это решение является привлекательным, заключается в том, что Windows Server Backup использует теневое копирование тома, что хорошо подходит, поскольку некоторые файлы определенно будут заблокированы для чтения. Кроме того, мне приходится иметь дело только с образом VHD, а не с отдельными файлами, копируемыми из открытого моментального снимка. - person Smitty; 23.04.2017

Запись MFT (основная таблица файлов) имеет только размером 1 КБ или 1024 байта, поэтому для получения имени, атрибутов и т. д. требуется совсем немного операций ввода-вывода по сравнению с операциями чтения, необходимыми для перемещения самих данных файла. Таким образом, перечисление записей файлового каталога не является проблемой, и устранение этой части обработки не вызовет ничего, кроме крошечного мерцания на вашем спидометре, так сказать.

Я полагаю, вы могли бы попробовать «клонировать» BIOS низкого уровня (не копировать) самих данных диска, используя программное обеспечение для клонирования. Это может быть немного быстрее, потому что головке диска не придется двигаться зигзагом. С другой стороны, эта опция почти не будет иметь никакого эффекта, если ваш жесткий диск является твердотельным, поскольку произвольный доступ будет таким же быстрым, как и последовательный доступ.

Другим вариантом является резервное копирование только файлов, которые были изменены, путем проверки даты и времени последнего изменения каждого файла. Простой способ сделать это — использовать команду XCOPY с переключателем /D (с без аргумента), который сравнивает дату/время последней резервной копии с текущим файлом и выполняет копирование только в том случае, если файл на жестком диске новее, чем файл на внешнем диске.

person John Wu    schedule 21.04.2017
comment
Так что время действительно занимает операция копирования, а не перечисление. Спасибо за это разъяснение - я слышал о xcopy и robocopy, но разработал что-то с использованием FileSystemWatcher для отслеживания событий изменения в каталоге и его подкаталогах. Я посмотрю, если я не могу изобретать велосипед. - person Smitty; 22.04.2017

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

public static void Main()
{
    Process myProcess = new Process();

    try
    {
        myProcess.StartInfo.UseShellExecute = false;
        myProcess.StartInfo.FileName = "C:\\Windows\\System32\\robocopy.exe Source Destination";
        myProcess.StartInfo.CreateNoWindow = true;
        myProcess.Start();
    }
    catch (Exception e)
    {
        Console.WriteLine(e.Message);
    }
}
person loneshark99    schedule 21.04.2017