2016-05-08 5 views
0

Рассмотрим эту программу:SetFilePointer без FILE_FLAG_NO_BUFFERING

#include <stdio.h> 
#include <windows.h> 
int main(int argc, char** argv) { 
    if (argc != 2) 
    return 1; 
    HANDLE j = CreateFile("\\\\.\\F:", FILE_GENERIC_READ, FILE_SHARE_WRITE, 
    NULL, OPEN_EXISTING, FILE_ATTRIBUTE_SYSTEM, NULL); 
    int k = SetFilePointer(j, atoi(argv[1]), NULL, FILE_BEGIN); 
    printf("%d\n", k); 
} 

я получаю эти результаты:

> a 512 
512 

> a 513 
-1 

> a 1024 
1024 

Так что я могу только переместить указатель файла, кратные размеру сектора тома. Это - это поведение, которое можно было бы ожидать с флагом FILE_FLAG_NO_BUFFERING . Однако я не использую этот флаг, так почему я получаю эти результаты?

ответ

3

Вы открыли прямой доступ к объему накопителя вместо файла. Чтение/запись тома должно быть даже кратным размеру сектора независимо от буферизации. Вы не можете читать/писать частичные сектора.

+0

Файловые потоки реализуют собственную буферизацию более высокого уровня, но они используют 'CreateFile()' и 'SetFilePointer()' на нижнем уровне. Таким образом, они могут читать/записывать целые сектора на более низком уровне и буферизировать по мере необходимости, чтобы обеспечить частичное чтение/запись. –

1

From the documentation for CreateFile:

Объем содержит один или более смонтированные файловые системы. Ручки объема могут быть открыты как не кэшированные по усмотрению конкретной файловой системы, даже если в приложении CreateFile не указан параметр без кэширования. Вы должны предположить, что все файловые системы Microsoft открывают дескрипторы томов как незашифрованные. Ограничения на не-кэшированный ввод-вывод для файлов также применяются к томам.

 Смежные вопросы

  • Нет связанных вопросов^_^