PRB: ERROR_SHARING_VIOLATION появляется сообщение об ошибке Сбой функции CreateFile

Переводы статьи Переводы статьи
Код статьи: 316609 - Vizualiza?i produsele pentru care se aplic? acest articol.
Развернуть все | Свернуть все

Проблема

При открытии файла с FILE_SHARE_READ флаг и флаг FILE_SHARE_WRITE Функция CreateFile функция может завершиться ошибкой и возвращает следующее сообщение об ошибке:
ERROR_SHARING_VIOLATION (код ошибки 32)

Статус

Данное поведение является особенностью.

Дополнительная информация

При открытии файла с помощью Функция CreateFile функция или любую функцию, которая использует Функция CreateFile на внутреннем уровне может возникнуть непредвиденный сбой из-за нарушения совместного доступа. Даже в том случае, если файл предназначен только для определенных приложений, существуют другие процессы, которые могут попытаться получить доступ к файлу в то же время. Существуют общие компоненты системы, а также других разработчиков, которые вызывают проблему. Существуют общие компоненты системы, а также программы сторонних разработчиков (такие как антивирусное программное обеспечение), вызывающие проблему.

Операционная система Microsoft Windows является с вытеснением, многопроцессорной системы, которая обеспечивает внешний вид многих приложений, работающих одновременно. Любого приложения должны знать «», не только процессов, выполняющихся в системе, и что он претендовать ресурсы с другими процессами. Необходимо разрешить проблемы, которые могут возникнуть из-за обработки ресурсов. Из файлов любому запущенному процессу, имеет право использовать ресурс. Всегда есть системных компонентов и сервисов сторонних производителей, которые одновременно конкурировать за ресурсы. Когда приложение пытается получить доступ к файлам на компьютере, который приложение конкурирующее с другими процессами.

Существует два распространенных причин ERROR_SHARING_VIOLATION:
  • Существует несколько приложений, использующих определенный файл на диске (общие файлы общих данных). Приложение в данный момент обращается к файлу таким образом, который несовместим с тем, как второе приложение пытается получить доступ к тому же файлу. Например может потребоваться обновить файл, но другим процессом в данный момент записи в файл, а только общий доступ к файлу для чтения (FILE_SHARE_READ).
  • Файл является файлом данных, зависят от конкретного приложения и не ожидается в файл открыт другим приложением. В этом случае другие процессы могут заблокировать файл короткое время по другим причинам.
Чаще всего проблема возникает, когда программы, такие как антивирусные программы, программное обеспечение резервного копирования или оптимизатор диск, который блокирует файл на диске в течение короткого времени. Когда приложение пытается открыть файл, даже в случае полного включен общий доступ, попытка завершается ошибкой нарушение общего доступа. Этот результат можно ожидать, поскольку служба должна получить монопольный доступ на время выполнения операции над файлом. Чтобы устранить эту проблему, попробуйте еще раз за короткий промежуток времени позже. Часто служба завершается с файлом в течение нескольких миллисекунд.

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

Следующий пример кода демонстрирует этот прием:
#define MAXRETRIES  5
#define RETRYDELAY  250

HANDLE  hFile     = INVALID_HANDLE_VALUE
DWORD   dwRetries = 0;
BOOL    bSuccess  = FALSE;
DWORD   dwErr     = 0;

do
{
    hFile = CreateFile( szFile,
                        GENERIC_READ,
                        FILE_SHARE_READ | FILE_SHARE_WRITE,
                        NULL,
                        OPEN_EXISTING,
                        FILE_ATTRIBUTE_NORMAL,
                        NULL);
    if ( INVALID_HANDLE_VALUE == hFile )
    {
        dwErr = GetLastError();

        if ( ERROR_SHARING_VIOLATION == dwErr )
        {
            dwRetries += 1;
            Sleep(RETRYDELAY);
            continue;
        }
        else
        {
            // An error occurred.
            break;
        }
    }

    bSuccess = TRUE;
    break;
} while ( dwRetries < MAXRETRIES );

if  ( bSuccess )
{
    // You succeeded in opening the file.
}
else
{
    // Failure occurs. Do graceful error handling.

    // Here, you must notify the user of the failure.

MessageBox( NULL,
            "Tried to update data file but it was already in use",
            "Update error...",
            MB_OK | MB_ICONSTOP );

    // You also want to put the software back in the state it was in
    // on entrance of the current function, as if the user had never
    // tried to do the update.

    // This may also require deallocating any resources that were
    // allocated because of this operation.
}
				
Этот метод для Аккуратная обработка общую ошибку нарушения дает приложения, файл открыт времени выполнения. Каждый раз при получении ошибка Нарушение общего доступа, необходимо разрешить для приложения Sleep некоторое время и повторите попытку. Если антивирусная программа или служба системы откройте файл, вирусов или системная служба может закончить после одного или двух попыток. Убедитесь, что ограничивать повторов, чтобы избежать бесконечного цикла. Если другое приложение в данный момент открыт (и может оставить открытым файл в течение длительного времени), информирования пользователя путем разрыва цикла и корректно завершить работу.

Свойства

Код статьи: 316609 - Последний отзыв: 7 июня 2011 г. - Revision: 4.0
Информация в данной статье относится к следующим продуктам.
  • Microsoft Win32 Application Programming Interface
Ключевые слова: 
kbfileio kbkernbase kbprb kbmt KB316609 KbMtru
Переведено с помощью машинного перевода
ВНИМАНИЕ! Перевод данной статьи был выполнен не человеком, а с помощью программы машинного перевода, разработанной корпорацией Майкрософт. Корпорация Майкрософт предлагает вам статьи, переведенные как людьми, так и средствами машинного перевода, чтобы у вас была возможность ознакомиться со статьями базы знаний KB на родном языке. Однако машинный перевод не всегда идеален. Он может содержать смысловые, синтаксические и грамматические ошибки, подобно тому как иностранец делает ошибки, пытаясь говорить на вашем языке. Корпорация Майкрософт не несет ответственности за неточности, ошибки и возможный ущерб, причиненный в результате неправильного перевода или его использования. Корпорация Майкрософт также часто обновляет средства машинного перевода.
Эта статья на английском языке:316609
Заявление об отказе относительно содержимого статьи о продуктах, поддержка которых прекращена
Эта статья содержит сведения о продуктах, поддержка которых корпорацией Майкрософт прекращена. Поэтому она предлагается как есть и обновляться не будет.

Отправить отзыв

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com