Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# System.IO.Packaging中的FileShare.ReadWrite_C#_.net_System.io.packaging - Fatal编程技术网

C# System.IO.Packaging中的FileShare.ReadWrite

C# System.IO.Packaging中的FileShare.ReadWrite,c#,.net,system.io.packaging,C#,.net,System.io.packaging,我正在使用System.IO.Packaging处理包文件 但软件包似乎无法打开提供FileShare.ReadWrite的具有读访问权限的文件。 代码如下: myPackage = Package.Open("fileName", FileMode.Open, FileAccess.Read, FileShare.ReadWrite); 当我尝试加载文件时,会引发以下异常: 引发异常:WindowsBase.dll中的“System.NotSupportedException” 其他信

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

但软件包似乎无法打开提供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。任何帮助都将不胜感激

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

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)) {
}
using (var fs1 = new FileStream("myfile", FileMode.Append, FileAccess.Write, FileShare.Read))
using (var fs2 = new FileStream("myfile", FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) {
}
更新以详细说明何时这可能有用。假设您尝试这样做:

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)) {
}
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=Read。然后,还有一次尝试打开文件进行读取,再次使用FileShare=Read。这将不起作用,因为若文件已经被打开进行写操作,任何FileShare=read的请求都将失败。要实现这一目标,您必须这样做:

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

这个错误很有道理。为什么在读取存档文件时需要写入存档文件?库不允许(支持)这种并发性。可能是这样。但正如我在问题中所说的,我可以使用Ionic.Zip来实现。但它已经知道了对我的其他需求至关重要的问题。你应该寻找明确的承诺,它会起作用。因为我看不到一个归档实例如何阻止另一个实例覆盖其内部文件。它们不是真的l文件有操作系统保护。你认为这样使用安全吗?@HenkHolterman更新了一篇文章,试图回答你的问题。处理流会使myPackage对象无用。这只是一个例子,没有必要处理它。假设在处理它之前,你做了你想做的事情。对不起,我有edited这个问题提供了更多关于我希望实现的目标的信息。