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
}
Другие вопросы по тегам