errorCode для процесса не может получить доступ к файлу 'XYZ', потому что он используется другим процессом

Я использую C # .NET, а не 2008, .net 3.5

Для меня это сложно, но для этого мне нужен образец кода на C #:

  1. Как получить код ошибки IOException «Процесс не может получить доступ к файлу 'XYZ', потому что он используется другим процессом».

Например, в моем выпуске.

Я пытаюсь удалить файл и получаю сообщение «Процесс не может получить доступ к файлу« XYZ », потому что он используется другим процессом». Исключение.

try
{
    File.Delete(infoFichero.Ruta);
}
catch (IOException ex)
{
    // ex.Message == "The process cannot access the file 'XYZ' because it is being used by another process."
}

Но если .NET является испанским, я получаю сообщение «El processso no puede obtener Acceso al Archivo '00000004.PDF' porque está siendo utilizado en otro processso».

System.IO.IOException: El proceso no puede obtener acceso al archivo '00000004.PDF' porque está siendo utilizado en otro proceso.
   en System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
   en System.IO.FileInfo.Delete()

Мне нужен КОД ОШИБКИ для этого исключения. В Trace я видел System.IO .__ Error.WinIOError (Int32 errorCode, String mightFullPath)

Как получить код ошибки IOException «Процесс не может получить доступ к файлу 'XYZ', потому что он используется другим процессом».


person Kiquenet    schedule 15.07.2010    source источник
comment
@John, FAQ не советует опускать приветы и благодарности ... Вежливость ничего не стоит, и вы не можете поверить, что это будет что-то еще, кроме внимательности?   -  person Kieren Johnstone    schedule 16.07.2010
comment
@Kieren: см. «Привет» , "спасибо", слоганы и приветствия из сообщений?.   -  person John Saunders    schedule 16.07.2010
comment
информация о получении идентификатора / имени процесса после выявления ошибки: github.com/dotnet/runtime/issues / 22775 stackoverflow.com/questions/183925/   -  person NiKiZe    schedule 29.08.2020


Ответы (4)


Вы могли заметить, что свойство HResult недоступно. Обходной путь - использовать метод Marshal.GetLastWin32Error () для получения собственного кода ошибки Windows. Нравится:

        catch (IOException ex) {
            int err = System.Runtime.InteropServices.Marshal.GetLastWin32Error();
            if (err == 32) Console.WriteLine("It's locked");
            // etc..
        }

Код ошибки 32 называется ERROR_SHARING_VIOLATION в SDK.

person Hans Passant    schedule 15.07.2010

есть свойство HResult для исключения (IO-) который содержит код ошибки. Согласно этому list код ошибки для вашего исключения должен быть 0x20 (я не попробуйте это хотя). Надеюсь, это поможет.

person andyp    schedule 15.07.2010
comment
Это защищено, поэтому недоступно без отражения? - person Alex Angas; 09.07.2012

(отмечен CW, потому что на самом деле это просто расширенный комментарий)

Зачем нужен код ошибки?

  • Собираетесь ли вы предпринять разные действия на основе одного кода по сравнению с другим кодом?
  • Что вы будете делать, если изменится Windows или .NET, так что вы внезапно получите другой код ошибки для той же проблемы?
  • Что вы хотите сделать, если не можете удалить тот же файл, но по другой причине? На самом деле, возможно, ваша новая проблема даже не вызовет IOException.
person Community    schedule 15.07.2010
comment
Мне нужен код для определения ошибки, и я хотел бы получить имя процесса (оно используется другим процессом). - person Kiquenet; 09.12.2010
comment
У вас не должно быть необходимости идентифицировать ошибку. Что вы собираетесь делать с этой информацией? Кроме того, вы никогда не узнаете, в каком процессе открыт файл. Windows не предоставляет эту информацию. Расскажите, что вам нужно достичь, и, возможно, мы сможем помочь. - person John Saunders; 10.12.2010
comment
Я хочу определить ошибку. Если я не могу удалить файл, потому что его использует другой процесс, я хотел бы, если возможно, получить имя процесса, который использует файл, и предупреждение (или отправить письмо) пользователю моего приложения. Моя служба Windows перемещает, удаляет большой объем файлов, и мне нужен полный контроль над всеми файлами и процессами. - person Kiquenet; 22.12.2010
comment
@alhambra: у вас никогда не будет полного контроля, и вам никогда не скажут, в каком процессе открыт файл. Информации не существует. - person John Saunders; 22.12.2010
comment
Такие инструменты, как Unlocker, могут получить эту информацию (я думаю), но эти инструменты, возможно, используют C ++, программирование более низкого уровня, чем C #. В Windows тоже: Мой компьютер - ›Управление -› Системные инструменты - ›Общие папки -› Открытие файлов. - person Kiquenet; 29.12.2010
comment
@alham: эти инструменты могут работать с файлами на общем ресурсе, потому что есть программное обеспечение, которое должно отслеживать такие файлы. Но в целом такой информации вы не получите. Обратите внимание, что ни один из ответов не посвящен тому, как узнать, какой файл имеется в виду. - person John Saunders; 29.12.2010
comment
Код ошибки нужен, чтобы отличить, например, файл заблокирован от ошибки, когда диск заполнен. И с тех пор, как давно доступна информация о том, какой процесс заблокировал файл, даже не в виде исключения. - person NiKiZe; 14.08.2020
comment
Прочтите, что я пишу, @NiKiZe. Какое действие вы собираетесь предпринять в коде в зависимости от кода ошибки. Если у вас нет фрагмента кода, который просматривает код ошибки и выполняет различные действия, то код ошибки вам не нужен. Если вам нужно, чтобы человек выполнял разные действия, используйте другую строку сообщения. - person John Saunders; 29.08.2020
comment
код обращается к файлу, и это не удается. который ВСЕГДА даст вам IOException в зависимости от причины, по которой у вас будут разные HRESULT те НЕ ИЗМЕНИТСЯ в Windows, так как это из Win32 API. и да, если файл заблокирован, вы можете повторить попытку, если диск заполнен, вы можете предпринять РАЗНЫЕ ДЕЙСТВИЯ, а если диск недоступен (UNC-путь), вы можете сделать что-то еще и так далее. Итак, после внимательного прочтения этого ответа и нескольких комментариев авторов, я утверждаю, что в нем содержится неверная точка зрения. - person NiKiZe; 29.08.2020

Взгляните на свойство HRESULT IOException класс. Это должно вернуть Win32 HRESULT операции (что, я думаю, вы ищете?).

person CodingGorilla    schedule 15.07.2010
comment
Это защищено, поэтому недоступно без отражения? - person Alex Angas; 09.07.2012
comment
@AlexAngas Это недоступно через код, но вы все равно можете проверить его через отладчик. - person CodingGorilla; 16.07.2012