/**************************************************************************** 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); }
RCODE FTKAPI F_DirHdl::createDir( const char * pszDirPath) { RCODE rc = NE_FLM_OK; char * pszParentDir = NULL; IF_FileSystem * pFileSystem = f_getFileSysPtr(); if( RC_BAD( rc = f_alloc( F_PATH_MAX_SIZE, &pszParentDir))) { goto Exit; } // Discover the parent directory of the given one if( RC_BAD( rc = pFileSystem->pathReduce( pszDirPath, pszParentDir, NULL))) { goto Exit; } // If pathReduce couldn't reduce the path at all, then an // invalid path was supplied. if( f_strcmp( pszDirPath, pszParentDir) == 0) { rc = RC_SET( NE_FLM_IO_INVALID_FILENAME); goto Exit; } // If a parent directory was found, and it doesn't already exist, create it if( *pszParentDir) { // If the "parent" is actually a regular file we need to return an error if( RC_OK( pFileSystem->doesFileExist( pszParentDir))) { if( !pFileSystem->isDir( pszParentDir)) { rc = RC_SET( NE_FLM_IO_ACCESS_DENIED); goto Exit; } } else if( RC_BAD( rc = createDir( pszParentDir))) { goto Exit; } } #if defined( FLM_WIN) if( !CreateDirectory((LPTSTR)pszDirPath, NULL)) { rc = f_mapPlatformError( GetLastError(), NE_FLM_CREATING_FILE); } #elif defined( FLM_UNIX) || defined( FLM_LIBC_NLM) if( mkdir( (char *)pszDirPath, 0777) == -1) { rc = f_mapPlatformError( errno, NE_FLM_CREATING_FILE); } #endif Exit: if( pszParentDir) { f_free( &pszParentDir); } return( rc); }