C# доступ к заблокированным файлам
Я хочу получить доступ к файлу через C#, который создается и все еще обрабатывается с помощью другой программы.
В настоящее время я копирую файл через проводник Windows в другое место и работаю с копией. Поскольку копия большая, я бы предпочел работать прямо с оригинальным файлом. Там в любом случае?
Обычный FileStream не разрешает какой-либо режим общего доступа. У меня есть контроль над обеими программами, так что я мог бы также изменить автора при необходимости.
2 ответа
Вам необходимо убедиться, что программа, выполняющая запись и чтение, имеет правильный набор FileShare, поэтому вам нужно передать FileShare.Read в конструктор FileStream для написания программы:
new FileStream("C:/Users/phil/tmp.txt",FileMode.Create,FileAccess.Write,FileShare.Read)
Вы также захотите убедиться, что у вас включена программа FileShare.ReadWrite для программы, которая только читает ее:
new FileStream("C:/Users/phil/tmp.txt",FileMode.Open,FileAccess.Read,FileShare.ReadWrite)
Это приведет к тому, что конструкторы FileStream установят правильные блокировки для самого файла.
Вы можете узнать больше о конструкторе в msdn: http://msdn.microsoft.com/en-us/library/5h0z48dh.aspx (есть и другие перегрузки, которые также принимают параметр FileShare)
Вы можете использовать мою библиотеку для доступа к файлам из нескольких приложений.
Вы можете установить его из nuget: Install-Package Xabe.FileLock
Если вы хотите больше информации об этом, проверьте https://github.com/tomaszzmuda/Xabe.FileLock
ILock fileLock = new FileLock(file);
if(fileLock.Acquire(TimeSpan.FromSeconds(15), true))
{
using(fileLock)
{
// file operations here
}
}
Метод fileLock.Acquire вернет true, только если может заблокировать файл исключительно для этого объекта. Но приложение, которое загружает файл, должно делать это и при блокировке файла. Если объект недоступен, метод возвращает false.
Поэтому, если вы хотите использовать его, вы должны установить этот пакет приложения и файла блокировки, прежде чем вносить в него данные, а затем немедленно снять блокировку.