Json文件的FileStream初始化抛出System.NotSupportedException

时间:2018-03-07 23:35:02

标签: c# uwp youtube-api

我正在关注 Google 提供的Youtube API示例之一,但到目前为止还没有取得多大成功。 此特定API需要授权访问(OAuth 2.0),因此我必须从Google API控制台获取secrets JSON文件,其中包含OAuth2操作所需的信息。

我已将JSON文件导入到我的UWP项目中,但每当我尝试将流设置为它时,我偶然发现 System.NotSupportedException

using (var stream = new FileStream("ms-appx:///client_secrets.json", FileMode.Open, FileAccess.Read))
{
    credential = await GoogleWebAuthorizationBroker.AuthorizeAsync(
        GoogleClientSecrets.Load(stream).Secrets,
        // This OAuth 2.0 access scope allows for full read/write access to 
        // authenticated user's account.
        new[] { YouTubeService.Scope.Youtube },
        "user",
        CancellationToken.None,
        new FileDataStore(this.GetType().ToString())
        );
}

我已将JSON文件的 BuildAction 设置为内容,将复制到输出目录设置为如果更新则复制总是复制,但没有任何成功。

有什么想法吗?

Ps:文件位于包位置的根目录,因此为了简单起见,我使用了ms-appx URI方案。

2 个答案:

答案 0 :(得分:2)

  

我已将Json文件导入我的UWP项目

如果要从项目的根目录获取文件。您可以使用Package.Current.InstalledLocation.GetFileAsync方法获取文件。然后,您可以获得如下文件流:

StorageFile file = await Package.Current.InstalledLocation.GetFileAsync("client_secrets.json");
using (var stream = await file.OpenStreamForReadAsync())
{
    //TODO:
}

请注意,如果将此json文件放在项目目录中,则此文件是只读的。如果要读取和写入,可以将其复制到Application Data存储。例如:LocalFolder

答案 1 :(得分:2)

您遇到异常的原因是您在经典ms-appx:/// API中使用了特定于UWP的URI System.IO.FileStream,而该API无法理解。

您有两种方法可以访问该文件:

System.IO

使用经典的System.IO类型,您需要使用实际的文件系统路径来访问该文件:

var filePath = Path.Combine(
         Package.Current.InstalledLocation.Path,
         "client_secrets.json");
using (var stream = new FileStream(
      filePath, 
      FileMode.Open, FileAccess.Read))
{
   ...
}

StorageFile

您可以使用特定于UWP的StorageFile API并支持ms-appx:///。您可以使用StorageFile.GetFileFromApplicationUriAsync方法或{@ 1}} InstalledLocation访问该文件,如@XavierXie所示。

StorageFolder API的优势在于它是异步(非阻塞)和推荐的UWP,而StorageFile更通用,实际上更高效。