Создание приложения резервного копирования

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

HANDLE hTape;   // handle to tape device
 
hTape = CreateFile(TEXT("\\\\.\\TAPE0"),         // tape dev to open
                   GENERIC_READ | GENERIC_WRITE, // read/write access
                   0,                            // not used
                   0,                            // not used
                   OPEN_EXISTING,                // req for tape devs
                   0,                            // not used
                   NULL);                        // not used

Чтобы создать резервную копию дерева каталогов на ленту, приложение должно использовать функции FindFirstFile и FindNextFile для обхода дерева каталогов. Каждый раз при обнаружении файла приложение должно получать атрибуты файла с помощью функции GetFileAttributes.

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

При восстановлении файлов с ленты на диск приложение должно использовать функции CreateFile, BackupWrite и ReadFile. Для каждого файла на ленте приложение должно использовать CreateFile для создания нового файла на диске и BackupWrite , чтобы начать восстановление файла. Затем приложение должно многократно использовать ReadFile , пока все сведения для файла не считываются из ленты в буфер, заполненный BackupWrite.

Если один из потоков в буфере BackupWrite содержит идентификатор потока BACKUP_LINK , приложение должно установить жесткую связь. Если данные, необходимые для установления ссылки, не существуют, backupWrite завершается ошибкой. Приложение может использовать предварительно существующий каталог для поиска и восстановления исходных данных или уведомить пользователя о том, что восстановленные данные файла находятся в другом расположении.