コード例 #1
0
EQFileSystemError QFileStream::Open(const QPath &filePath, const EQFileOpenMode &eOpenMode)
{
    QE_ASSERT_ERROR(m_bIsOpen != true, "The file stream is already open.");

    EQFileSystemError eErrorInfo = EQFileSystemError::E_Unknown;
    const bool FILE_EXISTS = SQFile::Exists(filePath, eErrorInfo);

    if((FILE_EXISTS && (eOpenMode == EQFileOpenMode::E_Append || eOpenMode == EQFileOpenMode::E_Open)) ||
       (!FILE_EXISTS && eOpenMode == EQFileOpenMode::E_Create)                                         ||
       eOpenMode == EQFileOpenMode::E_CreateOrOverwrite                                                || 
       eOpenMode == EQFileOpenMode::E_OpenOrCreate)
    {
        if(FILE_EXISTS)
        {
            QFileInfo fileInfo = SQFile::GetFileInfo(filePath, eErrorInfo);
            m_uFileSize = scast_q(fileInfo.GetSize(), pointer_uint_q);
            m_bWritingIsAllowed = !fileInfo.IsReadOnly();
            
            QE_ASSERT_ERROR(!(fileInfo.IsReadOnly() && eOpenMode == EQFileOpenMode::E_CreateOrOverwrite), string_q("The current user does not have permissions to overwrite the file \"") + filePath.GetAbsolutePath() + "\".");
        }
        else
        {
            m_uFileSize = 0;
            m_bWritingIsAllowed = true;
        }

        m_path = filePath;

        bool bOperationSuccessful = QFileStream::_OpenPlatformImplementation(m_path, eOpenMode, m_bWritingIsAllowed, m_nativeHandle, eErrorInfo);
        
        if(bOperationSuccessful)
        {
            m_bIsOpen = true;
            eErrorInfo = EQFileSystemError::E_Success;

            if(eOpenMode == EQFileOpenMode::E_Append)
                this->SetPosition(m_uFileSize);
            else
                this->SetPosition(0);

            QE_ASSERT_WARNING(m_uFileSize <= pointer_uint_q(-1), "The the file is too large, this class cannot access file offsets over 2^32 - 1 when it is compiled for x86 architecture.");

            if(m_uFileSize > pointer_uint_q(-1))
            {
                eErrorInfo = EQFileSystemError::E_FileIsTooLarge;
            }
        }
    }
    else if(FILE_EXISTS && eOpenMode == EQFileOpenMode::E_Create)
    {
        eErrorInfo = EQFileSystemError::E_AlreadyExists;
    }
    else
    {
        eErrorInfo = EQFileSystemError::E_DoesNotExist;
    }

    return eErrorInfo;
}