GetFileSizeEx повреждает дескриптор файла - PullRequest
0 голосов
/ 29 сентября 2010

В настоящее время я использую GetFileSizeEx для отслеживания размера файлов журнала, прежде чем писать в него. У нас ограниченное пространство, и если мы пытаемся создать файл размером более 100 мегабайт, мы прекращаем регистрировать данные. Проблема в том, что GetFileSizeEx по какой-то причине повредит дескриптор файла, который я использую.

if( hFileHandle != INVALID_HANDLE_VALUE && hFileHandle != NULL )
{
 asDbgMsg = asDbgMsg + asDelimeter;
 dwBytesToWrite =asDbgMsg.Length();
 pWrtBuffer = asDbgMsg.c_str();
 // Get the file size we are about to write to.
 PLARGE_INTEGER lpFileSize;
 GetFileSizeEx(hFileHandle, lpFileSize);

 // Don't write out the file if it is more than 100 mb!
 if(lpFileSize->QuadPart < 104857600)
 {
  WriteFile( hFileHandle, pWrtBuffer, dwBytesToWrite, &dwBytesWritten, NULL );
 }
}

hFileHandle перейдет от нормального значения (00000EB8) к ???? в отладчике студии Rad.

Теперь я решил эту проблему, используя вместо этого функцию GetFileSize:

if( hFileHandle != INVALID_HANDLE_VALUE && hFileHandle != NULL )
{
 asDbgMsg = asDbgMsg + asDelimeter;
 dwBytesToWrite =asDbgMsg.Length();
 pWrtBuffer = asDbgMsg.c_str();
 // Get the file size we are about to write too.
 DWORD test;
 GetFileSize(hFileHandle, &test);
 // Don't write out the file if it is more than 100 mb!
 if(test < 104857600)
 {
  WriteFile( hFileHandle, pWrtBuffer, dwBytesToWrite, &dwBytesWritten, NULL );
 }
}

Однако я бы предпочел не использовать нерасширенную функцию. Я удалил файл, чтобы убедиться, что ни у какого другого процесса нет блокировки, но у него все еще есть проблема при создании файла. Должен отметить, что эта ошибка не возникает при сборке 6, только в Rad Studio 2010.

Спасибо за помощь.

1 Ответ

2 голосов
/ 29 сентября 2010

Попробуйте использовать LARGE_INTEGER вместо PLARGE_INTEGER.Обычно PLARGE_INTEGER - это указатель, а не значение.

...