make_file_based_data_storage
Перейти к навигации
Перейти к поиску
DataStorageOwn make_file_based_data_storage(const char* pszFileName, FileAccessMask nAccessMask, FileCreationDisposition nDisp); //1
template <class traits_t, class alloc_t>
DataStorageOwn make_file_based_data_storage(const std::basic_string<char, traits_t, alloc_t>& strFileName, FileAccessMask nAccessMask, FileCreationDisposition nDisp); //2
template <FileAccessMask nAccessMask, FileCreationDisposition nDisp>
/*статически_вычисленный_тип*/ make_file_based_data_storage(_In_z_ const char* pszFileName); //3
template <FileAccessMask nAccessMask, FileCreationDisposition nDisp, class traits_t, class alloc_t>
/*статически_вычисленный_тип*/ make_file_based_data_storage(const std::basic_string<char, traits_t, alloc_t>& strFileName); //4
Создает файловый буфер с интерфейсом IDataStorage (или порожденным от него), делегируя вызов функции CreateFileAsBinaryDataStorage, и адаптирует доступ с помощью соответствующего адаптера.
-
Перегрузки 3 и 4 дополнительно осуществляют преобразование интерфейса возвращаемого объекта к типу ContiguousDataStorageInputOwn, ContiguousDataStorageOutputOwn или ContiguousDataStorageOwn в зависимости от значений шаблонного параметра nAccessMask.
- Параметры
pszFileName C-строка UTF-8 с именем файла. strFileName C++ строка UTF-8 с именем файла. nAccessMask Битовая маска флагов доступа. Символическое имя Целочисленное значение Семантика FileRead 1 Право на чтение из файла. FileWrite 2 Право на запись в файл. FileReadWrite 3 Право на чтение и запись в файл. nDisp Диспозиция открытия дескриптора файла. Символическое имя Целочисленное значение Семантика FileCreateAlways 0 Создание файла - всегда. В случае если файл существует, его содержимое удаляется. FileOpenAlways 1 Открытие файла - всегда. Если файл не существует, он создается. FileCreateNew 2 Создание нового файла. Если файл не существует, возвращается ошибка CHSVERROR_ALREADY_EXISTS. FileOpenExisting 3 Открытие существующего файла. Если файл не существует, возвращается ошибка CHSVERROR_NOT_FOUND. FileTruncateExisting 4 Открытие существующего файла с удалением его содержимого. Если файл не существует, возвращается ошибка CHSVERROR_NOT_FOUND. - Возвращаемое значение:
- Объект DataStorageOwn, ContiguousDataStorageInputOwn, ContiguousDataStorageOutputOwn или ContiguousDataStorageOwn, определенный над файлом.
- См. также
DataStorageOwn Владеющий адаптер, определенный над интерфейсом IDataStorage.. IDataStorage::RepresentAs Осуществляет преобразование в интерфейс, заданный идентификатором. IContiguousDataStorage Интерфейс для чтения и записи в накопитель последовательно расположенных и однородных данных. ContiguousDataStorageOwn Владеющий адаптер, определенный над интерфейсом IContiguousDataStorage. CreateFileAsBinaryDataStorage Создает представление файла в виде источника последовательных бинарных данных с произвольным доступом.
Пример: Использование ContiguousDataStorageInputRef и ContiguousDataStorageOutputRef для работы с памятью и файлами.
#include <camaas/idatastorage.h>
#include <algorithm>
#include <utility>
#include <vector>
#include <string>
#include <iostream>
#include <iomanip>
using namespace CAMaaS;
std::string operator""_s(const char* psz, std::size_t cch) {return std::string(psz, cch);}
void TestContiguousDataSource(ContiguousDataStorageOutputRef output_side, ContiguousDataStorageInputRef input_side)
{
auto osWrite = represent_as<OutputByteStreamOwn>(output_side.write());
osWrite.write(std::vector<std::uint8_t>({0x30, 0x31, 0x32, 0x33, 0x34}));
osWrite.write(std::vector<std::uint8_t>({0x35, 0x36, 0x37, 0x38, 0x39}));
auto osWrite2 = represent_as<OutputByteStreamOwn>(output_side.write(20));
osWrite2.write(std::vector<std::uint8_t>({'a', 'b', 'c', 'd', 'e'}));
osWrite2.write(std::vector<std::uint8_t>({'e', 'f', 'g', 'h', 'i'}));
represent_as<ContiguousDataStorageOwn>(output_side).erase(10, 10);
auto osRead1 = represent_as<InputByteStreamOwn>(input_side.read());
auto v1 = osRead1.read_as<std::vector<std::uint8_t>>(10);
auto vout10 = osRead1.read_as<std::vector<std::uint8_t>>(5);
auto osRead2 = represent_as<InputByteStreamOwn>(input_side.read(15));
auto vout11 = osRead2.read_as<std::vector<std::uint8_t>>(std::size_t(input_side.byte_size() - 15));
std::move(vout10.begin(), vout10.end(), std::back_inserter(v1));
std::move(vout11.begin(), vout11.end(), std::back_inserter(v1));
auto v2 = represent_as<InputByteStreamOwn>(input_side.read()).read_all_as<std::vector<std::uint8_t>>();
std::cout << "Vectors are equal: " << std::boolalpha << (v1 == v2) << "\n";
std::cout << "Read contents: ";
for (auto b:v2)
std::cout << std::hex << b;
std::cout << "\n";
}
int main(int, char**)
{
std::cout << "===File test===\n";
auto strFile = u8"Test file.txt"_s;
auto file = make_file_based_data_storage<FileReadWrite, FileCreateAlways>(strFile);
TestContiguousDataSource(file, file);
std::cout << "===Preallocated buffer test===\n";
std::uint8_t pBuffer[100];
auto buff = make_inmemory_preallocated_data_storage(pBuffer, sizeof(pBuffer));
TestContiguousDataSource(buff, buff);
std::cout << "===Preallocated buffer test with owning===\n";
auto alloc = std::allocator<std::uint8_t>();
auto p2 = std::allocator_traits<std::allocator<std::uint8_t>>::allocate(alloc, sizeof(pBuffer));
auto buff2 = make_inmemory_preallocated_data_storage(own_buffer(p2, sizeof(pBuffer), alloc));
TestContiguousDataSource(buff2, buff2);
std::cout << "===Reading from existing buffer===\n";
auto pRead = make_inmemory_input_data_source(pBuffer, std::size_t(buff.byte_size()));
auto vRead = represent_as<InputByteStreamOwn>(pRead.read()).read_all_as<std::vector<std::uint8_t>>();
std::cout << "Read contents from the input buffer: ";
for (auto b:vRead)
std::cout << std::hex << b;
std::cout << "\n";
try
{
represent_as<ConsequentDataStorageOwn>(pRead);
std::cout << "Conversion did NOT cause an expected error\n";
}catch (Chusov::Exceptions::ChsvCodeException& ex)
{
std::cout << "Conversion caused expected error: " << ex.what() << "\n";
}
std::cout << "===Cached buffer test===\n";
auto buff_cached = make_inmemory_data_storage();
TestContiguousDataSource(buff_cached, buff_cached);
return 0;
}