| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Системное программирование и WinAPI > SetFileValidData |
| Автор: hash_2000 9.10.2009, 06:31 |
| Доброго времени суток! подскажите ктонибудь кто пользовался функцией SetFileValidData .... как ей пользоваться !!!? при использованиии всегда возвращает ошибку выполнения GetLastError() == ERROR_PRIVILEGE_NOT_HELD в МСДН написано что должны быть установлены привелегии SE_MANAGE_VOLUME_NAME , не знаю где их устанавливать , и чем это грозит ... |
| Автор: Andrey44 9.10.2009, 07:03 | ||
Как-то так можно установить SE_MANAGE_VOLUME_NAME привелегии Ну а дальше пробуйте |
| Автор: hash_2000 9.10.2009, 07:06 | ||
| ну ладно ... никому я смотрю не интересно ... или никто не знает ... для того чтобы установить привилегии для процесса нужно сделать следующее:
Добавлено через 1 минуту и 39 секунд |
| Автор: GremlinProg 9.10.2009, 08:49 | ||
| SetFileValidData - это некоторый аналог разреженных файлов, позволяет заполнить нулями некоторую файловую область, фзиически этого не делая вот самые важные условия:
|
| Автор: hash_2000 9.10.2009, 10:22 | ||
| ... только вот функция почемуто постоянно возвращает ошибку ... хотя я нашел способ чтобы эта функция работала , перед ее вызовом нужно написать следующее:
|
| Автор: GremlinProg 9.10.2009, 11:18 |
| hash_2000, только SetEndOfFile и ставит физически размер файла, если он не разреженный SetFilePointer этого делать и не должен |
| Автор: hash_2000 9.10.2009, 12:28 | ||
| SetEndOfFile как получается не устанавливает физический размер файла , а устанавливает , так называемый логический размер файла ... тоесть на самом деле данных внутри файла нет ... тоесть сначала мы ставим указатель в файле куданибудь с помощью функции SetFilePointer ... затем когда выполняем SetEndOfFile ... то по указателю в файле устанавливается размер ... я так понял работает эта функция ... во первых если выполнить следующий код:
... то функция слишком быстро выполнится , для выделения физического размера файла 64 ГБ а если потом попробовать записать один байт в конец файла то сразу будет заметно что выделяется физическое пространство ... Добавлено через 1 минуту и 22 секунды вот теперь у меня вопрос в другом , зачем нужна функция SetFileValidData , если за нее все выполняет связка SetFilePointer и SetEndOfFile ... |
| Автор: hash_2000 9.10.2009, 12:55 | ||
ну посмотрел я на сколько уменьшилось место на даске , после
на 64 Гб уменьшилось ... и что это означает ? тоесть если я выполню SetFileValidData место на диске не уменьшится ... ? или я чегото не пойму ... |
| Автор: GremlinProg 9.10.2009, 13:01 | ||
нет, не должно, если ты поставишь его на 64 кб, то просто при последовательном чтении всего этого файла, время чтения займет физическое чтение с диска 64кб + время заполнения оставшегося пространства нулями, а это несоизмеримо меньше, чем если бы ты читал все 64 Гб функция сделана специально "на вырост" файла, чтобы можно было заполнять его по факту наличия текущих данных, а не по факту его конечного размера |
| Автор: hash_2000 9.10.2009, 13:05 |
| ну тогда как заставить эту функцию работать ? выше я писал что получается без SetFilePointer и SetEndOfFile |
| Автор: GremlinProg 9.10.2009, 13:21 |
| без SetFilePointer и SetEndOfFile функция будет работать только если ты откроешь заранее созданный файл достаточного размера, чтобы он покрывал размер, передаваемый в SetFileValidData в остальных случаях SetFilePointer и SetEndOfFile обязательны 1. создай новый файл 2. сдвинь указатель на 64Гб 3. укажи конец файла 4. вызови SetFileValidData с размером в 64 кб вот и все, можешь прочитать, к примеру в цикле этот файл с начала до конца буфером в 64 кб и посмотри насколько быстро это произойдет потом можешь закомментировать SetFileValidData и снова запустить программу (для 64 Гб, пока она работает, ты успеешь и прогуляться, и поужинать и потом, скорее всего, когда тебе надоест ждать, ты просто ее "придушишь" ) Добавлено @ 13:28 кстати, когда будешь это делать, поставь брейкпойнт после вызова SetFileValidData и посмотри из эксплорера свойства файла, скажи есть ли разница между параметрами "Размер" и "На диске" это будет точным ответом на твой вопрос: "место на диске не уменьшится ... ?" |
| Автор: hash_2000 9.10.2009, 14:02 |
| GremlinProg попробовал я сделать так как ты написал , и с SetFileValidData и без нее читает одинаково ... может я не правильно както написал , GremlinProg выложи код если не трудно ... пример ... |
| Автор: GremlinProg 9.10.2009, 14:16 | ||
без проверок, примерно так:
|
| Автор: hash_2000 9.10.2009, 14:32 |
| ну я все так и делал ... и место на диске отнялось и читает нифига не в мгновение ... место отнялось после функции SetEndOfFile ... а после SetFileValidData ... оно если должно было прибавиться , то оно не прибавилось ... и читалось примерно одинаково по времени .... |
| Автор: GremlinProg 9.10.2009, 14:56 | ||
значит бонус только в том, что не приходится писать нули в файл, хотя и нелогично, физически он же их не пишет может стоит перед чтением его заполнить:
|