OGRShapeDataSource::OpenFile
bool OGRShapeDataSource::OpenFile( const char *pszNewName, bool bUpdate )
{
const char *pszExtension = CPLGetExtension( pszNewName );
if( !EQUAL(pszExtension,”shp”) && !EQUAL(pszExtension,”shx”)
&& !EQUAL(pszExtension,”dbf”) )
return false;
/* ——————————————————————– */
/* SHPOpen() should include better (CPL based) error reporting, */
/* and we should be trying to distinguish at this point whether */
/* failure is a result of trying to open a non-shapefile, or */
/* whether it was a shapefile and we want to report the error */
/* up. */
/* */
/* Care is taken to suppress the error and only reissue it if */
/* we think it is appropriate. */
/* ——————————————————————– */
CPLPushErrorHandler( CPLQuietErrorHandler );
SHPHandle hSHP = bUpdate ?
DS_SHPOpen( pszNewName, “r+” ) :
DS_SHPOpen( pszNewName, “r” );
CPLPopErrorHandler();
if( hSHP == nullptr
&& (!EQUAL(CPLGetExtension(pszNewName),”dbf”)
|| strstr(CPLGetLastErrorMsg(),”.shp”) == nullptr) )
{
CPLString osMsg = CPLGetLastErrorMsg();
CPLError( CE_Failure, CPLE_OpenFailed, “%s”, osMsg.c_str() );
return false;
}
CPLErrorReset();
/* ——————————————————————– */
/* Open the .dbf file, if it exists. To open a dbf file, the */
/* filename has to either refer to a successfully opened shp */
/* file or has to refer to the actual .dbf file. */
/* ——————————————————————– */
DBFHandle hDBF = nullptr;
if( hSHP != nullptr || EQUAL(CPLGetExtension(pszNewName), “dbf”) )
{
if( bUpdate )
{
hDBF = DS_DBFOpen( pszNewName, “r+” );
if( hSHP != nullptr && hDBF == nullptr )
{
for( int i = 0; i < 2; i++ )
{
VSIStatBufL sStat;
const char* pszDBFName =
CPLResetExtension(pszNewName,
(i == 0 ) ? “dbf” : “DBF”);
VSILFILE* fp = nullptr;
if( VSIStatExL( pszDBFName, &sStat,
VSI_STAT_EXISTS_FLAG) == 0 )
{
fp = VSIFOpenL(pszDBFName, “r+”);
if( fp == nullptr )
{
CPLError(
CE_Failure, CPLE_OpenFailed,
“%s exists, “
“but cannot be opened in update mode”,
pszDBFName );
SHPClose(hSHP);
return false;
}
VSIFCloseL(fp);
break;
}
}
}
}
else
{
hDBF = DS_DBFOpen( pszNewName, “r” );
}
}
else
{
hDBF = nullptr;
}
if( hDBF == nullptr && hSHP == nullptr )
return false;
/* ——————————————————————– */
/* Create the layer object. */
/* ——————————————————————– */
OGRShapeLayer *poLayer =
new OGRShapeLayer( this, pszNewName, hSHP, hDBF, nullptr, false, bUpdate,
wkbNone );
poLayer->SetModificationDate(
CSLFetchNameValue( papszOpenOptions, “DBF_DATE_LAST_UPDATE” ) );
poLayer->SetAutoRepack(
CPLFetchBool( papszOpenOptions, “AUTO_REPACK”, true ) );
poLayer->SetWriteDBFEOFChar(
CPLFetchBool( papszOpenOptions, “DBF_EOF_CHAR”, true ) );
/* ——————————————————————– */
/* Add layer to data source layer list. */
/* ——————————————————————– */
AddLayer(poLayer);
return true;
}
转载自:https://blog.csdn.net/durongze/article/details/81369445