我正在尝试在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
}
}
答案 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。解决方案是自己实现缺失的部分。