File.Open выдает IOException, но файл никогда не открывается / не показывается - PullRequest
0 голосов
/ 05 апреля 2019

Я делаю простой тест в коде, как показано ниже:

try
{
    File.Open(path);
}
catch (Exception ex)
{
    MessageBox.Show(ex.ToString());
}

path - строка, объявленная выше.Эта подпрограмма вызывается при нажатии кнопки, и при первом вызове она «работает нормально» (в кавычках, поскольку, хотя она и не выдает исключение, файл никогда не открывается / не отображается).При втором нажатии на него выдается следующее исключение:

System.IO.IOException: процесс не может получить доступ к файлу, поскольку он используется другим процессом.

Однако файл фактически никогда не открывается.Я наблюдаю за ним с помощью диспетчера задач, и ни один экземпляр файла не выставляется.

Я пытался использовать using (File.Open(path)) {}, но безуспешно.

Кто-нибудь может мне помочь?Кажется, я совершаю основную ошибку, но не могу ее найти.

ОБНОВЛЕНИЕ

Лассе Вогстер Карлсен дал правильный ответ, указав, что мойошибка была на самом деле о концепции, а не код.Спасибо!

1 Ответ

2 голосов
/ 05 апреля 2019

Я думаю, вы неправильно поняли, что делает File.Open.

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

В конце этой операции вы должны закрыть его, что и является using сделает для вас.

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

Вы хотите вместо него Process.Start.Вы пытаетесь открыть либо другой исполняемый файл, например notepad.exe, либо пытаетесь открыть документ, например readme.txt, поэтому вы не используете результат вызова этого метода и почему выс помощью диспетчера задач найдите его.

Итак, если вы все еще хотите перехватывать исключения, вам следует сделать следующее:

try
{
    Process.Start(path);
}
catch (Exception ex)
{
    MessageBox.Show(ex.ToString());
}
...