2016-05-04 50 views
1

我一直在嘗試從C++中的Windows 10應用程序中的文件讀取數據。然而,我正在努力正確地構造異步任務,並且不斷地讓錯誤告訴我讀取數據的參數類型不正確。我一直試圖使用GetFileAsync和GetFileFromPathAsync來獲取我的StorageFile,但ReadTextAsync(文件)不會編譯。如何在visual C++中異步讀取文件?

這裏是代碼中的相關部分,我已經寫了:

auto file = Windows::Storage::StorageFile::GetFileFromPathAsync("C:\\data.txt"); 
     concurrency::create_task(Windows::Storage::FileIO::ReadTextAsync(file)).then([this, file](concurrency::task<Platform::String^> task) 
      { 
       try 
       { 
        Platform::String^ fileContent = task.get(); 
       } 
      }); 

給出的錯誤是「文件」是不正確的類型ReadTextAsync。它應該採用IStorageFile,但是當按照上面的方法構建我的文件時,它會接收IAsyncOperation類型。

我被給出了一些建議,說明這個功能不正常的原因是我沒有在任務中包含路徑集合,但是我有問題試圖將任務鏈接在一起以獲取數據。我很肯定我錯過了一些基本的東西,但是如何正確讀取數據的任何指導都將不勝感激。

回答

3

這是因爲Windows::Storage::StorageFile::GetFileFromPathAsync返回您應該首先執行的異步操作,它將返回IStorageFile^。這應該如下(我還沒有編譯它):

auto getFileAsync = Windows::Storage::StorageFile::GetFileFromPathAsync("C:\\data.txt"); 
create_task(getFileAsync).then([this](StorageFile^ sf){ 
    create_task(FileIO::ReadTextAsync(sf)).then([this](Platform::String^ text){ 
     // here use text 
    }); 
}); 
+0

嗯,這是異步 - 如果你想讓它馬上就需要調用'獲得()中運行,那麼,'在任務由create_task返回。要小心,因爲你不應該在GUI線程上做它。我在答案中做了一些小改動。 – marcinj

+0

非常感謝您的幫助!我終於可以看到正確的信息了。但是,我試圖將這些文本本地存儲在我的程序中,以便稍後將它傳遞給算法。試圖在該任務外設置一個等於'text'的變量會產生一個 「一個封閉函數局部變量不能在lambda體中被引用,除非它在捕獲列表中」錯誤。 有沒有什麼方法可以讓我在任務完成後存儲這些值以供使用? – hnobuhisa

+0

@hnobuhisa你應該在捕獲列表中捕獲你的本地變量,即[&mylocalvar],但是如果你異步執行你的文件讀取任務,那麼你不應該捕獲局部變量,而是移動這個變量來封閉類。有關捕獲列表的更多信息,請閱讀此處:http://en.cppreference.com/w/cpp/language/lambda。 – marcinj