Мне нужен класс-оболочка C ++, который может синхронно читать / записывать / искать данные из файла хранилища Windows 8 / WP8 (http://msdn.microsoft.com/library/windows/apps/br227171):
class FileWrapper
{
public:
FileWrapper(StorageFile^ file); // IRandomAccessStream or IInputStream
// are fine as input arguments too
byte* readBytes(int bytesToRead, int &bytesGot);
bool writeBytes(byte* data, int size);
bool seek(int position);
}
Данные должны быть прочитаны из файла на лету. Он не должен кэшироваться в памяти, а файл хранилища не должен копироваться в каталог приложения, где он будет доступен для стандартных функций fopen и ifstream.
Я попытался выяснить, как это сделать (включая пример кода доступа к файлам Microsoft: http://code.msdn.microsoft.com/windowsapps/File-access-sample-d723e597) но я застрял с асинхронным доступом каждой операции. Кто-то намекает, как этого добиться? Или есть даже встроенный функционал?
С Уважением,
Обычно вы оборачиваете асинхронные операции create_task()
метод, и вы можете ждать завершения задачи, вызвав task.get()
для достижения синхронности, но IIRC это не работает для доступа к файлам, потому что операции могут попытаться вернуться в том же потоке, в котором они были выполнены, и если вы блокируете этот поток — вы получите тупик. У меня нет времени, чтобы попробовать это, но, возможно, если вы начнете в другом потоке — вы можете подождать завершения в вашем потоке, как это, хотя он все еще может зайти в тупик:
auto createTaskTask = create_task([]()
{
return create_task(FileIO::ReadTextAsync(file));
}
auto readFileTask = createTaskTask.get();
try
{
String^ fileContent = readFileTask.get();
}
catch(Exception^ ex)
{
...
}