更强大的WriteFile

时间:2014-09-22 08:13:43

标签: c++ winapi file-io nas

我们的问题: 我们正在捕获视频并将数据写入FileSystem,通常是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 个答案:

没有答案