Подтвердить что ты не робот

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

У меня есть приложение winforms, которое загружает файлы excel для анализа. В настоящее время для того, чтобы открыть файл excel, файл не должен быть открыт в excel, иначе при загрузке файла в файл будет вызываться FileIOException.

То, что я хотел бы сделать, - это разрешить моему приложению читать в файле, даже если он открыт в excel, а не принуждать пользователя сначала закрыть лист. Обратите внимание, что рассматриваемому приложению нужно только прочитать файл, а не писать ему.

Возможно ли это?

4b9b3361

Ответ 1

Вы можете попробовать передать FileShare.ReadWrite при открытии файла:

using (var stream = new FileStream(
       @"d:\myfile.xls", 
       FileMode.Open, 
       FileAccess.Read, 
       FileShare.ReadWrite))
{

}

Ответ 2

Как вы пытаетесь открыть файл?

Если вы пытаетесь открыть его для чтения/записи, вы получите исключение. Если вы пытаетесь открыть его только для чтения, тогда вы должны быть в порядке.

var file = File.Open("file.xls", FileMode.Open, FileAccess.Read, FileShare.ReadWrite);

Это будет работать, только если Excel открыл файл с помощью FileShare.Read, чтобы разрешить другим приложениям (то есть вашим) доступ к файлу. Если это не задано, Excel откроет файл с эксклюзивным доступом. Примечание. Я не думаю, что это так, поскольку вы можете открыть файл Excel (в Excel) для чтения, если кто-то еще открыл его для редактирования.

UPDATE - ОК. Я не проверял это правильно, пока не получил комментарии от darin. Вам нужен флаг FileShare.ReadWrite, несмотря на помощь, указывающую, что это для последующих открывателей файлов. Даже FileShare.Read достаточно хорош, и я нахожу еще более странным.

Ответ 3

SpreadsheetGear для .NET может читать книги, в то время как Excel их открывает. Вот код, который мы используем для этого (обратите внимание, что мы заблокируем весь файл после открытия, чтобы сохранить Excel или любое другое приложение от записи, пока мы находимся в середине чтения):

stream = new System.IO.FileStream(path,
    System.IO.FileMode.Open,
    System.IO.FileAccess.Read,
    System.IO.FileShare.ReadWrite,
    SG.CompoundDocumentIO.Storage.OpenBufferLength);
try
{
    stream.Lock(0, stream.Length);
}
catch
{
    // .NET 1.1 requires cast to IDisposable
    ((IDisposable)stream).Dispose();
    throw;
}

Отказ от ответственности: у меня есть SpreadsheetGear LLC

Ответ 4

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