如何将文件从本地存储传递到Windows Phone 8.1中的库?

时间:2014-08-20 13:05:47

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

我正在尝试在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
        }
    }

2 个答案:

答案 0 :(得分:4)

修改

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

原始答案

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

简短版本:

您正在混合System.IO(库)和Windows.Storage(选择器),这只能导致Bad Things。您从选择器返回的文件是通过Windows.Storage的代理文件。该库期望您具有进程内访问权限的文件,而不是代理文件。

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

长篇故事

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

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

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

答案 1 :(得分:2)

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

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

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

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