Принятый ответ неверен.Если файл действительно заблокирован, вы не можете просто изменить общий доступ к файлам.Это будет работать, если блокировка была установлена с этой опцией файлового обмена, но это не означает, что это так.Фактически, вы можете довольно легко протестировать решение @CaffGeek, открыв файл без FileShare.ReadWrite и затем попытавшись открыть его с этим флагом в ReadWrite.Вы получите, что файл используется другим процессом.
Код:
string content;
var filePath = "e:\\test.txt";
//Lock Exclusively the file
var r = File.Open(filePath, FileMode.Open, FileAccess.Write, FileShare.Write);
//CaffGeek solution
using (FileStream fileStream = new FileStream(
filePath,
FileMode.Open,
FileAccess.Read,
FileShare.ReadWrite))
{
using (StreamReader streamReader = new StreamReader(fileStream))
{
content = streamReader.ReadToEnd();
}
}
Как видите, он вылетает.Этот результат одинаков с любым методом FileStream, таким как File.Open.Это приведет к сбою того, что вы положили для FileShare во время открытой стадии.
//OPEN FOR WRITE with exclusive
var r = File.Open(filePath, FileMode.Open, FileAccess.Write, FileShare.Write);
//OPEN FOR READ with file share that allow read and write
var x = File.Open(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); //Crash
Копирование файла также не вариант.Вы можете попробовать самостоятельно, открыв файл исключительно и попытаться скопировать файл в проводнике Windows или по коду:
var filePath = "e:\\test.txt";
var filePathCopy = "e:\\test.txt.bck";
//Lock the file
var r = File.Open(filePath, FileMode.Open, FileAccess.Write, FileShare.Write);
File.Copy(filePath, filePathCopy);
var x = File.Open(filePathCopy, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
using (var reader = new StreamReader(x))
{
content = reader.ReadToEnd();
}
r.Close();
File.Delete(filePathCopy);
Этот код вылетает при нажатии строки File.Copy.Исключение такое же, как и раньше: файл используется другим процессом.
Вам нужно убить процесс, который заблокировал файл, если вы хотите прочитать его, ИЛИ, если у вас есть исходный кодфайл, который блокирует файл, чтобы изменить его на использование FileShare.ReadWrite вместо FileShare.Write.