1

我正在使用 System.IO.Packaging 来处理包文件。

但似乎 Package 无法打开具有提供 FileShare.ReadWrite 的读取权限的文件。这是代码:

 myPackage = Package.Open("fileName", FileMode.Open,  FileAccess.Read,  FileShare.ReadWrite);

当我尝试加载文件时,会引发以下异常:

抛出异常:WindowsBase.dll 中的“System.NotSupportedException”

附加信息:仅支持 FileShare.Read 和 FileShare.None。

有什么可以做的吗?我需要将 FileShare 设置为 ReadWrite。

编辑:我正在尝试在我的代码中使用 docx 文件。我只想能够在不修改文件的情况下读取文件的内容。同时,我还希望它可以使用 Word 进行编辑。这就是我想要达到的目标。为此,我成功地使用了 DotNetZip 的 Ionic.Zip 库。但是我在使用它保存文件时遇到了一些错误。所以我不得不回到 System.IO.Packaging。任何帮助,将不胜感激。

4

1 回答 1

1

目前尚不清楚为什么要这样做,但您可以尝试直接在文件流上指定选项,如下所示:

using (var file = new FileStream(@"myfile", FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) {
    var myPackage = Package.Open(file);
}

更新详细说明何时这可能有用。假设您尝试执行以下操作:

using (var fs1 = new FileStream("myfile", FileMode.Append, FileAccess.Write, FileShare.Read))
using (var fs2 = new FileStream("myfile", FileMode.Open, FileAccess.Read, FileShare.Read)) {
}

因此打开第一个文件进行写入,FileShare = Read。然后再次尝试打开文件以进行读取,再次使用 FileShare = Read。这是行不通的,因为如果文件已经被打开写入,任何 FileShare = read 的请求都会失败。要完成这项工作,您必须这样做:

using (var fs1 = new FileStream("myfile", FileMode.Append, FileAccess.Write, FileShare.Read))
using (var fs2 = new FileStream("myfile", FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) {
}

在这里,您请求 FileShare.ReadWrite,它允许您读取 fs1 打开的文件进行写入。

现在,如果同时写入和读取同一个文件是一个好主意,这完全取决于您想要实现的目标以及您是否知道自己在做什么。在大多数情况下,这不是一个好主意,但这又取决于。

更新 2. 完全可以使用上面的代码来实现您的目标(打开 .docx 进行阅读,而 MS Word 将其打开以进行写作:

using (var file = new FileStream(@"my.docx", FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) {
    var myPackage = Package.Open(file);
    // here do what you want with your .docx
}
于 2015-09-10T09:14:18.903 回答