文件共享.读写系统,io,包装



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

但似乎包不能打开一个文件与读访问提供filesshare . readwrite。下面是代码:

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

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

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

附加信息:Only FileShare。读取和文件共享。

有什么可以让它工作吗?我需要将FileShare设置为读写

编辑:我正试图在我的代码与docx文件的工作。我只是想能够读取文件的内容,而不修改它。同时,我也希望它可以用Word编辑。这就是我想要达到的目标。为此目的,我已经成功地使用了DotNetZip的Ionic.Zip库。但是我在保存文件时遇到了一些错误。所以我不得不回到系统,io,包装。任何帮助都会很感激。

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

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

UPDATE详细说明何时这可能有用。假设您尝试这样做:

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)) {
}

请求文件共享。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
}

最新更新