2015-10-14 77 views
0

我想从我的资产文件夹打开一个XML文件,但不幸的是,我只能通过使用FileOpenPicker打开我的XML文件,这不是最理想的情况,当我必须不断获取我的XML文件,当然不会打扰用户。C++/CX - GetFileAsync抛出断点错误

FileOpenPicker^ openPicker = ref new FileOpenPicker(); 
openPicker->ViewMode = PickerViewMode::List; 
openPicker->SuggestedStartLocation = PickerLocationId::Desktop; 
openPicker->FileTypeFilter->Append(".xml"); 

task<StorageFile^>(
    openPicker->PickSingleFileAsync()).then([this](StorageFile^ file) { 
    if (nullptr != file) { 
     task<Streams::IRandomAccessStream^>(file->OpenAsync(FileAccessMode::Read)).then([this](Streams::IRandomAccessStream^ stream) 
     { 
      IInputStream^ deInputStream = stream->GetInputStreamAt(0); 
      DataReader^ reader = ref new DataReader(deInputStream); 
      reader->LoadAsync(stream->Size); 
      String^ strXml = reader->ReadString(stream->Size); 
     }); 
    } 
}); 

我现在正在尝试将此代码重新构建到加载我的xml文件而不让用户选择的代码中。我尝试以下方法:

String^ xmlFile = "Assets\MyXmlFile.xml"; 
StorageFolder^ InstallationFolder = Windows::ApplicationModel::Package::Current->InstalledLocation; 
task<StorageFile^>(
InstallationFolder->GetFileAsync(xmlFile)).then([this](StorageFile^ file) { 
    if (nullptr != file) { 
     task<Streams::IRandomAccessStream^>(file->OpenAsync(FileAccessMode::Read)).then([this](Streams::IRandomAccessStream^ stream) 
     { 
      IInputStream^ deInputStream = stream->GetInputStreamAt(0); 
      DataReader^ reader = ref new DataReader(deInputStream); 
      reader->LoadAsync(stream->Size); 
      String^ strXml = reader->ReadString(stream->Size); 
      stream->FlushAsync(); 

     }); 
    } 
}); 

我觉得我得到的GetFileAsync对此我没有能够解决的错误,我问你,社区,试图帮助我。

回答

1

您的代码为我工作的一个修改:在xmlFile字符串包含需要转义反斜线:

String^ xmlFile = "Assets\\MyXmlFile.xml"; 

还要注意的是,如果你只是在你的项目中右键单击“资产”,并选择“添加新项目“,该项目可能已经结束在您的根项目文件夹中(这是默认项目)。如果您希望将其部署到资产子文件夹,它将需要在资产子目录中的磁盘上物理存在,而不仅仅位于资产过滤器中。 (与C#不同,C++项目的“文件夹”实际上是过滤器,并不反映物理目录位置。)

+0

谢谢你的工作。它加载数据,但是当我多次启动该方法时,出现错误。它表示如下:**操作尝试访问超出有效范围的数据**在位置触发:'String^strXml = reader-> ReadString(stream-> Size);' – Napokue