FileShare.ReadWrite в System.IO.Packaging
Я использую System.IO.Packaging для работы с файлами пакетов.
Но, похоже, Package не может открыть файл с доступом для чтения, предоставляя 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. Любая помощь будет оценена.
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
}