CreateFile завершается с ошибкой ERROR_SHARING_VIOLATION - PullRequest
4 голосов
/ 14 декабря 2010

Я использую API-интерфейс CreateFile, и иногда он случайно завершается с ошибкой: ERROR_SHARING_VIOLATION.

Я погуглил, и в этой ошибке почти ничего нет.Странно то, что в следующий раз он будет счастлив открыть тот же файл.

Вот мой код:

void FileHandle::open(const char* fileName, FILE_MODE mode)
{
    if (m_bIsOpen)
        close();

    HANDLE fh = NULL;

    DWORD dwDesiredAccess  = GENERIC_READ;
    DWORD dwShareMode = FILE_SHARE_READ;
    DWORD dwCreationDisposition = OPEN_EXISTING;

    switch (mode)
    {
    case FILE_READ:
        break;

    case FILE_WRITE:
        dwDesiredAccess  = GENERIC_WRITE;
        dwShareMode = 0;
        dwCreationDisposition = CREATE_ALWAYS;
        break;

    case FILE_APPEND:
        dwDesiredAccess  = GENERIC_WRITE;
        dwShareMode = 0;
        dwCreationDisposition = OPEN_ALWAYS;
        break;

    default:
        throw gcException(ERR_INVALID, "The mode was invalid");
        break;
    }

    fh = CreateFile(fileName, dwDesiredAccess, dwShareMode, NULL, dwCreationDisposition, 0, NULL);

    if (!fh || fh == INVALID_HANDLE_VALUE)
        throw gcException(ERR_INVALIDFILE, GetLastError(), gcString("Failed to open the file {0}", fileName));

    m_hFileHandle = fh;
    m_bIsOpen = true;

    if (mode == FILE_APPEND)
    {
        DWORD high = 0;
        DWORD low = GetFileSize(fh, &high);

        uint64 pos = (((uint64)high)<<32) + (uint64)low;
        seek(pos);
    }
}

Я делаю что-то не так или есть проблема с API?

Редактировать: я использую полное имя файла (например, C: \ somefile.txt) и mode = FILE_WRITE

Ответы [ 4 ]

7 голосов
/ 14 декабря 2010

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

При появлении ошибки вы можете использовать Process Explorer чтобы определить, в каких процессах файл открыт.

1 голос
/ 14 декабря 2010

Я имею в виду неуважение, но на прошлой неделе я просто выстрелил себе в ногу по чему-то похожему:

Вы уверены, , что ничто иное не открывает файл таким образом, чтобы это незапрашиваемый доступ?

В моем случае я использовал ctrl-Z в командном окне Linux, чтобы приостановить программу, которая создала сокет-соединение, и лег спать.На следующее утро, после нескольких простых изменений, я продолжал получать сообщения «невозможно создать сокет: служба используется» при запуске программы.К сожалению, я часами отлаживал то, что сломал.Как только я убил оскорбительный приостановленный процесс, он работал нормально.

1 голос
/ 14 декабря 2010

Есть ли на машине антивирус? Иногда операции AV и (или другое программное обеспечение, которое контролирует файлы) операций и времени могут вызвать конфликты совместного использования.

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

0 голосов
/ 22 апреля 2015

Microsoft говорит здесь , что это может произойти, и приложение должно повторить попытку.Ужасно, но вы идете.

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