Нужно было укоротить файл выкусив кусок в начале. Ну понятно, открыл, сдвинул новое начало вперед, а вот как установить новый конец не нашел :(, поэтому переделал Close так:
class CFileMap
{
...
bool Close( long newsize = 0);
...
}
bool CFileMap::Close( long newsize )
{
if ( hMap )
CloseHandle( hMap );
hMap = 0;
if ( lpMapView )
UnmapViewOfFile( lpMapView );
lpMapView = 0;
if ( newsize )
{
//переводим указатель
DWORD result = SetFilePointer( hFile, newsize, 0, FILE_BEGIN );
if ( result != newsize )
{
return false;
}
//устанавливаем новый конец файла
if ( !SetEndOfFile( hFile ) )
{
return false;
}
}
if ( hFile != INVALID_HANDLE_VALUE )
CloseHandle( hFile );
hFile = INVALID_HANDLE_VALUE;
dwSize = 0;
return true;
}
Хороший класс.
Вот только по-моему не самый лучший способ репортить ошибки. Это был единственный не-интуитивно понятный мне член класса. Гораздо лучше было бы сделать что-нибудь вроде CFileMap::errorEnum CFileMap::Error();
а вот operator void*() или char*() [] и иже с ним был бы, имхо, очень кстати.
У меня к этому классу отношение как к суррогату потоков С++, а в них применен такой же подход. Но не Вы первый, кто меня за это критиковал :)
Мысль была такая: operator bool() используется только для проверки успеха/неудачи, а получить код ошибки позволит GetLastError().
Если уж быть последовательным, идеально было бы реализовать
template<class T>
operator T*();
Но VC этого не позволяет :(
А почему деструктор не виртуальный? И функции не все встроенные?
С Новым Годом!
Здравствуйте, Odi$$ey, Вы писали:
OE>Нужно было укоротить файл выкусив кусок в начале. Ну понятно, открыл, сдвинул новое начало вперед, а вот как установить новый конец не нашел , поэтому переделал Close так:
OE> if ( newsize )
OE> {
OE> //переводим указатель
OE> DWORD result = SetFilePointer( hFile, newsize, 0, FILE_BEGIN );
OE> if ( result != newsize )
OE> {
OE> return false;
OE> }
OE> //устанавливаем новый конец файла
OE> if ( !SetEndOfFile( hFile ) )
OE> {
OE> return false;
OE> }
OE> }
OE> if ( hFile != INVALID_HANDLE_VALUE )
OE> CloseHandle( hFile );
Отлично! Просто отлично! Как классно придумано! Выйти из Close частично поотдавав ресурсы и не отдав hFile. Очень надеюсь, что это было сделано в домашней поделке, а не в серьезном проекте.
Здравствуйте, Tan4ik, Вы писали:
T>Отлично! Просто отлично! Как классно придумано! Выйти из Close частично поотдавав ресурсы и не отдав hFile. Очень надеюсь, что это было сделано в домашней поделке, а не в серьезном проекте.
Андрей, а можно заодно и
мой вариантАвтор: SchweinDeBurg
Дата: 12.07.04
обос... отрецензировать?