/************************************************************** * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * *************************************************************/ #include #include // NOT FULLY DECLARED SERVICES #include namespace csv { namespace ploc { Directory::Directory() { } Directory::Directory( const Path & i_rPath ) : aPath(i_rPath) // sPath { } Directory::Directory( const Directory & i_rDir ) : Persistent(), aPath(i_rDir.aPath) // sPath { } Directory::Directory( const char * i_rLocation ) : aPath(i_rLocation, true) { } Directory::Directory( const String & i_rLocation ) : aPath(i_rLocation.c_str(), true) { } Directory::~Directory() { } Directory & Directory::operator+=( const String & i_sName ) { InvalidatePath(); aPath.DirChain() += i_sName; return *this; } Directory & Directory::operator+=( const DirectoryChain & i_sDirChain ) { InvalidatePath(); aPath.DirChain() += i_sDirChain; return *this; } Directory & Directory::operator-=( uintt i_nLevels ) { InvalidatePath(); aPath.DirChain().PopBack(i_nLevels); return *this; } bool Directory::PhysicalCreate( bool i_bCreateParentsIfNecessary ) const { bool ret = PhysicalCreate_Dir( StrPath() ); if ( ret OR NOT i_bCreateParentsIfNecessary ) return ret; ret = Check_Parent(); if (ret) ret = PhysicalCreate_Dir( StrPath() ); return ret; } bool Directory::Check_Parent() const { // There is no parent of root directories: if ( aPath.DirChain().Size() == 0 ) return false; // Become my own parent: String sLastToken = aPath.DirChain().Back(); const_cast< Directory* >(this)->operator-=(1); // Begin behaving as parent: bool ret = Exists(); if (NOT ret) { ret = Check_Parent(); if (ret) ret = PhysicalCreate_Dir( StrPath() ); } // End behaving as parent. // Become myself again: const_cast< Directory* >(this)->operator+=(sLastToken); return ret; } } // namespace ploc } // namespace csv #ifdef WNT #include #include namespace csv { namespace ploc { bool Directory::PhysicalCreate_Dir( const char * i_sStr ) const { return mkdir( i_sStr ) == 0; } void Directory::GetContainedDirectories( StringVector & o_rResult ) const { const char * c_sANYDIR = "\\*.*"; String sNew; StreamStr sFilter(200); sFilter << StrPath() << c_sANYDIR; struct _finddata_t aEntry; long hFile = _findfirst( sFilter.c_str(), &aEntry ); for ( int bFindMore = (hFile == -1 ? 1 : 0); bFindMore == 0; bFindMore = _findnext( hFile, &aEntry ) ) { if ( (aEntry.attrib & _A_SUBDIR) AND *aEntry.name != '.' ) { sNew = aEntry.name; o_rResult.push_back( sNew ); } } // end for _findclose(hFile); } void Directory::GetContainedFiles( StringVector & o_rResult, const char * i_sFilter, E_Recursivity i_eRecursivity ) const { StreamStr sNew(240); sNew << aPath; StreamStr::size_type nStartFilename = sNew.tellp(); StreamStr sFilter(200); sFilter << StrPath() << "\\" << i_sFilter; struct _finddata_t aEntry; long hFile = _findfirst( sFilter.c_str(), &aEntry ); for ( int bFindMore = (hFile == -1 ? 1 : 0); bFindMore == 0; bFindMore = _findnext( hFile, &aEntry ) ) { sNew.seekp(nStartFilename); sNew << aEntry.name; String sNewAsString( sNew.c_str() ); o_rResult.push_back(sNewAsString); } // end for _findclose(hFile); if ( i_eRecursivity == flat ) return; // gathering from subdirectories: StringVector aSubDirectories; GetContainedDirectories( aSubDirectories ); StringVector::const_iterator dEnd = aSubDirectories.end(); for ( StringVector::const_iterator d = aSubDirectories.begin(); d != dEnd; ++d ) { Directory aSub(*this); aSub += *d; aSub.GetContainedFiles( o_rResult, i_sFilter, i_eRecursivity ); } } } // namespace ploc } // namespace csv #elif defined(UNX) #include #include #include namespace csv { namespace ploc { bool Directory::PhysicalCreate_Dir( const char * i_sStr ) const { return mkdir( i_sStr, 00777 ) == 0; } void Directory::GetContainedDirectories( StringVector & o_rResult ) const { StreamStr sNew(240); sNew << aPath; StreamStr::size_type nStartFilename = sNew.tellp(); DIR * pDir = opendir( StrPath() ); dirent * pEntry = 0; struct stat aEntryStatus; while ( (pEntry = readdir(pDir)) != 0 ) { sNew.seekp(nStartFilename); sNew << pEntry->d_name; stat(sNew.c_str(), &aEntryStatus); if ( (aEntryStatus.st_mode & S_IFDIR) == S_IFDIR AND *pEntry->d_name != '.' ) { String sNew2(pEntry->d_name); o_rResult.push_back(sNew2); } // endif (aEntry.attrib == _A_SUBDIR) } // end while closedir( pDir ); } void Directory::GetContainedFiles( StringVector & o_rResult, const char * i_sFilter, E_Recursivity i_eRecursivity ) const { StreamStr sNew(240); sNew << aPath; StreamStr::size_type nStartFilename = sNew.tellp(); bool bUseFilter = strcmp( i_sFilter, "*.*" ) != 0 AND strncmp( i_sFilter, "*.", 2) == 0; DIR * pDir = opendir( StrPath() ); dirent * pEntry = 0; struct stat aEntryStatus; while ( (pEntry = readdir(pDir)) != 0 ) { sNew.seekp(nStartFilename); sNew << pEntry->d_name; stat(sNew.c_str(), &aEntryStatus); if ( (aEntryStatus.st_mode & S_IFDIR) == S_IFDIR ) continue; // Don't gather directories. if ( bUseFilter ) { const char * pEnding = strrchr(pEntry->d_name,'.'); if (pEnding == 0) continue; if ( strcasecmp( pEnding + 1, i_sFilter + 2 ) != 0 ) continue; } sNew.seekp(nStartFilename); sNew << pEntry->d_name; String sNewAsString( sNew.c_str() ); o_rResult.push_back(sNewAsString); } // end while closedir( pDir ); if ( i_eRecursivity == flat ) return; // gathering from subdirectories: StringVector aSubDirectories; GetContainedDirectories( aSubDirectories ); StringVector::const_iterator dEnd = aSubDirectories.end(); for ( StringVector::const_iterator d = aSubDirectories.begin(); d != dEnd; ++d ) { Directory aSub(*this); aSub += *d; aSub.GetContainedFiles( o_rResult, i_sFilter, i_eRecursivity ); } } } // namespace ploc } // namespace csv #else #error For using csv::ploc there has to be defined: WNT or UNX. #endif namespace csv { namespace ploc { const Path & Directory::inq_MyPath() const { return aPath; } } // namespace ploc } // namespace csv