Есть ли способ в .NET сделать резервную копию каталога, содержащего несколько подкаталогов, каждый из которых потенциально может содержать 10 000 или более файлов размером примерно 100–500 КБ без перечисления? Вариант использования здесь — постепенное резервное копирование файлов на USB-накопитель и NAS, но из-за количества файлов это может занять очень много времени. Я знаком с VSS и создал несколько пользовательских приложений для резервного копирования, использующих его, но мне было интересно, есть ли способ сделать снимок тома, содержащего эти файлы, и сохранить только моментальный снимок без необходимости открывать моментальный снимок как смонтированный образ и копировать каждый файл. Конечная цель состоит в том, чтобы сократить время, затрачиваемое на операцию копирования.
Резервное копирование большого количества файлов без перечисления
Ответы (3)
функция резервного копирования Windows Server может быть хорошей альтернативой встроенные решения. Если вы используете Windows Server 2016, вы можете найти это статья, объясняющая новые интересные функции.
Запись MFT (основная таблица файлов) имеет только размером 1 КБ или 1024 байта, поэтому для получения имени, атрибутов и т. д. требуется совсем немного операций ввода-вывода по сравнению с операциями чтения, необходимыми для перемещения самих данных файла. Таким образом, перечисление записей файлового каталога не является проблемой, и устранение этой части обработки не вызовет ничего, кроме крошечного мерцания на вашем спидометре, так сказать.
Я полагаю, вы могли бы попробовать «клонировать» BIOS низкого уровня (не копировать) самих данных диска, используя программное обеспечение для клонирования. Это может быть немного быстрее, потому что головке диска не придется двигаться зигзагом. С другой стороны, эта опция почти не будет иметь никакого эффекта, если ваш жесткий диск является твердотельным, поскольку произвольный доступ будет таким же быстрым, как и последовательный доступ.
Другим вариантом является резервное копирование только файлов, которые были изменены, путем проверки даты и времени последнего изменения каждого файла. Простой способ сделать это — использовать команду XCOPY с переключателем /D
(с без аргумента), который сравнивает дату/время последней резервной копии с текущим файлом и выполняет копирование только в том случае, если файл на жестком диске новее, чем файл на внешнем диске.
Вы можете вызвать другой процесс из .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);
}
}
ZipFile.CreateFromDirectory
? - person Eugene Komisarenko   schedule 21.04.2017