FileShare.ReadWrite 在 System.IO.Packaging

FileShare.ReadWrite in System.IO.Packaging

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

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

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

当我尝试加载文件时,抛出以下异常:

抛出异常:'System.NotSupportedException' in WindowsBase.dll

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

有什么办法可以使它正常工作吗? 我需要将 FileShare 设置为 ReadWrite。

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

不清楚你为什么要这样做,但你可以尝试像这样直接在文件流上指定选项:

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
}