Проверьте, доступен ли файл Excel, прежде чем открывать или запускать его. - PullRequest
3 голосов
/ 09 июня 2009

Хорошо, вот в чем проблема, я использую соединение с использованием (соединение .... бла-бла), а затем, когда мой блок использования закончен, я хочу запустить приложение Excel следующим образом: System.Diagnostics.Process.Start ( excelFile);

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

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

Это не вызывает исключение, поэтому перехват исключения не возможен

я пробовал:

connection.Close();
connection.Dispose();
GC.Collect();

из которых никто не работал.

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

Хорошо, я попробовал это:

Microsoft.Office.Interop.Excel.Application _app =
                          new Microsoft.Office.Interop.Excel.Application();

        try
        {
            Workbook wbook = _app.Workbooks.Open(excelFile,
            Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
            Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
            Type.Missing, Type.Missing, Type.Missing, Type.Missing);
        }
        catch (COMException ex)
        {
            //The file can't be opened in Excel
        }
        finally
        {
            //close the workbook and release the resources (GC.Collect() et al as usual)
            _app.Workbooks.Close();
            GC.Collect();

        }
        System.Diagnostics.Process.Start(excelFile);

и я проходит, перехватывает исключение и затем переходит к команде запуска, где excel сообщает мне, что «не может получить доступ к« fileName »»

Ответы [ 5 ]

4 голосов
/ 17 июня 2009

Попробуйте эту функцию, чтобы проверить, открыт ли файл:

public bool IsFileOpen(string path)
{
    FileStream fs = null;
    try
    {
        fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.None);
        return false;
    }
    catch(IOException ex)
    {
        return true;
    }
    finally
    {
        if (fs != null)
            fs.Close();
    }
}
0 голосов
/ 17 июня 2009

Вы можете использовать класс FileSystemWatcher для подписки на события файловой системы, включая изменение файла.

Когда событие Changed сработало, я полагаю, открыть файл безопасно. Тем не менее, дополнительная проверка того, был ли файл снова заблокирован каким-либо другим процессом, все же стоит сделать.

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

Чтобы проверить, действительно ли файл открыт в Excel, можно использовать Первичные сборки взаимодействия :

Microsoft.Office.Interop.Excel.Application _app = 
                              new Microsoft.Office.Interop.Excel.Application();

try {
    Workbook wbook = _app.Workbooks.Open(excelFile,
    Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
    Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
    Type.Missing, Type.Missing, Type.Missing, Type.Missing);
} catch (COMException ex) {
    //The file can't be opened in Excel
} finally {
    //close the workbook and release the resources (GC.Collect() et al as usual)
}

//The file can be opened in Excel if there wasn't a caught exception.
//You can wrap the above in a loop to test more than once as per the other answer

Но в любом случае, все же лучше найти хороший способ синхронизировать ваше письмо с вашим чтением. Может быть, если вы поделитесь кодом с частью написания, вы можете получить лучшие предложения.

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

Решение 1: Вы можете просто попробовать

File.Move(sourceFilename, destinationFilename) 

для файла, который вы хотите открыть. Если исключений нет, просто переместите файл обратно в исходный источник.

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

Решение 2:

    FileStream stream = File.OpenWrite("yourfilename");
    stream.Close();

Это должно только проверить, доступен ли файл для записи.

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

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

Полагаю, что когда вы пишете в файл, вы можете довольно легко получить его размер. Вы пытались сравнить два?

while (fileSize != new FileInfo(excelFile).Length) {
    Thread.Sleep(1000);
}
System.Diagnostics.Process.Start(excelFile);

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...