Как скопировать содержимое CFile в CMemFile? - PullRequest
1 голос
/ 15 апреля 2019

Как скопировать все содержимое CFile в CMemFile в ОС Windows.Я попробовал код ниже, чтобы скопировать содержимое.

CMemFile memFile;
bool b = memFile.Open( L"C:\\test.txt",  CFile::modeReadWrite);
int Length = memFile.GetLength();
unsigned char* buffer = new unsigned char[Length];
memFile.Read((void*)buffer,Length);
memFile.Close();

Но memFile.GetLength возвращает 0. тогда как если я пытаюсь с CFile, GetLength () возвращает некоторую допустимую длину.

CFile f;
bool b1 = f.Open( L"C:\\test.txt",  CFile::modeReadWrite);
int Lengh = f.GetLength();
f.Close();

Спасибо.

Ответы [ 2 ]

0 голосов
/ 16 апреля 2019

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

  • Открыть файл на диске, передав правильные параметры.
  • Выделите память для использования экземпляром CMemFile.
  • Считайте содержимое диска в буфер памяти, контролируемый CMemFile.

Ниже приведена возможная реализация:

// Open file on disk
// typeBinary is necessary to read the raw, untransformed contents
// shareDenyWrite is required to prevent the file from changing in between querying
//     its size and reading the contents
// osSequentialScan could be used to provide an access pattern hint to the OS
//     to allow it to better optimize the (potentially slow) disk accesses
CFile File( L"C:\\test.txt", CFile::modeRead | CFile::typeBinary | CFile::shareDenyWrite );
auto Length = File.GetLength();

// Construct CMemFile instance and allocate memory
CMemFile memFile();
auto buffer = memFile.Alloc( Length );
if ( !buffer ) {
    // Depending on your exception handling system, call AfxThrowMemoryException instead
    throw std::bad_alloc();
}
// Transfer ownership of the buffer to the CMemFile instance
memFile.Attach( buffer, Length );

// Read contents into memory buffer
// Note, that this is limited to file sizes smaller than 4 GB
File.Read( buffer, static_cast<UINT>( Length ) );

В этот момент все содержимое файла диска было считано в буфер CMemFile instance ', при условии, что по пути не возникло никаких исключений.Все ресурсы контролируются объектами C ++, и ручная очистка не требуется.Когда объект memFile выходит из области видимости, его память автоматически освобождается.Когда экземпляр File выходит из области видимости, файл системного уровня HANDLE закрывается.

0 голосов
/ 15 апреля 2019

Я могу выполнить свое требование, используя приведенный ниже код.

CFile f;
bool b = f.Open( L"C:\\test.txt",  CFile::modeReadWrite);
int nLength = f.GetLength();
BYTE* buffer = new BYTE[nLength];
f.Read((void*)buffer,nLength);
f.Close();
CMemFile memFile;
memFile.Attach(buffer, nLength);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...