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; }