Модераторы: feodorv, GremlinProg, xvr, Fixin

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> SetFileValidData, никто не пользовался такой функцией 
:(
    Опции темы
hash_2000
Дата 9.10.2009, 06:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 12.9.2008

Репутация: нет
Всего: нет



Доброго времени суток!
подскажите ктонибудь кто пользовался функцией SetFileValidData  .... как ей пользоваться !!!? smile ... 
при использованиии всегда возвращает ошибку выполнения GetLastError() == ERROR_PRIVILEGE_NOT_HELD
в МСДН написано что должны быть установлены привелегии SE_MANAGE_VOLUME_NAME , не знаю где их устанавливать , и чем это грозит ...
PM MAIL   Вверх
Andrey44
Дата 9.10.2009, 07:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 8
Всего: 26



Код

HANDLE hToken;
    TOKEN_PRIVILEGES* NewState;
    OpenProcessToken (GetCurrentProcess (), TOKEN_ADJUST_PRIVILEGES, &hToken);
    NewState = (TOKEN_PRIVILEGES*) malloc (sizeof(TOKEN_PRIVILEGES) + sizeof (LUID_AND_ATTRIBUTES));
    NewState->PrivilegeCount = 1;
    LookupPrivilegeValue (NULL, SE_MANAGE_VOLUME_NAME, &NewState->Privileges[0].Luid);
    NewState->Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    AdjustTokenPrivileges (hToken, FALSE, NewState, NULL, NULL, NULL);
    free (NewState);
    CloseHandle (hToken);

Как-то так можно установить SE_MANAGE_VOLUME_NAME привелегии 
Ну а дальше пробуйте


--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
hash_2000
Дата 9.10.2009, 07:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 12.9.2008

Репутация: нет
Всего: нет



ну ладно ... никому я смотрю не интересно ... или никто не знает ... 
для того чтобы установить привилегии для процесса нужно сделать следующее: 
Код


    TOKEN_PRIVILEGES tp;
    tp.PrivilegeCount = 1;
    tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

    HANDLE hProc;
    if( !OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hProc ) )
    {

        if( LookupPrivilegeValue( NULL, SE_MANAGE_VOLUME_NAME, &tp.Privileges[0].Luid  ) )
            if( !AdjustTokenPrivileges( hProc, FALSE, &tp, 0, NULL, NULL ) )
                return ; // не получилось, выходим
    }

    HANDLE hFile = CreateFile( .... );

    SetFileValidData( hFile, 1 * 1024 * 1024 );
    DWORD dwerr = GetLastError();
    // вот здесь возникла новая ошибка dwerr == ERROR_INVALID_PARAMETER
    // проблема еще не решена



Добавлено через 1 минуту и 39 секунд
smile кто то написал вместе со мной ... только написали мы практически одно и тоже ... но сама проблема не решена
PM MAIL   Вверх
GremlinProg
Дата 9.10.2009, 08:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



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

вот самые важные условия:
Цитата

Allocation size: the size of the space that is allocated for a file on a disk, which is always an even multiple of the cluster size
Valid data length: the length of the data in a file that is actually written, to the byte. This value is always less than or equal to the file size. 



--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
hash_2000
Дата 9.10.2009, 10:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 12.9.2008

Репутация: нет
Всего: нет



... только вот функция почемуто постоянно возвращает ошибку ... 
хотя я нашел способ чтобы эта функция работала , перед ее вызовом нужно написать следующее:

Код


    LARGE_INTEGER pos;
    pos.QuadPart =  ... ; // тут размер указываем куда сдвинуться 

    pos.LowPart = SetFilePointer( m_hFile, 
        pos.LowPart, &pos.HighPart, (DWORD)FILE_BEGIN);

    // даже если файл меньшего размера чем указано в смещении функция всеравно возвращает истину
    // но при этом сам фал не станет указанного размера ..

    ::SetEndOfFile( m_hFile );
    // вот после этого и файл станет размером которое указано в смещении и уже после этого
    // можно вызывать SetFileValidData , как описано выше , функция будет возвращать истину ,
    // вот только не понятно зачем она тогда вообще нужна , если все что нужно было сделано ранее


PM MAIL   Вверх
GremlinProg
Дата 9.10.2009, 11:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



hash_2000, только SetEndOfFile и ставит физически размер файла, если он не разреженный
SetFilePointer этого делать и не должен


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
hash_2000
Дата 9.10.2009, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 12.9.2008

Репутация: нет
Всего: нет



SetEndOfFile как получается не устанавливает физический размер файла , а устанавливает , так называемый логический размер файла ... тоесть на самом деле данных внутри файла нет ...
тоесть сначала мы ставим указатель в файле куданибудь с помощью функции SetFilePointer ... затем когда выполняем SetEndOfFile ... то по указателю в файле устанавливается размер ... 
я так понял работает эта функция ...
во первых если выполнить следующий код:

Код

 LARGE_INTEGER pos;
    pos.QuadPart =  0xFFFFFFFFF ; 
    pos.LowPart = SetFilePointer( m_hFile, 
        pos.LowPart, &pos.HighPart, (DWORD)FILE_BEGIN);
    ::SetEndOfFile( m_hFile );


... то функция слишком быстро выполнится , для выделения физического размера файла 64 ГБ
а если потом попробовать записать один байт в конец файла то сразу будет заметно что выделяется физическое пространство ...

Добавлено через 1 минуту и 22 секунды
вот теперь у меня вопрос в другом , зачем нужна функция SetFileValidData , если за нее все выполняет связка SetFilePointer и SetEndOfFile ... 
PM MAIL   Вверх
GremlinProg
Дата 9.10.2009, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(hash_2000 @  9.10.2009,  14:28 Найти цитируемый пост)
SetEndOfFile как получается не устанавливает физический размер файла , а устанавливает , так называемый логический размер файла


Цитата(SetEndOfFile Function @  MSDN)

Sets the physical file size for the specified file to the current position of the file pointer.


можешь поставить брейкпойнт после SetEndOfFile и посмотреть на сколько уменьшился объем диска
другое дело, сам диск - логическая единица, физически ставится только маркер в таблице файлов,
а заполнять файл нулями он не должен

Цитата(hash_2000 @  9.10.2009,  14:28 Найти цитируемый пост)
а если потом попробовать записать один байт в конец файла то сразу будет заметно что выделяется физическое пространство ...

это от физического размера не зависит,
тут начинает работать буферизация встроенная или своя - без разницы

Добавлено через 1 минуту и 58 секунд
Цитата(hash_2000 @  9.10.2009,  14:28 Найти цитируемый пост)
вот теперь у меня вопрос в другом , зачем нужна функция SetFileValidData , если за нее все выполняет связка SetFilePointer и SetEndOfFile

Цитата(GremlinProg @  9.10.2009,  10:49 Найти цитируемый пост)
позволяет заполнить нулями некоторую файловую область, фзиически этого не делая

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


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
hash_2000
Дата 9.10.2009, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 12.9.2008

Репутация: нет
Всего: нет



ну посмотрел я на сколько уменьшилось место на даске , после 

Код

LARGE_INTEGER pos;
    pos.QuadPart =  0xFFFFFFFFF ; 
    pos.LowPart = SetFilePointer( m_hFile, 
        pos.LowPart, &pos.HighPart, (DWORD)FILE_BEGIN);
    ::SetEndOfFile( m_hFile );


на 64 Гб уменьшилось ... и что это означает ? тоесть если я выполню SetFileValidData место на диске не уменьшится ... ? или я чегото не пойму ... 
PM MAIL   Вверх
GremlinProg
Дата 9.10.2009, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(hash_2000 @  9.10.2009,  14:55 Найти цитируемый пост)
если я выполню SetFileValidData место на диске не уменьшится ... ?

нет, не должно,
если ты поставишь его на 64 кб, то просто при последовательном чтении всего этого файла,
время чтения займет физическое чтение с диска 64кб + время заполнения оставшегося пространства нулями,
а это несоизмеримо меньше, чем если бы ты читал все 64 Гб

функция сделана специально "на вырост" файла, чтобы можно было заполнять его по факту наличия текущих данных,
а не по факту его конечного размера


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
hash_2000
Дата 9.10.2009, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 12.9.2008

Репутация: нет
Всего: нет



ну тогда как заставить эту функцию работать ? выше я писал что получается без SetFilePointer и SetEndOfFile
PM MAIL   Вверх
GremlinProg
Дата 9.10.2009, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



без SetFilePointer и SetEndOfFile функция будет работать только если ты откроешь заранее созданный файл достаточного размера, чтобы он покрывал размер, передаваемый в SetFileValidData

в остальных случаях SetFilePointer и SetEndOfFile обязательны

1. создай новый файл
2. сдвинь указатель на 64Гб
3. укажи конец файла
4. вызови SetFileValidData с размером в 64 кб

вот и все, можешь прочитать, к примеру в цикле этот файл с начала до конца буфером в 64 кб и посмотри насколько быстро это произойдет

потом можешь закомментировать SetFileValidData и снова запустить программу (для 64 Гб, пока она работает, ты успеешь и прогуляться, и поужинать и потом, скорее всего, когда тебе надоест ждать, ты просто ее "придушишь" )

Добавлено @ 13:28
кстати, когда будешь это делать, поставь брейкпойнт после вызова SetFileValidData и посмотри из эксплорера свойства файла, скажи есть ли разница между параметрами "Размер" и "На диске"

это будет точным ответом на твой вопрос: "место на диске не уменьшится ... ?"

Это сообщение отредактировал(а) GremlinProg - 9.10.2009, 13:28


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
hash_2000
Дата 9.10.2009, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 12.9.2008

Репутация: нет
Всего: нет



GremlinProg попробовал я сделать так как ты написал , и с SetFileValidData  и без нее читает одинаково ... 
может я не правильно както написал , GremlinProg выложи код если не трудно ...  пример ...
PM MAIL   Вверх
GremlinProg
Дата 9.10.2009, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



без проверок, примерно так:
Код

BYTE buffer[0x10000];
LARGE_INTEGER size;

hFile = ::CreateFile( lpszFilename, ... );
size.QuadPart= LONGLONG(64) * 1024 * 1024 * 1024;
::SetFilePointer( hFile, size.LowPart, &size.HighPart , FILE_BEGIN  );
::SetEndOfFile( hFile );
::SetFileValidData( 0x10000);
::SetFilePointer( hFile, 0, NULL, FILE_BEGIN  );

for( i =  size.QuadPart / sizeof(buffer) ; i-- ; ){
  ::ReadFile( hFile, buffer, 0x10000, &readed, NULL );
}



--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
hash_2000
Дата 9.10.2009, 14:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 12.9.2008

Репутация: нет
Всего: нет



ну я все так и делал ... и место на диске отнялось и читает нифига не в мгновение ...
место отнялось после функции SetEndOfFile ... а после SetFileValidData ... оно если должно было прибавиться , то оно не прибавилось ... 
и читалось примерно одинаково по времени .... 
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0810 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.