Как открыть файл, который открывается в другом приложении - PullRequest
22 голосов
/ 26 июня 2009

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

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

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

Ответы [ 4 ]

29 голосов
/ 26 июня 2009

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

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

}
6 голосов
/ 26 июня 2009

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

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

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

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

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

1 голос
/ 26 июня 2009

SpreadsheetGear for .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

0 голосов
/ 26 июня 2009

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

...