Чудеса виндоуз...
Aug. 22nd, 2009 06:28 pm![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Можно создать на виндах (XP, NTFS) большой файл на 5 Гигов, заполненный нулями, и притом быстро?
Если заполнять все 5 Гб выровненными блоками по 4 Кб, то у меня это занимает где-то 100 секунд. Плохо. Изменение размера блока не влияет. Функция chsize работает примерно столько же, но нет возможности показать пользователю "прогресс".
Но есть забавный способ. Надо открыть файл, сделать "fseek" на 5 Гб вперед, записать туда один нулевой байт (fwrite) и сказать fclose. Через секунду файл на 5 Гб готов.
Но рано радоваццо. Стоит попытаться записать в конец этого файла один-единственный ненулевой байт, сказать flush и... все виснет на те же 2 минуты без всяких шансов на показ "прогресса". Чудес не бывает, увы :(
Если заполнять все 5 Гб выровненными блоками по 4 Кб, то у меня это занимает где-то 100 секунд. Плохо. Изменение размера блока не влияет. Функция chsize работает примерно столько же, но нет возможности показать пользователю "прогресс".
Но есть забавный способ. Надо открыть файл, сделать "fseek" на 5 Гб вперед, записать туда один нулевой байт (fwrite) и сказать fclose. Через секунду файл на 5 Гб готов.
Но рано радоваццо. Стоит попытаться записать в конец этого файла один-единственный ненулевой байт, сказать flush и... все виснет на те же 2 минуты без всяких шансов на показ "прогресса". Чудес не бывает, увы :(
no subject
Date: 2009-08-22 02:44 pm (UTC)no subject
Date: 2009-08-22 03:13 pm (UTC)no subject
Date: 2009-08-22 07:47 pm (UTC)no subject
Date: 2009-08-22 09:58 pm (UTC)no subject
Date: 2009-08-22 10:23 pm (UTC)no subject
Date: 2009-08-22 10:30 pm (UTC)no subject
Date: 2009-08-24 07:01 am (UTC)no subject
Date: 2009-08-24 08:13 am (UTC)no subject
Date: 2009-08-24 08:19 am (UTC)no subject
Date: 2009-08-24 08:28 am (UTC)для моей задачки sparce-файлы не подходят, к шыжалению
no subject
Date: 2009-08-24 08:30 am (UTC)no subject
Date: 2009-08-24 08:41 am (UTC)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 иначе было бы невозможно: данные стертого файла никогда не делаются случайно доступными, таков был один из принципов защиты данных при разработке этой файловой системы. Но пользоваться этим знанием все равно некошерно. Вместо нулей там может оказаться какой-то другой стирающий шаблон, например. Микрософт завещал нам считать эти данные неинициализированными, о чем
no subject
Date: 2009-08-24 06:34 pm (UTC)