Страницы

Поиск по вопросам

воскресенье, 8 декабря 2019 г.

Как создать файл (размер: 0 байт), при удалении которого освободится 100МБ на диске?

#windows


Как создать файл (размер: 0 байт), при удалении которого освободится 100МБ на диске?
    


Ответы

Ответ 1



В Windows под размером файла обычно понимается размер основного потока данных - именно он отображается как "размер" в проводнике (и в остальных утилитах для работы с диском). Но кроме основного потока данных к файлу можно дописать несколько дополнительных потоков, размер данных в которых не будет включатся в общий "размер" файла. Называется эта фича Alternate Data Streams. Раньше она использовалась для совместимости с маками. Сейчас используется для хранения метаданных - например, свойств картинок - тех самых "снято, выдержка, размер" и прочих, которые можно задать в свойствах файла. Вобщем, достаточно простого вызова CreateFile с суффиксом ":streamname" в имени файла - и можно писать на диск "неучтенные" данные. Вот пример, создающий файл с отображаемым размером в 0 байт, при удалении которого освобождается 100 мегабайт: #include #include void main() { HANDLE hFile, hStream; DWORD dwRet; hFile = CreateFile(L"C:\\temp\\testfile", GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_ALWAYS, 0, NULL); if (hFile == INVALID_HANDLE_VALUE) { printf("Cannot open testfile\n"); } else { // do nothing // WriteFile(hFile, "This is testfile", 16, &dwRet, NULL); } hStream = CreateFile(L"C:\\temp\\testfile:stream", GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_ALWAYS, 0, NULL); if (hStream == INVALID_HANDLE_VALUE) { printf("Cannot open testfile:stream\n"); } else { for (int i = 0; i < 10000000; i++) { WriteFile(hStream, "1234567890", 10, &dwRet, NULL); } } } Его будет выдавать ненулевой Size On Disk, отображаемый в свойствах файла в проводнике - но этот размер и для обычных файлов может не совпадать с Size. Во всех остальных местах размер файла будет отображаться как 0.

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

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