Класс CFileMap
От: Виталий Брусенцев www.airbandits.com/
Дата: 12.11.01 02:24
Оценка: 156 (3) +1
Статья:
Класс CFileMap
Автор(ы): Виталий Брусенцев
Дата: 12.11.2001

Класс CFileMap упрощает работу с файлами, проецируемыми в память
(memory-mapped files).


Авторы:
Виталий Брусенцев

Аннотация:
Класс CFileMap упрощает работу с файлами, проецируемыми в память (memory-mapped files).
Успехов,
Виталий.
Новый размер
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 22.08.02 13:03
Оценка: +1
Нужно было укоротить файл выкусив кусок в начале. Ну понятно, открыл, сдвинул новое начало вперед, а вот как установить новый конец не нашел :(, поэтому переделал 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;
}
operator bool()
От: ghostrider Беларусь https://www.linkedin.com/in/andreipushkin
Дата: 13.11.01 02:24
Оценка:
Хороший класс.
Вот только по-моему не самый лучший способ репортить ошибки. Это был единственный не-интуитивно понятный мне член класса. Гораздо лучше было бы сделать что-нибудь вроде CFileMap::errorEnum CFileMap::Error();
а вот operator void*() или char*() [] и иже с ним был бы, имхо, очень кстати.
Re: operator bool()
От: retalik www.airbandits.com/
Дата: 20.11.01 20:40
Оценка:
У меня к этому классу отношение как к суррогату потоков С++, а в них применен такой же подход. Но не Вы первый, кто меня за это критиковал :)
Мысль была такая: operator bool() используется только для проверки успеха/неудачи, а получить код ошибки позволит GetLastError().
Если уж быть последовательным, идеально было бы реализовать

template<class T>
operator T*();

Но VC этого не позволяет :(
Успехов,
Виталий.
Re: Класс CFileMap
От: Аноним  
Дата: 28.12.03 19:10
Оценка:
А почему деструктор не виртуальный? И функции не все встроенные?
С Новым Годом!
Re: Новый размер
От: Tan4ik Россия  
Дата: 16.07.04 11:21
Оценка:
Здравствуйте, 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. Очень надеюсь, что это было сделано в домашней поделке, а не в серьезном проекте.
---
С уважением,
Лазарев Андрей
Re[2]: Новый размер
От: SchweinDeBurg Россия http://zarezky.spb.ru/
Дата: 17.07.04 11:25
Оценка:
Здравствуйте, Tan4ik, Вы писали:

T>Отлично! Просто отлично! Как классно придумано! Выйти из Close частично поотдавав ресурсы и не отдав hFile. Очень надеюсь, что это было сделано в домашней поделке, а не в серьезном проекте.


Андрей, а можно заодно и мой вариант
Автор: SchweinDeBurg
Дата: 12.07.04
обос... отрецензировать?
- Искренне ваш, Поросенок Пафнутий ~ ICQ#116846877
In Windows, there’s always a catch… © Paul DiLascia
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.