【问题标题】:How to pass a file from local storage to a library in Windows Phone 8.1?如何将文件从本地存储传递到 Windows Phone 8.1 中的库?
【发布时间】:2014-08-20 13:05:46
【问题描述】:

我正在尝试在 Windows Phone 8.1 的 C# 中使用这个库。

http://epubreader.codeplex.com/

根据初始化行中的文档,我们必须传递文件的路径。

Epub epub = new Epub(@"c:\example.epub");

我使用文件选择器选择文件,并通过了

file.path

作为参数。但在运行时会引发 System.IO.FileNotFoundException

如何将路径传递给库?

编辑

文件选择器代码 -

    private void file_clicked(object sender, RoutedEventArgs e)
    {
        FileOpenPicker openPicker = new FileOpenPicker();
        openPicker.ViewMode = PickerViewMode.Thumbnail;
        openPicker.SuggestedStartLocation = PickerLocationId.Desktop;
        openPicker.FileTypeFilter.Add(".epub");

        openPicker.PickSingleFileAndContinue();
    }

编辑 将文件复制到应用本地文件夹

    public async void ContinueFileOpenPicker(FileOpenPickerContinuationEventArgs args)
    {
        if (args.Files.Count > 0)
        {
            var file = args.Files[0];

            Windows.Storage.StorageFolder localFolder = Windows.Storage.ApplicationData.Current.LocalFolder;

            StorageFile sampleFile;
            await file.CopyAsync(localFolder, file.Name, NameCollisionOption.ReplaceExisting);
            sampleFile = await localFolder.GetFileAsync(file.Name);

            Epub epub = new Epub(sampleFile.Path);    //exception occurs in this line
        }
    }

【问题讨论】:

标签: c# windows-phone-8 windows-runtime windows-phone-8.1


【解决方案1】:

编辑

根据 cmets 和 dBlisse 的回答中的讨论,问题是 WP 8.1 项目不支持该库。

原答案

我将保留原始答案,因为它解释了为什么该库在 WP 8.1 中不起作用。

短版:

您正在混合 System.IO(库)和 Windows.Storage(选择器),这只会导致不好的事情。您从选择器返回的文件是通过 Windows.Storage 的代理文件。该库需要一个您可以在进程中访问的文件,而不是代理文件。

The workaround is to copy the file to your apps local store usingStorageFile.CopyAsync()。将新文件的路径传递给库。

长篇大论

作为 Windows Phone 8.1 中沙盒进程的一部分,应用程序在本地应用容器之外没有读/写功能的进程中运行。可防止应用对系统进行任何恶意操作。

为了使应用能够访问应用容器之外的位置,有一个名为 runtimebroker.exe 的系统进程。它接受访问系统其他部分的请求(通过 KnownFolders、FilePicker 等)并满足请求。它检查以确保应用程序应该有权访问该位置,然后使用其权限打开一个句柄,并为应用程序提供一个 StorageFile 对象,该对象表示对文件的权限但不授予应用程序访问权限,仍然必须通过经纪人

因此,该应用永远不会拥有该位置的权限,但仍可以使用 runtimebroker 作为代理访问该位置的信息。这样做的一个副作用是,当应用程序尝试获取通过文件选择器检索到的文件的句柄(库正在尝试这样做)时,它会失败。

【讨论】:

  • 我已经尝试将文件复制到应用程序的本地文件夹,但仍然出现相同的异常。我已经编辑了答案以向您展示代码。
  • 这是 Silverlight 8.1 项目还是通用应用程序?
  • 你也可以进入代码并确保抛出异常: if (File.Exists(ePubPath)) _EpubFile = ZipFile.Read(ePubPath);谢谢。
  • 是的,我认为异常正在 File.Exists 行上引发。在将文件传递给 epub 之前,我尝试在文件上使用 File.Exists,但在 c# for wp 8.1 中不支持它。你能告诉我如何解决这个问题吗?
【解决方案2】:

您不能只是从 EpubReader 复制并粘贴二进制文件。

问题出在 DotNetZip 中,EpubReader 使用它来加载文档。 DotNetZip 在 WPF 上运行并通过正常的 Windows 操作系统文件路径访问文件。您正在尝试传递 Windows Phone 8.1 文件路径,它不知道如何解释,因为它是为不同的系统编译的。

您需要将 EpubReader codeplex 源代码中的 DotNetZip 依赖项手动替换为 WP8.1 兼容版本的 DotNetZip。这不存在,因此您需要在 EpubReader 项目中重新实现 DotNetZip 的所有现有功能,然后才能使用它。

Windows Phone 8.1 不支持 EpubReader 和 DotNetZip。解决方案是自己实现缺失的部分。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多