2016-02-23 6 views
3

Есть функция значение «действительной длины данных»: SetFileValidData, но я не нашел способ до получить значение «действительная длина данных».Как получить «допустимую длину данных» файла?

Я хочу знать о данном файле, если EOF отличается от VDL, поскольку запись после VDL в случае VDL<EOF приведет к снижению производительности, как описано here.

+1

Кроме того, типичная «действительная длина данных» совпадает с фактическим размером файла. –

+0

@JoachimPileborg Я не имею дело с типичным случаем ... – avim

+0

Любопытно, не будете ли вы просто включать все байты, которые существуют на диске, которые находятся после окончания данных файла? – Marichyasana

ответ

0

Я нашел this страницу, утверждает, что:

нет механизма для запроса значения VDL

Так что ответ "вы не можете".

Если вы заботитесь о производительности, вы можете установить VDL в EOF, но затем обратите внимание, что вы можете разрешить доступ старого мусора на вашем диске - часть между этими двумя указателями, которые должны быть нулями, если вы хотите получить доступ к этому файлу не устанавливая VDL для указания EOF.

1

Я думаю, вы смущены относительно того, что на самом деле «действительная длина данных» означает. Проверьте this answer.

В принципе, в то время как SetEndOfFile позволяет быстро увеличить длину файла и выделяет пространство на диске, если вы перейдете к (новому) концу файла для записи там, все дополнительно выделенное дисковое пространство должно будет быть перезаписанными нулями, что является медленным.

SetFileValidData позволяет пропустить, что обнуление. Вы говорите системе: «Я в порядке с тем, что находится в этих блоках диска, продолжайте с ним». (Вот почему вам нужно SE_MANAGE_VOLUME_NAME привилегию, как это могло бы раскрыть данные в льготных условиях unpriviledged пользователей, если вы не перезаписывать данные. Пользователи с это привилегия может получить доступ к данным необработанных дисков в любом случае.)

В любом случае, , вы установили новый эффективный размер файла. (Который вы может читать назад.) Что именно, должен отдельный отчет «читать файл действительных данных»? SetFileValidDataсказал системе, что все, что в этих дисковых блоках является «действительным» ...


Различного подходом объяснения:

documentation упоминает, что «действительная длиной данных» является отслежено; целью этого является то, что система должна знать, какой диапазон (от конечных действительных данных до конца файла) по-прежнему нуждается в нулевом, в контексте SetEndOfFile, когда это необходимо (например, вы закрываете файл). Вы не нужно читать назад это значение, потому что единственный способ, которым это может быть другого от фактического файла размер происходит потому, что вы сами, так и изменить его с помощью вышеупомянутых функций ...

+0

. Я хорошо осведомлен о значении VDL. В моем сценарии имеет смысл запросить его, так как я хочу * отклонять * файлы, предоставленные мне с VDL 0 и большим EOF. (Помните, что VDL не всегда устанавливается мной +, он может быть изменен с момента последнего набора, используя SetFileValidData, из-за записи около конца файла.) – avim

+0

@avim: Включение этой информации в вопрос было бы длинным * способом не закрывать его как «неясное» и получать ответы на вопросы. Сказанное, я не думаю, что есть способ прочитать это свойство, не полагаясь на недокументированное поведение. Я также все еще не уверен в вашем случае использования; доступная документация по VDL неясна в семантике в случае, который вы описываете, поэтому вы можете * уже * предполагать слишком много. – DevSolar

+0

thanks @DevSolar, похоже, что нет способа прочитать его. – avim

0

SetValidData (в соответствии с MSDN) можно использовать для создания, например, большого файла без необходимости записи в файл. Для базы данных это будет выделять (смежную) область хранения.

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

Подразумевается, что любой GetValidData (который не существует) просто возвращает размер файла, поэтому вы можете использовать GetFileSize, который возвращает «действительный» размер файла.

+0

'GetFileSize' возвращает размер по позиции EOF, а не VDL – avim

+1

Позиция EOF - это размер файла и является VDL. –

+0

Пожалуйста, прочитайте мои ссылки в вопросе, вы увидите, что это не так – avim