我正在使用System.IO.Packaging处理包文件。
但是,包似乎无法打开提供FileShare.ReadWrite的读取访问权限的文件。下面是代码:
myPackage = Package.Open("fileName", FileMode.Open, FileAccess.Read, FileShare.ReadWrite);当我试图加载一个文件时,会引发以下异常:
引发的异常:“System.NotSupportedException”在WindowsBase.dll中
附加信息:只支持FileShare.Read和FileShare.None。
有什么办法可以让这件事起作用吗?我需要FileShare设置为ReadWrite。
编辑:我试图在我的代码中使用docx文件。我只想在不修改文件的情况下读取文件的内容。同时,我也希望它是可编辑的使用Word。这就是我想要达到的目标。为此,我成功地使用了DotNetZip的Ionic.Zip库。但是我在使用它保存文件时遇到了一些错误。所以我不得不回到System.IO.Packaging。任何帮助都将不胜感激。
发布于 2015-09-10 09:14:18
不清楚为什么要这样做,但可以尝试在文件流上直接指定选项,如下所示:
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
}https://stackoverflow.com/questions/32497437
复制相似问题