⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cpl_path.cpp

📁 读写ArcInfo Binary Grid的c代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/********************************************************************** * $Id: cpl_path.cpp,v 1.14 2003/05/28 19:22:38 warmerda Exp $ * * Project:  CPL - Common Portability Library * Purpose:  Portable filename/path parsing, and forming ala "Glob API". * Author:   Frank Warmerdam, warmerda@home.com * ********************************************************************** * Copyright (c) 1999, 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_path.cpp,v $ * Revision 1.14  2003/05/28 19:22:38  warmerda * fixed docs * * Revision 1.13  2003/04/04 09:11:35  dron * strcpy() and strcat() replaced by strncpy() and strncat(). * A lot of assertion on string sizes added. * * Revision 1.12  2002/12/13 06:14:17  warmerda * fixed bug with IsRelative function * * Revision 1.11  2002/12/13 06:00:54  warmerda * added CPLProjectRelativeFilename() and CPLIsFilenameRelative() * * Revision 1.10  2002/08/15 09:23:24  dron * Added CPLGetDirname() function * * Revision 1.9  2001/08/30 21:20:49  warmerda * expand tabs * * Revision 1.8  2001/07/18 04:00:49  warmerda * added CPL_CVSID * * Revision 1.7  2001/05/12 19:20:55  warmerda * Fixed documentation of CPLGetExtension(). * * Revision 1.6  2001/03/16 22:15:08  warmerda * added CPLResetExtension * * Revision 1.5  2001/02/24 01:53:57  warmerda * Added CPLFormCIFilename() * * Revision 1.4  2001/01/19 21:18:25  warmerda * expanded tabs * * Revision 1.3  2000/01/26 17:53:36  warmerda * Fixed CPLGetExtension() for filenames with no extension. * * Revision 1.2  2000/01/24 19:32:59  warmerda * Fixed CPLGetExtension() to not include the dot. * * Revision 1.1  1999/10/14 19:23:39  warmerda * New * **********************************************************************/#include "cpl_conv.h"#include "cpl_string.h"CPL_CVSID("$Id: cpl_path.cpp,v 1.14 2003/05/28 19:22:38 warmerda Exp $");/* should be size of larged possible filename */#define CPL_PATH_BUF_SIZE 2048static char     szStaticResult[CPL_PATH_BUF_SIZE]; #ifdef WIN32        #define SEP_CHAR '\\'#define SEP_STRING "\\"#else#define SEP_CHAR '/'#define SEP_STRING "/"#endif/************************************************************************//*                        CPLFindFilenameStart()                        *//************************************************************************/static int CPLFindFilenameStart( const char * pszFilename ){    int         iFileStart;    for( iFileStart = strlen(pszFilename);         iFileStart > 0             && pszFilename[iFileStart-1] != '/'             && pszFilename[iFileStart-1] != '\\';         iFileStart-- ) {}    return iFileStart;}/************************************************************************//*                             CPLGetPath()                             *//************************************************************************//** * Extract directory path portion of filename. * * Returns a string containing the directory path portion of the passed * filename.  If there is no path in the passed filename an empty string * will be returned (not NULL). * * <pre> * CPLGetPath( "abc/def.xyz" ) == "abc" * CPLGetPath( "/abc/def/" ) == "/abc/def" * CPLGetPath( "/" ) == "/" * CPLGetPath( "/abc/def" ) == "/abc" * CPLGetPath( "abc" ) == "" * </pre> * * @param pszFilename the filename potentially including a path. * *  @return Path in an internal string which must not be freed.  The string * may be destroyed by the next CPL filename handling call.  The returned * will generally not contain a trailing path separator. */const char *CPLGetPath( const char *pszFilename ){    int         iFileStart = CPLFindFilenameStart(pszFilename);    CPLAssert( iFileStart < CPL_PATH_BUF_SIZE );    if( iFileStart == 0 )    {        strcpy( szStaticResult, "" );        return szStaticResult;    }    strncpy( szStaticResult, pszFilename, iFileStart );    szStaticResult[iFileStart] = '\0';    if( iFileStart > 1        && (szStaticResult[iFileStart-1] == '/'            || szStaticResult[iFileStart-1] == '\\') )        szStaticResult[iFileStart-1] = '\0';    return szStaticResult;}/************************************************************************//*                             CPLGetDirname()                          *//************************************************************************//** * Extract directory path portion of filename. * * Returns a string containing the directory path portion of the passed * filename.  If there is no path in the passed filename the dot will be * returned.  It is the only difference from CPLGetPath(). * * <pre> * CPLGetDirname( "abc/def.xyz" ) == "abc" * CPLGetDirname( "/abc/def/" ) == "/abc/def" * CPLGetDirname( "/" ) == "/" * CPLGetDirname( "/abc/def" ) == "/abc" * CPLGetDirname( "abc" ) == "." * </pre> * * @param pszFilename the filename potentially including a path. * * @return Path in an internal string which must not be freed.  The string * may be destroyed by the next CPL filename handling call.  The returned * will generally not contain a trailing path separator. */const char *CPLGetDirname( const char *pszFilename ){    int         iFileStart = CPLFindFilenameStart(pszFilename);    CPLAssert( iFileStart < CPL_PATH_BUF_SIZE );    if( iFileStart == 0 )    {        strcpy( szStaticResult, "." );        return szStaticResult;    }    strncpy( szStaticResult, pszFilename, iFileStart );    szStaticResult[iFileStart] = '\0';    if( iFileStart > 1        && (szStaticResult[iFileStart-1] == '/'            || szStaticResult[iFileStart-1] == '\\') )        szStaticResult[iFileStart-1] = '\0';    return szStaticResult;}/************************************************************************//*                           CPLGetFilename()                           *//************************************************************************//** * Extract non-directory portion of filename. * * Returns a string containing the bare filename portion of the passed * filename.  If there is no filename (passed value ends in trailing directory * separator) an empty string is returned. * * <pre> * CPLGetFilename( "abc/def.xyz" ) == "def.xyz" * CPLGetFilename( "/abc/def/" ) == "" * CPLGetFilename( "abc/def" ) == "def" * </pre> * * @param pszFullFilename the full filename potentially including a path. * *  @return just the non-directory portion of the path in an internal string * which must not be freed.  The string * may be destroyed by the next CPL filename handling call. */const char *CPLGetFilename( const char *pszFullFilename ){    int iFileStart = CPLFindFilenameStart( pszFullFilename );    strncpy( szStaticResult, pszFullFilename + iFileStart, CPL_PATH_BUF_SIZE );    szStaticResult[CPL_PATH_BUF_SIZE - 1] = '\0';    return szStaticResult;}/************************************************************************//*                           CPLGetBasename()                           *//************************************************************************//** * Extract basename (non-directory, non-extension) portion of filename. * * Returns a string containing the file basename portion of the passed * name.  If there is no basename (passed value ends in trailing directory * separator, or filename starts with a dot) an empty string is returned. * * <pre> * CPLGetBasename( "abc/def.xyz" ) == "def" * CPLGetBasename( "abc/def" ) == "def" * CPLGetBasename( "abc/def/" ) == "" * </pre> * * @param pszFullFilename the full filename potentially including a path. * * @return just the non-directory, non-extension portion of the path in * an internal string which must not be freed.  The string * may be destroyed by the next CPL filename handling call. */const char *CPLGetBasename( const char *pszFullFilename ){    int iFileStart = CPLFindFilenameStart( pszFullFilename );    int iExtStart, nLength;    for( iExtStart = strlen(pszFullFilename);         iExtStart > iFileStart && pszFullFilename[iExtStart] != '.';         iExtStart-- ) {}    if( iExtStart == iFileStart )        iExtStart = strlen(pszFullFilename);    nLength = iExtStart - iFileStart;    CPLAssert( nLength < CPL_PATH_BUF_SIZE );    strncpy( szStaticResult, pszFullFilename + iFileStart, nLength );    szStaticResult[nLength] = '\0';    return szStaticResult;}/************************************************************************//*                           CPLGetExtension()                          *//************************************************************************//** * Extract filename extension from full filename. * * Returns a string containing the extention portion of the passed * name.  If there is no extension (the filename has no dot) an empty string * is returned.  The returned extension will not include the period. * * <pre> * CPLGetExtension( "abc/def.xyz" ) == "xyz" * CPLGetExtension( "abc/def" ) == "" * </pre> * * @param pszFullFilename the full filename potentially including a path. * * @return just the extension portion of the path in * an internal string which must not be freed.  The string * may be destroyed by the next CPL filename handling call.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -