psilogic: (Default)
[personal profile] psilogic
Можно создать на виндах (XP, NTFS) большой файл на 5 Гигов, заполненный нулями, и притом быстро?

Если заполнять все 5 Гб выровненными блоками по 4 Кб, то у меня это занимает где-то 100 секунд. Плохо. Изменение размера блока не влияет. Функция chsize работает примерно столько же, но нет возможности показать пользователю "прогресс".

Но есть забавный способ. Надо открыть файл, сделать "fseek" на 5 Гб вперед, записать туда один нулевой байт (fwrite) и сказать fclose. Через секунду файл на 5 Гб готов.

Но рано радоваццо. Стоит попытаться записать в конец этого файла один-единственный ненулевой байт, сказать flush и... все виснет на те же 2 минуты без всяких шансов на показ "прогресса". Чудес не бывает, увы :(

Date: 2009-08-24 08:19 am (UTC)
From: [identity profile] fregimus.livejournal.com
Не знаю. Надо думать, так файловая система устроена, подсказывает мне капитан О.

Date: 2009-08-24 08:28 am (UTC)
From: [identity profile] psilogic.livejournal.com
я предположил, что системные функции seek+write в такой ситуации вставляют sparce-блок, но, видимо, как-то глюкаво...

для моей задачки sparce-файлы не подходят, к шыжалению

Date: 2009-08-24 08:30 am (UTC)
From: [identity profile] fregimus.livejournal.com
В документации написано, чтобы на это не рассчитывали. А так это или нет — не написано. Можно проверить (http://msdn.microsoft.com/en-us/library/aa364582(VS.85).aspx), если интересно — но что с этим знанием потом делать?

Date: 2009-08-24 08:41 am (UTC)
From: [identity profile] fregimus.livejournal.com
SetFilePointerEx (http://msdn.microsoft.com/en-us/library/aa365542(VS.85).aspx)

Note that it is not an error to set the file pointer to a position beyond the end of the file. The size of the file does not increase until you call the SetEndOfFile, WriteFile, or WriteFileEx function. A write operation increases the size of the file to the file pointer position plus the size of the buffer written, leaving the intervening bytes uninitialized.

Выделение мое. Рассчитывать на то, что после такой процедуры, какую Вы описали, на то, что файл окажется заполненным нулями, нельзя. С другой стороны, в NTFS иначе было бы невозможно: данные стертого файла никогда не делаются случайно доступными, таков был один из принципов защиты данных при разработке этой файловой системы. Но пользоваться этим знанием все равно некошерно. Вместо нулей там может оказаться какой-то другой стирающий шаблон, например. Микрософт завещал нам считать эти данные неинициализированными, о чем [livejournal.com profile] kuzmen нас совершенно справедливо предупреждает.
Page generated Sep. 1st, 2025 07:55 pm
Powered by Dreamwidth Studios