/**************************************************************************** Desc: Removes a 64-bit file ****************************************************************************/ RCODE F_MultiFileHdl::deleteMultiFile( const char * pszPath) { RCODE rc = NE_FLM_OK; IF_DirHdl * pDir = NULL; char szTmpPath[ F_PATH_MAX_SIZE]; IF_FileSystem * pFileSystem = f_getFileSysPtr(); // Can't use this handle to delete something if we already // have a file open. if( m_bOpen) { // Can't jump to exit, because it calls releaseLockFile return( RC_SET_AND_ASSERT( NE_FLM_FAILURE)); } if( RC_BAD( rc = pFileSystem->doesFileExist( pszPath))) { goto Exit; } if( !pFileSystem->isDir( pszPath)) { // If the path specifies a single file rather than a // 64-bit directory, just go ahead and delete the file. rc = pFileSystem->deleteFile( pszPath); goto Exit; } if( RC_BAD( rc = createLockFile( pszPath))) { goto Exit; } if( RC_OK( pFileSystem->openDir( pszPath, "*.64", &pDir))) { // Remove all data files for( rc = pDir->next(); !RC_BAD( rc) ; rc = pDir->next()) { pDir->currentItemPath( szTmpPath); f_assert( f_strstr( szTmpPath, ".64") != 0); (void)pFileSystem->deleteFile( szTmpPath); } pDir->Release(); pDir = NULL; rc = NE_FLM_OK; } // Release and delete the lock file (void)releaseLockFile( pszPath, TRUE); // Remove the directory (void)pFileSystem->removeDir( pszPath); Exit: (void)releaseLockFile( pszPath, FALSE); return( rc); }
/**************************************************************************** Desc: Opens an existing 64-bit file ****************************************************************************/ RCODE F_MultiFileHdl::openFile( const char * pszPath) { RCODE rc = NE_FLM_OK; IF_FileSystem * pFileSystem = f_getFileSysPtr(); IF_DirHdl * pDir = NULL; FLMUINT uiTmp; FLMUINT uiHighFileNum = 0; FLMUINT64 ui64HighOffset = 0; if( m_bOpen) { rc = RC_SET_AND_ASSERT( NE_FLM_FAILURE); goto Exit; } if( RC_BAD( pFileSystem->doesFileExist( pszPath)) || !pFileSystem->isDir( pszPath)) { rc = RC_SET( NE_FLM_IO_PATH_NOT_FOUND); goto Exit; } f_strcpy( m_szPath, pszPath); // Create the lock file if( RC_BAD( rc = createLockFile( m_szPath))) { goto Exit; } // Need to determine the current EOF if( RC_BAD( rc = pFileSystem->openDir( m_szPath, (char *)"*.64", &pDir))) { goto Exit; } // Find all data files to determine the EOF for( rc = pDir->next(); !RC_BAD( rc); rc = pDir->next()) { if( RC_OK( getFileNum( pDir->currentItemName(), &uiTmp))) { if( uiTmp >= uiHighFileNum) { uiHighFileNum = uiTmp; ui64HighOffset = pDir->currentItemSize(); } } } rc = NE_FLM_OK; m_ui64EOF = (((FLMUINT64)uiHighFileNum) * m_uiMaxFileSize) + ui64HighOffset; m_bOpen = TRUE; Exit: if( pDir) { pDir->Release(); } // Release the lock file if( RC_BAD( rc)) { releaseLockFile( m_szPath, FALSE); } return( rc); }
/**************************************************************************** Desc: Closes all data files associated with the object ****************************************************************************/ void F_MultiFileHdl::closeFile( FLMBOOL bDelete) { RCODE rc = NE_FLM_OK; FLMUINT uiLoop; IF_DirHdl * pDir = NULL; char szTmpPath[ F_PATH_MAX_SIZE]; IF_FileSystem * pFileSystem = f_getFileSysPtr(); if( !m_bOpen) { return; } for( uiLoop = 0; uiLoop < F_MULTI_FHDL_LIST_SIZE; uiLoop++) { if( m_pFileHdlList[ uiLoop].pFileHdl) { if( m_pFileHdlList[ uiLoop].bDirty) { (void)m_pFileHdlList[ uiLoop].pFileHdl->flush(); } m_pFileHdlList[ uiLoop].pFileHdl->closeFile(); m_pFileHdlList[ uiLoop].pFileHdl->Release(); f_memset( &m_pFileHdlList[ uiLoop], 0, sizeof( FH_INFO)); } } m_ui64EOF = 0; m_bOpen = FALSE; if( bDelete) { if( RC_OK( pFileSystem->openDir( m_szPath, "*.64", &pDir))) { // Remove all data files for( rc = pDir->next(); !RC_BAD( rc) ; rc = pDir->next()) { pDir->currentItemPath( szTmpPath); f_assert( f_strstr( szTmpPath, ".64") != 0); (void)pFileSystem->deleteFile( szTmpPath); } pDir->Release(); pDir = NULL; } // Release and delete the lock file (void)releaseLockFile( m_szPath, TRUE); // Remove the directory (void)pFileSystem->removeDir( m_szPath); } else { (void)releaseLockFile( m_szPath, FALSE); } }