Почему TextReader жалуется, когда файл открывается другим процессом?

1

См. Пример простого примера устройства ниже

[Test]
public void TextReaderRequiresWriteAccessToFile()
{
    using (var reader = File.OpenText(Path.Combine(Folder, "Texts.txt")))
    {
    }
}

Этот тест терпит неудачу, когда я открываю текстовый файл в редакторе. Я ожидаю, что файл будет открыт с привилегиями чтения с помощью File.OpenText.

System.IO.IOException: процесс не может получить доступ к файлу "C:\* местоположение в папку *\Texts.txt", потому что он используется другим процессом.

Есть ли причина, почему.NET требует дополнительных привилегий для открытия файла для чтения через этот API?

Теги:
file
file-io

2 ответа

4
Лучший ответ

О, но это требует только привилегий чтения.

Проблема в том, что редактор предотвращает даже доступ на чтение (в.NET, который будет FileShare.None - по умолчанию для доступа на запись). Если вы открыли файл с использованием OpenText в обоих случаях, а не с помощью редактора, все будет работать нормально. Поэтому вам, вероятно, нужен редактор, который не блокирует файл (например, Visual Studio).

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

  • 0
    Аааа, это все объясняет. Я полностью смотрел в неправильном направлении! Спасибо за ответ! (Поскольку фактический код выполняется во время сборки и генерирует непонятные ошибки, я просто скопирую файл в другое место). Еще раз спасибо!
  • 0
    Хм, просто интересно. «Другое» приложение в этом случае - Excel. Почему мой тест сообщает о том, что файл используется другим процессом, а я могу просто открыть файл в Excel, а затем открыть файл в блокноте? Если блокнот сможет открыть файл, тогда я смогу открыть файл в моей программе, верно?
Показать ещё 3 комментария
2

Когда ваш файл открыт в текстовом редакторе, у него есть дескриптор, открытый для него. Это означает, что вам нужно явно открыть файл с помощью FileShare.Read. Таким образом, вы получите доступ на чтение, пока файл уже открыт в режиме чтения/записи в другом месте.

using (var reader = File.OpenText(Path.Combine(Folder, "Texts.txt"), FileMode.Open, FileAccess.Read, FileShare.Read))
{
}
  • 0
    Хм, что я понимаю из Luaan, так это то, что «другой редактор» должен был открыть файл с помощью FileShare.Read. Поскольку это не так, я ничего не могу сделать. В любом случае, я попробовал ваше предложение, но, похоже, оно провалилось за тем же исключением.
  • 1
    Верный. В этом случае вы можете только надеяться, что «другой редактор» не открывает файл исключительно. Тем не менее, вы можете попробовать FileShare.ReadWrite

Ещё вопросы

Сообщество Overcoder
Наверх
Меню