Копирование файла C++/CX WinRT

Я действительно мучаюсь из-за пространства имен WinRT Windows::Storage со всей его асинхронностью.

У меня есть следующие частные члены в моем заголовочном файле:

//Members for copying the SQLite db file
Platform::String^ m_dbName;
Windows::Storage::StorageFolder^ m_localFolder;
Windows::Storage::StorageFolder^ m_installFolder;
Windows::Storage::StorageFile^ m_dbFile;

И у меня есть следующий блок кода в моем файле реализации:

//Make sure the SQLite Database is in ms-appdata:///local/
m_dbName = L"DynamicSimulations.db";
m_localFolder = ApplicationData::Current->LocalFolder;
m_installFolder = Windows::ApplicationModel::Package::Current->InstalledLocation;

auto getLocalFileOp = m_localFolder->GetFileAsync(m_dbName);
getLocalFileOp->Completed = ref new AsyncOperationCompletedHandler<StorageFile^>([this](IAsyncOperation<StorageFile^>^ operation, AsyncStatus status)
{
    m_dbFile = operation->GetResults();

    if(m_dbFile == nullptr)
    {
        auto getInstalledFileOp = m_installFolder->GetFileAsync(m_dbName);
        getInstalledFileOp->Completed = ref new AsyncOperationCompletedHandler<StorageFile^>([this](IAsyncOperation<StorageFile^>^ operation, AsyncStatus status)
        {
            m_dbFile = operation->GetResults();
            m_dbFile->CopyAsync(m_localFolder, m_dbName);
        });
    }
});

Я получаю нарушение доступа к памяти, когда он достигает m_dbFile = operation->GetResults();

Что мне здесь не хватает? Я исхожу из фона С#, в котором это действительно легко сделать:/

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

спасибо за помощь!


person Eric    schedule 21.11.2013    source источник
comment
У меня еще не было возможности взглянуть на ваш код, но в качестве синхронной альтернативы рассмотрите CopyFile2, который можно вызвать из приложения Магазина Windows.   -  person James McNellis    schedule 23.11.2013
comment
да, так намного лучше :)   -  person Eric    schedule 23.11.2013
comment
Эти ссылки объясняют модель асинхронного программирования с C++: msdn.microsoft. com/en-us/library/windows/apps/hh780559.aspx   -  person Raman Sharma    schedule 06.12.2013
comment
Попробуйте заменить this на = в переменных, которые нужно захватить внутри лямбды. Но = будет захватывать только те переменные, которые находятся в той же области действия лямбды. Если переменные m_installFolder, m_localFolder и m_dbName находятся в той же области, что и лямбда, то все в порядке. Если нет, укажите их явно в квадратных скобках.   -  person yasouser    schedule 06.01.2014


Ответы (2)


Если вас интересует решение WinRT, вот оно:

Кажется, все, что вам нужно сделать, это скопировать файл БД из установленного места в локальную папку. Для этого должно хватить следующего кода:

//Make sure the SQLite Database is in ms-appdata:///local/
m_dbName = L"DynamicSimulations.db";
m_localFolder = ApplicationData::Current->LocalFolder;
m_installFolder = Windows::ApplicationModel::Package::Current->InstalledLocation;

create_task(m_installFolder->GetFileAsync(m_dbName)).then([this](StorageFile^ file)
{
    create_task(file->CopyAsync(m_localFolder, m_dbName)).then([this](StorageFile^ copiedFile)
    {
        // do something with copiedFile
    });
});
person Raman Sharma    schedule 03.01.2014

Я уже пробовал эту штуку. Не делайте этого:

if(m_dbFile == nullptr)

Вместо этого проверьте значение «status».

if(status == AsyncStatus::Error)
person seggaeman    schedule 25.08.2014