четверг, 22 сентября 2011 г.

3амутить бэкап данных без потери места на винчестере


Попытаемся решить эту проблему раз и навсегда при помощи одной из фишек файловой системы NTFS - жестких ссылок (hard links). Имя файла является жесткой ссылкой на определенную область памяти, причем мы не ограничены в использовании нескольких жестких ссылок на одну и ту же область, а значит, файл может иметь несколько имен. Жесткие ссылки работают только в пределах одного логического диска с NTFS, не занимают места на винте и равноправны. Файл не будет удален, пока остается хотя бы одна жесткая ссылка.

1. Создается жесткая ссылка командой fsutil hardlink с параметрами create, именем жесткой ссылки и именем файла, на который она ссылается. Для примера создадим hard link на файл doc.txt. Наберем в консоли:
fsutil hardlink create C:\hardlink_to_doc.txt C:\doc.txt
В результате выполнения команды получим уведомление:
Создана жесткая связь C:\hardlink_to_doc.txt <<===>> C:\doc.txt
2. Мы не будем печатать все это в консоли каждый раз, а напишем прогу на С++, создающую бэкап всех файлов, находящихся в той же папке.
Подключим необходимые файлы и объявим переменные:
#include <windows.h>
WIN32_FIND_DATA winFileData;
HANDLE hFile;
char szPath[MAX_PATH];
3. Получим путь до папки, из которой запущена прога, и используем его для получения указателя на первый файл:
GetCurrentDirectory(sizeof(szPath),szPath);
lstrcat(szPath,"\\*.*");
hFile = FindFirstFile(szPath,&winFileData);
4. В цикле для каждого файла создадим собственную команду «fsutil hardlink create <полное имя ссылки> <полное имя файла>» и выполним ее через консоль:
do {
char szPath_TMP[MAX_PATH]="hardlink create С:\\backups\\";
lstrcat(szPath_TMP, winFileData.cFileName);
lstrcat(szPath_TMP, " ");
lstrcat(szPath_TMP, winFileData.cFileName);
ShellExecute(0,"open","fsutil", szPath_TMP, NULL, SW_HIDE);
} while (FindNextFile(hFile,&winFileData)!=0);
FindClose(hFile);
5. Готово. Компилим и наслаждаемся :).
6. Использовать эту особенность NTFS можно как для создания бэкапа данных весом 0 байт, так и для сохранения файлов незадачливого пользователя. Ничто не мешает нам заранее сделать hard links и спрятать их в дальний угол винта. Юзер будет думать, что удалил файло, однако реально он удалит лишь свои жесткие ссылки.
Итак, наша цель достигнута, а для более близкого знакомства с hard links я отсылаю тебя к интернету.

Комментариев нет:

Отправить комментарий