locked
Как писать в файл через Windows::Storage::StorageFile^ на C++? RRS feed

  • Вопрос

  • Всем доброго вечера!

    Объявил несколько переменных в заголовке:

    Windows::Storage::StorageFile^ file;
    Windows::Storage::Streams::IRandomAccessStream^ stream;

    Далее в коде упростил доступ к классам:

    using namespace Platform;
    using namespace Windows::Foundation;
    using namespace Windows::Storage;
    using namespace Windows::Storage::Streams;

    В общем создаю файл в локальном хранилище приложения:

    bool File::create(const std::wstring& _fileName)
    {
    	String^ fileName=ref new String(_fileName.c_str());
    	StorageFolder^ folder=ApplicationData::Current->LocalFolder;
    	std::atomic_bool isComplete;
    	bool isErr=false;
    	isComplete=false;
    	folder->CreateFileAsync(fileName,CreationCollisionOption::ReplaceExisting)->Completed=ref new AsyncOperationCompletedHandler<StorageFile^>(
    		[&](IAsyncOperation<StorageFile^>^ _operation,AsyncStatus _status)
    	{
    		try
    		{
    			file=_operation->GetResults();
    		}
    		catch(...) {}
    		isErr=_status==AsyncStatus::Error;
    		isComplete=true;
    	});
    	while(!isComplete) {}
    	if(isErr) return false;
    	return true;
    }

    Да, способ стрёмный, потому что тупо в цикле жду когда закончится операция. Но возможности ppltasks.h так и не освоил (их concurrency::task<> у меня ошибку выбивал).В общем если кому не лень, покажите как правильно ожидать (честно говоря был бы рад если бы они тут ещё и синхронные операции сделали). На C# есть await или что-то такое для этого, но я пишу на C++. Так как же лучше тогда делать (пример если можно)?

    А теперь на счёт записи в файл. Для начала я сделал открытие:

    bool File::open(const std::wstring& _fileName,bool _isReadOnly)
    {
    	String^ fileName=ref new String(_fileName.c_str());
    	StorageFolder^ folder=ApplicationData::Current->LocalFolder;
    	std::atomic_bool isComplete;
    	bool isErr=false;
    	isComplete=false;
    	folder->GetFileAsync(fileName)->Completed=ref new AsyncOperationCompletedHandler<StorageFile^>(
    		[&](IAsyncOperation<StorageFile^>^ _operation,AsyncStatus _status)
    	{
    		try
    		{
    			file=_operation->GetResults();
    		}
    		catch(...) {}
    		isErr=_status==AsyncStatus::Error;
    		isComplete=true;
    	});
    	while(!isComplete) {}
    	if(isErr) return false;
    	file->OpenAsync(_isReadOnly ? FileAccessMode::Read : FileAccessMode::ReadWrite)->Completed=ref new AsyncOperationCompletedHandler<IRandomAccessStream^>(
    		[&](IAsyncOperation<IRandomAccessStream^>^ _operation,AsyncStatus _status)
    	{
    		try
    		{
    			stream=_operation->GetResults();
    		}
    		catch(...) {}
    		isErr=_status==AsyncStatus::Error;
    		isComplete=true;
    	});
    	while(!isComplete) {}
    	if(isErr) return false;
    	return true;
    }

    Для записи есть WriteAsync(), которая принимает IBuffer. Самое удивительное, что я не знаю чем мне создать этот самый IBuffer. Ну да, это интерфейс. Есть реализация Buffer. Но помимо того, чтобы указать размер этого буфера, я не знаю как в него внести данные. Можно пример записи данных в файл через функцию WriteAsync()? Это будет предпочтительный вариант.

    Но я решил пойти дальше. Откопал DataWriter. Написал:

    bool File::write(const std::vector<UInt8>& _buffer)
    {
    	std::atomic_bool isComplete;
    	bool isErr=false;
    	isComplete=false;
    	Array<UInt8>^ array=ref new Array<UInt8>(_buffer.size());
    	size_t len=_buffer.size();
    	for(size_t i=0;i<len;i++) array->set(i,_buffer[i]);
    	DataWriter^ writer=ref new DataWriter(stream);
    	writer->WriteBytes(array);
    	writer->StoreAsync()->Completed=ref new AsyncOperationCompletedHandler<unsigned int>(
    		[&](IAsyncOperation<unsigned int>^ _operation,AsyncStatus _status)
    	{
    		isErr=_status==AsyncStatus::Error;
    		isComplete=true;
    	});
    	while(!isComplete) {}
    	if(isErr) return false;
    	return true;
    }

    В итоге программа вылетает с исключением:

    Unhandled exception at at 0x75694B32 in Game.exe: Microsoft C++ exception:

    Platform::COMException ^ at memory location 0x007DF448. HRESULT:0x800710DD

    Ну я и собственно не знаю что делать. Как же правильно записывать данные в файл на C++?

    22 декабря 2012 г. 16:37

Ответы

  • Привет

    После открытия файла и получение объекта file, попробуйте с ним работать через пространство имен FileIO. Например в нем предусмотрены методы записи в файл - FileIO.AppendLinesAsync, FileIO.WriteLinesAsync, FileIO.WriteTextAsync. Пример можно посмотреть здесь - Writing lines to a file in c++


    Для связи [mail]

    25 декабря 2012 г. 8:11

Все ответы

  • Привет

    После открытия файла и получение объекта file, попробуйте с ним работать через пространство имен FileIO. Например в нем предусмотрены методы записи в файл - FileIO.AppendLinesAsync, FileIO.WriteLinesAsync, FileIO.WriteTextAsync. Пример можно посмотреть здесь - Writing lines to a file in c++


    Для связи [mail]

    25 декабря 2012 г. 8:11
  • Благодарю!
    25 декабря 2012 г. 9:18