Как говорит Джаред, вы не можете сделать это, если другой объект, у которого открыт файл, не разрешит совместное чтение. Excel разрешает совместное чтение даже для файлов, открытых для записи. Поэтому вы должны открыть файловый поток с параметром FileShare.ReadWrite .
Параметр FileShare часто неправильно понимают. Это указывает на то, что могут другие средства открытия файла. Это относится как к прошлым, так и к будущим новичкам. Думайте о FileShare не как о ретроактивном запрете на ранее открытые программы (например, в Excel), а как об ограничении, которое нельзя нарушать при текущем Открытии или любых будущих Открытиях.
В случае текущей попытки открыть файл, FileShare.Read говорит: «Откройте этот файл для меня успешно, только если он был открыт любыми предыдущими программами только для чтения». Если вы укажете FileShare.Read в файле, который открыт для записи в Excel, ваше открытие не будет выполнено, так как это нарушит ограничение, потому что в Excel он открыт для записи .
Поскольку файл Excel открыт для записи, вы должны открыть файл с помощью FileShare.ReadWrite, если хотите, чтобы ваш был открыт для успеха. Еще один способ думать о параметре FileShare: он определяет «доступ к файлу другого пользователя».
Теперь предположим другой сценарий, в котором вы открываете файл, который в данный момент не открывается ни одним другим приложением. FileShare.Read говорит, что «будущие новички могут открыть файл только с правами чтения».
Логически, эта семантика имеет смысл - FileShare.Read означает, что вы не хотите читать файл, если другой парень уже пишет его, и вы не хотите, чтобы другой парень писал файл, если вы уже читая это. FileShare.ReadWrite означает, что вы готовы прочитать файл, даже если другой парень пишет его, и у вас нет проблем, позволяя другому новичку записать файл во время чтения.
Ни в коем случае это не разрешает нескольким авторам. FileShare похож на базу данных IsolationLevel. Ваш желаемый параметр здесь зависит от требуемых гарантий «согласованности».
Пример:
using (Stream s = new FileStream(fullFilePath,
FileMode.Open,
FileAccess.Read,
FileShare.ReadWrite))
{
...
}
или
using (Stream s = System.IO.File.Open(fullFilePath,
FileMode.Open,
FileAccess.Read,
FileShare.ReadWrite))
{
}
Приложение:
Документация на System.IO.FileShare немного невелика. Если вы хотите получить прямые факты, перейдите к документации для функции Win32 CreateFile , которая лучше объясняет концепцию FileShare.