Более надежный WriteFile

Наша проблема:
Мы записываем видео и записываем данные в файловую систему, обычно это устройство NAS. Таким образом, у нас есть последовательные данные для записи, и этот код будет записывать в несколько файлов на одном NAS — в течение 99% времени он работает, однако иногда эта функция просто зависает.

У меня есть эта функция, которая записывает данные в файл.

STDMETHODIMP FileWriter::Receive(LONG lStreamId, IStreamPacket* pPacket)
{
CMutexAutoLock lock(&m_csAccessControl);

HRESULT hr = S_OK;
// AddRef the packet to prevent loss
pPacket->AddRef();

if (m_hFile != INVALID_HANDLE_VALUE && pPacket) {
DWORD written = 0;
BYTE* pData = NULL;
LONG lLen = 0;
pPacket->get_Pointer(&pData);
pPacket->get_ActualDataLength(&lLen);
if (pData && lLen) {
WriteFile(m_hFile, pData, lLen, &written, NULL);
m_llPosition += written;
if (m_llPosition > m_llLength) {
m_llLength = m_llPosition;
}
}
m_xiPosition = (LONG)m_llPosition;
m_xiLength = (LONG)m_llLength;
m_xiLengthInMB = (LONG)(m_llLength/1024/1024);
}

// Release packet
pPacket->Release();

return hr;
}

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

Я прочитал в Интернете, что функция WriteFile () Можно заморозить приложение, и это происходит с нами, когда целевой файловой системой является NAS, но только очень редко. При записи на локальный жесткий диск это никогда не является проблемой. К сожалению, нам требуется очень надежное решение, которое мы можем записать на NAS без проблем.

Как я могу изменить этот код так, чтобы функция WriteFile () всегда выполнялась? Я читал об использовании Overlapped IO, но я не уверен, как бы я поступил об этом, и если это подходит.

0

Решение

Задача ещё не решена.

Другие решения


По вопросам рекламы [email protected]