Открыть файл только для чтения - PullRequest
5 голосов
/ 26 октября 2009

В приложении C # WinForms я использую System.IO.Diagnostics.Process.Start (fileName) для открытия файлов. Тип файла может быть .doc, .docx, .xls, .xlsx, .csv, .pdf или .txt.

Есть ли способ заставить эти файлы открываться только для чтения?

Ответы [ 5 ]

11 голосов
/ 26 октября 2009

Вам необходимо установить атрибуты файла для файла перед началом процесса, а затем установить их обратно при открытии.

Пример:

var attributes = File.GetAttributes(path);

File.SetAttributes(filePath, attributes | FileAttributes.ReadOnly);

System.IO.Diagnostics.Process.Start(fileName);

File.SetAttributes(filePath, attributes);

Примечание: это изменит атрибуты файла фактического файла, поэтому имейте это в виду.

8 голосов
/ 26 октября 2009

К сожалению, способ сделать это зависит от типа файла.

Лучшим вариантом является проверка свойства ProcessStartInfo.Verbs на наличие известного глагола для вашего типа файла. Обычно это "OpenAsReadOnly". Затем вы установите этот глагол и начнете процесс с ProcessStartInfo .

Просто поймите - это не работает для каждого типа файла, поскольку программа должна предоставить и обработать соответствующий глагол.

2 голосов
/ 26 октября 2009

Можете ли вы скопировать файл во временную папку, а затем использовать временный файл для запуска программы?

Тогда вы можете отслеживать процесс и после его завершения удалять временный файл?

1 голос
/ 26 октября 2009

Process.Start запускает любую программу, связанную с этим файлом. Вы не можете указать ему открыть файл только для чтения, если только программа не поддерживает аргумент командной строки, указывающий, что он должен открываться только для чтения (или если он поддерживает глагол OpenAsReadOnly).

Вы можете установить атрибуты файла в файле только для чтения, прежде чем открывать его, но я не думаю, что это то, что вам нужно.

0 голосов
/ 26 октября 2009

Зависит от того, имеет ли зарегистрированное приложение переключатель / параметр для поддержки режима только для чтения. Если это так, вы можете передать опцию только для чтения. Для вашего случая я не думаю, что Process.Start может, если нет опции только для чтения.

...