123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428 |
- #include "Datei.h"
- #include "Text.h"
- #include <direct.h>
- #include <Shlwapi.h>
- #pragma comment(lib, "Shlwapi.lib")
- using namespace Framework;
- // Inhalt der Datei Klasse aus Datei.h
- // Konstruktor
- Datei::Datei()
- {
- ref = 1;
- stream = 0;
- pfad = 0;
- gr = 0;
- }
- // Destruktor
- Datei::~Datei()
- {
- if( stream )
- delete stream;
- if( pfad )
- pfad->release();
- }
- // nicht constant
- void Datei::setDatei( const char *pfad ) // setzt die Datei
- {
- if( istOffen() )
- schließen();
- if( !this->pfad )
- this->pfad = new Text();
- this->pfad->setText( pfad );
- gr = 0;
- }
- void Datei::setDatei( Text *pfad )
- {
- if( istOffen() )
- schließen();
- if( !this->pfad )
- this->pfad = new Text();
- this->pfad->setText( pfad );
- gr = 0;
- }
- bool Datei::umbenennen( const char *pfad ) // benennt die Datei um und verschiebt sie eventuell
- {
- if( !pfad )
- return 0;
- if( DateiUmbenennen( this->pfad->getThis(), new Text( pfad ) ) )
- {
- this->pfad->setText( pfad );
- return 1;
- }
- return 0;
- }
- bool Datei::umbenennen( Text *pfad )
- {
- if( !this->pfad )
- {
- pfad->release();
- return 0;
- }
- if( DateiUmbenennen( this->pfad->getThis(), pfad->getThis() ) )
- {
- this->pfad->setText( pfad->getText() );
- return 1;
- }
- return 0;
- }
- bool Datei::löschen() // löscht die Datei
- {
- if( !pfad )
- return 0;
- gr = 0;
- return DateiLöschen( pfad->getThis() );
- }
- bool Datei::erstellen() // erstellt die Datei
- {
- if( !pfad )
- return 0;
- return DateiPfadErstellen( pfad->getThis() );
- }
- bool Datei::öffnen( int style ) // öffnet die Datei
- {
- if( !pfad )
- return 0;
- if( stream )
- delete stream;
- stream = new std::fstream();
- std::ios_base::openmode om = std::ios::binary;
- if( ( style | D_Style::lesen ) == style )
- om |= std::ios::in;
- if( ( style | D_Style::schreiben ) == style )
- om |= std::ios::out;
- stream->open( pfad->getText(), om );
- if( ( style | D_Style::ende ) == style )
- {
- if( ( style | D_Style::lesen ) == style )
- stream->seekg( 0, std::ios::end );
- if( ( style | D_Style::schreiben ) == style )
- stream->seekp( 0, std::ios::end );
- }
- if( !stream->is_open() || !stream->good() )
- {
- delete stream;
- stream = 0;
- return 0;
- }
- return 1;
- }
- void Datei::setLPosition( __int64 pos, bool ende ) // setzt die Leseposition
- {
- if( !pfad )
- return;
- if( stream )
- {
- if( ende )
- stream->seekg( pos, std::ios::end );
- else
- stream->seekg( pos, std::ios::beg );
- }
- }
- void Datei::setSPosition( __int64 pos, bool ende ) // setzt die Schreibeposition
- {
- if( !pfad )
- return;
- if( stream )
- {
- if( ende )
- stream->seekp( pos, std::ios::end );
- else
- stream->seekp( pos, std::ios::beg );
- }
- }
- void Datei::schreibe( char *bytes, int län ) // schreibt bytes in datei
- {
- if( !pfad )
- return;
- if( stream )
- stream->write( bytes, län );
- }
- void Datei::lese( char *bytes, int län ) // ließt bytes aus datei
- {
- if( !pfad )
- return;
- if( stream )
- stream->read( bytes, län );
- }
- Text *Datei::leseZeile() // ließt eine zeile
- {
- if( !pfad | !stream )
- return 0;
- if( istEnde() || !stream->good() )
- return 0;
- Text *ret = new Text( "" );
- __int64 län = getGröße();
- for( char c = 0; c != '\n' && stream->tellg() < län; )
- {
- stream->read( &c, 1 );
- if( c )
- ret->anhängen( (const char*)&c, 1 );
- }
- return ret;
- }
- void Datei::schließen() // schließt die Datei
- {
- if( !pfad )
- return;
- if( stream )
- stream->close();
- delete stream;
- stream = 0;
- }
- // constant
- bool Datei::istOrdner() const // prüft, ob die Datei ein Ordner ist
- {
- if( !pfad )
- return 0;
- return DateiIstVerzeichnis( pfad->getThis() );
- }
- bool Datei::istOffen() const // prüft, ob die Datei geöffnet ist
- {
- if( !pfad )
- return 0;
- if( stream )
- return stream->is_open() && stream->good();
- return 0;
- }
- int Datei::getUnterdateiAnzahl() const // gibt die Anzahl der unterdateien an
- {
- if( !pfad )
- return 0;
- if( !DateiIstVerzeichnis( pfad->getThis() ) )
- return 0;
- int ret = 0;
- HANDLE fHandle;
- WIN32_FIND_DATA wfd;
- Text *stxt = new Text( pfad->getText() );
- stxt->ersetzen( '/', '\\' );
- if( stxt->positionVon( '\\' ) == stxt->getLänge() - 1 )
- stxt->anhängen( "*" );
- else
- stxt->anhängen( "\\*" );
- fHandle=FindFirstFile( stxt->getText(), &wfd );
- stxt->release();
- FindNextFile( fHandle, &wfd );
- while( FindNextFile( fHandle, &wfd ) )
- ret++;
- FindClose( fHandle );
- return ret;
- }
- TArray< Text > *Datei::getDateiListe() const // gibt eine Liste mit unterdateien zurück
- {
- if( !pfad )
- return 0;
- if( !DateiIstVerzeichnis( pfad->getThis() ) )
- return 0;
- HANDLE fHandle;
- WIN32_FIND_DATA wfd;
- Text *stxt = new Text( pfad->getText() );
- stxt->ersetzen( '/', '\\' );
- if( stxt->positionVon( '\\' ) == stxt->getLänge() - 1 )
- stxt->anhängen( "*" );
- else
- stxt->anhängen( "\\*" );
- fHandle=FindFirstFile( stxt->getText(), &wfd );
- stxt->release();
- FindNextFile( fHandle, &wfd );
- TArray< Text > *ret = new TArray< Text >();
- int count = 0;
- while( FindNextFile( fHandle, &wfd ) )
- {
- Text *txt = new Text( wfd.cFileName );
- ret->add( txt, count, 0 );
- count++;
- }
- FindClose( fHandle );
- return ret;
- }
- __int64 Datei::getGröße() const // gibt die Größe der Datei zurück
- {
- if( !pfad )
- return 0;
- if( gr )
- return gr;
- if( !stream || !istOffen() )
- {
- std::fstream *stream = new std::fstream();
- stream->open( pfad->getText(), std::ios::binary | std::ios::in );
- __int64 tmp = stream->tellg();
- stream->seekg( 0, std::ios::end );
- __int64 ret = stream->tellg();
- stream->seekg( tmp, std::ios::beg );
- stream->close();
- delete stream;
- __int64 *größe = (__int64*)&gr;
- *größe = ret;
- return ret;
- }
- __int64 tmp = stream->tellg();
- stream->seekg( 0, std::ios::end );
- __int64 ret = stream->tellg();
- stream->seekg( tmp, std::ios::beg );
- __int64 *größe = (__int64*)&gr;
- *größe = ret;
- return ret;
- }
- bool Datei::existiert() const // prüft, ob die Datei existiert
- {
- if( !pfad )
- return 0;
- return DateiExistiert( pfad->getThis() );
- }
- __int64 Datei::getLPosition() const // gibt die Leseposition zurück
- {
- if( !stream )
- return 0;
- return stream->tellg();
- }
- __int64 Datei::getSPosition() const // gibt die Schreibeposition zurück
- {
- if( !stream )
- return 0;
- return stream->tellp();
- }
- bool Datei::istEnde() const // prüft, ob die Datei zu ende ist
- {
- if( !stream )
- return 1;
- __int64 i = getGröße();
- return stream->tellg() >= i;
- }
- Text *Datei::getPfad() const // gibt den Dateipfad zurück
- {
- return pfad ? pfad->getThis() : 0;
- }
- Text *Datei::zPfad() const
- {
- return pfad;
- }
- // Reference Counting
- Datei *Datei::getThis()
- {
- ref++;
- return this;
- }
- Datei *Datei::release()
- {
- ref--;
- if( !ref )
- delete this;
- return 0;
- }
- // Datei Funktionen
- bool Framework::DateiPfadErstellen( Text* pfad ) // Erstellt eine Datei in dem Pfad
- {
- pfad->ersetzen( "//", "\\" ); // Pfadangaben korrigieren
- pfad->ersetzen( "/", "\\" );
- for( int i = 0; i < pfad->anzahlVon( "\\" ); i++ ) // Jeden ordner erstellen wenn er nicht existiert
- {
- Text *t = pfad->getTeilText( 0, pfad->positionVon( "\\", i ) );
- if( !DateiExistiert( t->getThis() ) )
- _mkdir( t->getText() );
- t->release();
- }
- std::ofstream f( pfad->getText(), std::ios::binary ); // Datei erstellen
- f.close();
- return DateiExistiert( pfad );
- }
- bool Framework::DateiLöschen( Text *pfad ) // Löscht die angegebene Datei
- {
- pfad->ersetzen( '\\', '/' );
- bool ret = 0;
- if( pfad )
- { // prüfen ob Datei existiert
- if( !DateiIstVerzeichnis( pfad->getThis() ) )
- ret = DeleteFile( pfad->getText() ) == 1; // Datei löschen
- else
- {
- ret = 1;
- Datei *dat = new Datei();
- dat->setDatei( pfad->getThis() );
- int anz = dat->getUnterdateiAnzahl();
- TArray< Text > *liste = dat->getDateiListe();
- for( int i = 0; i < anz; i++ )
- {
- Text *pf = new Text( pfad->getText() );
- if( pf->getText()[ pf->getLänge() - 1 ] != '/' )
- pf->anhängen( "/" );
- pf->anhängen( liste->get( i, 0 ) );
- if( ret )
- ret = DateiLöschen( pf );
- else
- DateiLöschen( pf );
- }
- liste->release();
- if( ret )
- ret = RemoveDirectory( pfad->getText() ) == 1;
- else
- RemoveDirectory( pfad->getText() );
- dat->release();
- }
- pfad->release();
- }
- return ret;
- }
- bool Framework::DateiUmbenennen( Text *pfad_alt, Text *pfad_neu ) // Benennt die Datei um
- {
- if( pfad_alt && pfad_neu )
- {
- bool ret = 0;
- if( DateiExistiert( pfad_alt->getThis() ) && !DateiExistiert( pfad_neu->getThis() ) ) // prüfen ob Dateien existieren
- ret = MoveFile( pfad_alt->getText(), pfad_neu->getText() ) == 1; // Datei umbenennen
- pfad_alt->release();
- pfad_neu->release();
- return ret;
- }
- return 0;
- }
- bool Framework::DateiExistiert( Text *pfad ) // Prüft, ob Datei existiert
- {
- bool ret = PathFileExists( pfad->getText() ) != 0;
- pfad->release();
- return ret;
- }
- bool Framework::DateiIstVerzeichnis( Text *pfad ) // prüft, ob pfad ein Verzeichnis ist
- {
- WIN32_FIND_DATA wfd;
- HANDLE handle = FindFirstFile( pfad->getText(), &wfd );
- pfad->release();
- if( handle == INVALID_HANDLE_VALUE )
- return 0;
- FindClose( handle );
- return ( wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) != 0;
- }
|