📄 cpl_vsil_unix_stdio_64.cpp
字号:
/********************************************************************** * $Id: cpl_vsil_unix_stdio_64.cpp,v 1.11 2006/03/27 15:24:41 fwarmerdam Exp $ * * Project: CPL - Common Portability Library * Purpose: Implement VSI large file api for Unix platforms with fseek64() * and ftell64() such as IRIX. * Author: Frank Warmerdam, warmerdam@pobox.com * ********************************************************************** * Copyright (c) 2001, Frank Warmerdam * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ********************************************************************** * * $Log: cpl_vsil_unix_stdio_64.cpp,v $ * Revision 1.11 2006/03/27 15:24:41 fwarmerdam * buffer in FWrite is const * * Revision 1.10 2006/02/19 21:54:34 mloskot * [WINCE] Changes related to Windows CE port of CPL. Most changes are #ifdef wrappers. * * Revision 1.9 2006/01/10 17:03:56 fwarmerdam * added VSI Rename support * * Revision 1.8 2005/09/11 18:01:28 fwarmerdam * preliminary implementatin of fully virtualized large file api * * Revision 1.7 2005/04/12 00:27:39 fwarmerdam * added macos large file support * * Revision 1.6 2002/06/17 14:00:16 warmerda * segregate VSIStatL() and VSIStatBufL. * * Revision 1.5 2002/06/15 00:07:23 aubin * mods to enable 64bit file i/o * * Revision 1.4 2001/12/15 17:12:08 warmerda * pass 64bit seek/tell functions via VSI_F{SEEK,TELL}64 macros * * Revision 1.3 2001/07/18 04:00:49 warmerda * added CPL_CVSID * * Revision 1.2 2001/06/21 21:39:32 warmerda * Fixed typo with rewind. * * Revision 1.1 2001/06/21 21:17:15 warmerda * New * */#include "cpl_port.h"#if !defined(WIN32) && !defined(WIN32CE)#include "cpl_vsi_private.h"#include "cpl_string.h"#include <unistd.h>#include <sys/stat.h>#include <sys/types.h>#include <dirent.h>CPL_CVSID("$Id: cpl_vsil_unix_stdio_64.cpp,v 1.11 2006/03/27 15:24:41 fwarmerdam Exp $");#if defined(UNIX_STDIO_64)#ifndef VSI_FTELL64#define VSI_FTELL64 ftell64#endif#ifndef VSI_FSEEK64#define VSI_FSEEK64 fseek64#endif#ifndef VSI_FOPEN64#define VSI_FOPEN64 fopen64#endif#ifndef VSI_STAT64#define VSI_STAT64 stat64#endif#ifndef VSI_STAT64_T#define VSI_STAT64_T stat64#endif#else /* not UNIX_STDIO_64 */#ifndef VSI_FTELL64#define VSI_FTELL64 ftell#endif#ifndef VSI_FSEEK64#define VSI_FSEEK64 fseek#endif#ifndef VSI_FOPEN64#define VSI_FOPEN64 fopen#endif#ifndef VSI_STAT64#define VSI_STAT64 stat#endif#ifndef VSI_STAT64_T#define VSI_STAT64_T stat#endif#endif /* ndef UNIX_STDIO_64 *//************************************************************************//* ==================================================================== *//* VSIUnixStdioFilesystemHandler *//* ==================================================================== *//************************************************************************/class VSIUnixStdioFilesystemHandler : public VSIFilesystemHandler {public: virtual VSIVirtualHandle *Open( const char *pszFilename, const char *pszAccess); virtual int Stat( const char *pszFilename, VSIStatBufL *pStatBuf ); virtual int Unlink( const char *pszFilename ); virtual int Rename( const char *oldpath, const char *newpath ); virtual int Mkdir( const char *pszDirname, long nMode ); virtual int Rmdir( const char *pszDirname ); virtual char **ReadDir( const char *pszDirname );};/************************************************************************//* ==================================================================== *//* VSIUnixStdioHandle *//* ==================================================================== *//************************************************************************/class VSIUnixStdioHandle : public VSIVirtualHandle{ public: FILE *fp; virtual int Seek( vsi_l_offset nOffset, int nWhence ); virtual vsi_l_offset Tell(); virtual size_t Read( void *pBuffer, size_t nSize, size_t nMemb ); virtual size_t Write( const void *pBuffer, size_t nSize, size_t nMemb ); virtual int Eof(); virtual int Flush(); virtual int Close();};/************************************************************************//* Close() *//************************************************************************/int VSIUnixStdioHandle::Close(){ return fclose( fp );}/************************************************************************//* Seek() *//************************************************************************/int VSIUnixStdioHandle::Seek( vsi_l_offset nOffset, int nWhence ){ return( VSI_FSEEK64( fp, nOffset, nWhence ) );}/************************************************************************//* Tell() *//************************************************************************/vsi_l_offset VSIUnixStdioHandle::Tell(){ return( VSI_FTELL64( fp ) );}/************************************************************************//* Flush() *//************************************************************************/int VSIUnixStdioHandle::Flush(){ return fflush( fp );}/************************************************************************//* Read() *//************************************************************************/size_t VSIUnixStdioHandle::Read( void * pBuffer, size_t nSize, size_t nCount ){ return fread( pBuffer, nSize, nCount, fp );}/************************************************************************//* Write() *//************************************************************************/size_t VSIUnixStdioHandle::Write( const void * pBuffer, size_t nSize, size_t nCount ){ return fwrite( pBuffer, nSize, nCount, fp );}/************************************************************************//* Eof() *//************************************************************************/int VSIUnixStdioHandle::Eof(){ return feof( fp );}/************************************************************************//* ==================================================================== *//* VSIUnixStdioFilesystemHandler *//* ==================================================================== *//************************************************************************//************************************************************************//* Open() *//************************************************************************/VSIVirtualHandle *VSIUnixStdioFilesystemHandler::Open( const char *pszFilename, const char *pszAccess ){ FILE *fp = VSI_FOPEN64( pszFilename, pszAccess ); if( fp == NULL ) return NULL; VSIUnixStdioHandle *poHandle = new VSIUnixStdioHandle; poHandle->fp = fp; return poHandle;}/************************************************************************//* Stat() *//************************************************************************/int VSIUnixStdioFilesystemHandler::Stat( const char * pszFilename, VSIStatBufL * pStatBuf ){ return( VSI_STAT64( pszFilename, pStatBuf ) );}/************************************************************************//* Unlink() *//************************************************************************/int VSIUnixStdioFilesystemHandler::Unlink( const char * pszFilename ){ return unlink( pszFilename );}/************************************************************************//* Rename() *//************************************************************************/int VSIUnixStdioFilesystemHandler::Rename( const char *oldpath, const char *newpath ){ return rename( oldpath, newpath );}/************************************************************************//* Mkdir() *//************************************************************************/int VSIUnixStdioFilesystemHandler::Mkdir( const char * pszPathname, long nMode ){ return mkdir( pszPathname, nMode );}/************************************************************************//* Rmdir() *//************************************************************************/int VSIUnixStdioFilesystemHandler::Rmdir( const char * pszPathname ){ return rmdir( pszPathname );}/************************************************************************//* ReadDir() *//************************************************************************/char **VSIUnixStdioFilesystemHandler::ReadDir( const char *pszPath ){ DIR *hDir; struct dirent *psDirEntry; char **papszDir = NULL; if (strlen(pszPath) == 0) pszPath = "."; if ( (hDir = opendir(pszPath)) != NULL ) { while( (psDirEntry = readdir(hDir)) != NULL ) { papszDir = CSLAddString(papszDir, psDirEntry->d_name); } closedir( hDir ); } else { /* Should we generate an error??? * For now we'll just return NULL (at the end of the function) */ } return papszDir;}/************************************************************************//* VSIInstallLargeFileHandler() *//************************************************************************/void VSIInstallLargeFileHandler(){ VSIFileManager::InstallHandler( string(""), new VSIUnixStdioFilesystemHandler );}#endif /* ndef WIN32 */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -