Datei.cpp 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806
  1. #include "Datei.h"
  2. #include "Text.h"
  3. #include "Zeit.h"
  4. #ifdef WIN32
  5. #include <direct.h>
  6. #include <Shlwapi.h>
  7. #pragma comment(lib, "Shlwapi.lib")
  8. #else
  9. #include <dirent.h>
  10. #include <sys/stat.h>
  11. #include <stdio.h>
  12. #endif
  13. using namespace Framework;
  14. // Inhalt der Datei Klasse aus Datei.h
  15. // Konstruktor
  16. Datei::Datei()
  17. : ref( 1 ),
  18. stream( 0 ),
  19. pfad( 0 ),
  20. gr( 0 ),
  21. tmpLByte( 0 ),
  22. tmpLBPos( 7 ),
  23. tmpSByte( 0 ),
  24. tmpSBPos( -1 )
  25. {}
  26. // Destruktor
  27. Datei::~Datei()
  28. {
  29. if( stream )
  30. delete stream;
  31. if( pfad )
  32. pfad->release();
  33. }
  34. // nicht constant
  35. void Datei::setDatei( const char *pfad ) // setzt die Datei
  36. {
  37. if( istOffen() )
  38. schließen();
  39. if( !this->pfad )
  40. this->pfad = new Text();
  41. this->pfad->setText( pfad );
  42. gr = 0;
  43. }
  44. void Datei::setDatei( Text *pfad )
  45. {
  46. if( istOffen() )
  47. schließen();
  48. if( !this->pfad )
  49. this->pfad = new Text();
  50. this->pfad->setText( pfad );
  51. gr = 0;
  52. }
  53. bool Datei::umbenennen( const char *pfad ) // benennt die Datei um und verschiebt sie eventuell
  54. {
  55. if( !pfad )
  56. return 0;
  57. if( DateiUmbenennen( this->pfad->getText(), pfad ) )
  58. {
  59. this->pfad->setText( pfad );
  60. return 1;
  61. }
  62. return 0;
  63. }
  64. bool Datei::umbenennen( Text *pfad )
  65. {
  66. if( !this->pfad )
  67. {
  68. pfad->release();
  69. return 0;
  70. }
  71. if( DateiUmbenennen( this->pfad->getText(), pfad->getText() ) )
  72. {
  73. this->pfad->setText( pfad );
  74. return 1;
  75. }
  76. pfad->release();
  77. return 0;
  78. }
  79. bool Datei::löschen() // löscht die Datei
  80. {
  81. if( !pfad )
  82. return 0;
  83. return DateiLöschen( pfad->getThis() );
  84. }
  85. bool Datei::erstellen() // erstellt die Datei
  86. {
  87. if( !pfad )
  88. return 0;
  89. return DateiPfadErstellen( pfad->getThis() );
  90. }
  91. bool Datei::öffnen( int style ) // öffnet die Datei
  92. {
  93. if( !pfad )
  94. return 0;
  95. if( stream )
  96. delete stream;
  97. stream = new std::fstream();
  98. std::ios_base::openmode om = std::ios::binary;
  99. if( ( style | Style::lesen ) == style )
  100. om |= std::ios::in;
  101. if( ( style | Style::schreiben ) == style )
  102. om |= std::ios::out;
  103. stream->open( pfad->getText(), om );
  104. if( ( style | Style::ende ) == style )
  105. {
  106. if( ( style | Style::lesen ) == style )
  107. stream->seekg( 0, std::ios::end );
  108. if( ( style | Style::schreiben ) == style )
  109. stream->seekp( 0, std::ios::end );
  110. }
  111. if( !stream->is_open() || !stream->good() )
  112. {
  113. delete stream;
  114. stream = 0;
  115. return 0;
  116. }
  117. tmpLBPos = 7;
  118. tmpSBPos = -1;
  119. return 1;
  120. }
  121. void Datei::setLPosition( __int64 pos, bool ende ) // setzt die Leseposition
  122. {
  123. if( !pfad )
  124. return;
  125. if( stream )
  126. {
  127. if( ende )
  128. stream->seekg( pos, std::ios::end );
  129. else
  130. stream->seekg( pos, std::ios::beg );
  131. }
  132. tmpLBPos = 7;
  133. }
  134. void Datei::setSPosition( __int64 pos, bool ende ) // setzt die Schreibeposition
  135. {
  136. if( !pfad )
  137. return;
  138. if( stream )
  139. {
  140. if( ende )
  141. stream->seekp( pos, std::ios::end );
  142. else
  143. stream->seekp( pos, std::ios::beg );
  144. }
  145. tmpSBPos = -1;
  146. }
  147. void Datei::schreibe( char *bytes, int län ) // schreibt bytes in datei
  148. {
  149. if( !pfad || !stream )
  150. return;
  151. if( tmpSBPos >= 0 )
  152. {
  153. tmpSBPos = -1;
  154. stream->write( &tmpSByte, 1 );
  155. tmpSByte = 0;
  156. }
  157. stream->write( bytes, län );
  158. }
  159. void Datei::lese( char *bytes, int län ) // ließt bytes aus datei
  160. {
  161. if( !pfad )
  162. return;
  163. if( stream )
  164. stream->read( bytes, län );
  165. tmpLBPos = 7;
  166. tmpSBPos = -1;
  167. }
  168. Text *Datei::leseZeile() // ließt eine zeile
  169. {
  170. if( !pfad | !stream )
  171. return 0;
  172. if( istEnde() )
  173. return 0;
  174. Text *ret = new Text( "" );
  175. __int64 län = getGröße();
  176. for( char c = 0; c != '\n' && stream->tellg() < län; )
  177. {
  178. stream->read( &c, 1 );
  179. if( c )
  180. ret->anhängen( (const char*)&c, 1 );
  181. }
  182. tmpSBPos = 7;
  183. tmpSBPos = -1;
  184. return ret;
  185. }
  186. void Datei::schließen() // schließt die Datei
  187. {
  188. if( !pfad || !stream )
  189. return;
  190. if( tmpSBPos >= 0 )
  191. stream->write( &tmpSByte, 1 );
  192. stream->close();
  193. delete stream;
  194. stream = 0;
  195. }
  196. #ifdef WIN32
  197. bool Datei::setLetzteÄnderung( Zeit *zeit ) // setzt das änderungsdatum der Datei
  198. {
  199. if( !pfad )
  200. {
  201. zeit->release();
  202. return 0;
  203. }
  204. HANDLE hFile = CreateFile( pfad->getText(), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL );
  205. if( hFile == INVALID_HANDLE_VALUE )
  206. {
  207. zeit->release();
  208. return 0;
  209. }
  210. FILETIME ftCreate, ftAccess, ftWrite;
  211. if( !GetFileTime( hFile, &ftCreate, &ftAccess, &ftWrite ) )
  212. {
  213. CloseHandle( hFile );
  214. zeit->release();
  215. return 0;
  216. }
  217. SYSTEMTIME stUTC, stLocal;
  218. stLocal.wMilliseconds = 0;
  219. stLocal.wSecond = zeit->zUhrzeit()->getSekunde();
  220. stLocal.wMinute = zeit->zUhrzeit()->getMinute();
  221. stLocal.wHour = zeit->zUhrzeit()->getStunde();
  222. stLocal.wDay = zeit->zDatum()->getTag();
  223. stLocal.wMonth = zeit->zDatum()->getMonat();
  224. stLocal.wYear = zeit->zDatum()->getJahr();
  225. zeit->release();
  226. if( !TzSpecificLocalTimeToSystemTime( NULL, &stLocal, &stUTC ) )
  227. {
  228. CloseHandle( hFile );
  229. return 0;
  230. }
  231. if( !SystemTimeToFileTime( &stUTC, &ftWrite ) )
  232. {
  233. CloseHandle( hFile );
  234. return 0;
  235. }
  236. if( !SetFileTime( hFile, &ftCreate, &ftAccess, &ftWrite ) )
  237. {
  238. CloseHandle( hFile );
  239. return 0;
  240. }
  241. CloseHandle( hFile );
  242. return 1;
  243. }
  244. #endif
  245. bool Datei::getNextBit( bool &bit ) // Datei Bitweise auslesen
  246. {
  247. if( !pfad || !stream )
  248. return 0;
  249. if( tmpLBPos == 7 )
  250. {
  251. tmpLBPos = -1;
  252. stream->read( &tmpLByte, 1 );
  253. }
  254. tmpLBPos++;
  255. bit = ( tmpLByte >> ( 7 - tmpLBPos ) ) & 1;
  256. return 1;
  257. }
  258. bool Datei::setNextBit( bool bit ) // Datei Bitweise speichern
  259. {
  260. if( !pfad || !stream )
  261. return 0;
  262. tmpSBPos++;
  263. tmpSByte |= ( (char)bit << ( 7 - tmpSBPos ) ) & ( 1 << ( 7 - tmpSBPos ) );
  264. if( tmpSBPos == 7 )
  265. {
  266. tmpSBPos = -1;
  267. stream->write( &tmpSByte, 1 );
  268. tmpSByte = 0;
  269. }
  270. return 1;
  271. }
  272. // constant
  273. bool Datei::istOrdner() const // prüft, ob die Datei ein Ordner ist
  274. {
  275. if( !pfad )
  276. return 0;
  277. return DateiIstVerzeichnis( pfad->getThis() );
  278. }
  279. bool Datei::istOffen() const // prüft, ob die Datei geöffnet ist
  280. {
  281. if( !pfad )
  282. return 0;
  283. if( stream )
  284. return stream->is_open() && stream->good();
  285. return 0;
  286. }
  287. int Datei::getUnterdateiAnzahl() const // gibt die Anzahl der unterdateien an
  288. {
  289. #ifdef WIN32
  290. if( !pfad )
  291. return 0;
  292. if( !DateiIstVerzeichnis( pfad->getThis() ) )
  293. return 0;
  294. int ret = 0;
  295. HANDLE fHandle;
  296. WIN32_FIND_DATA wfd;
  297. Text stxt = pfad->getText();
  298. stxt.ersetzen( '/', '\\' );
  299. if( stxt.positionVon( '\\' ) == stxt.getLänge() - 1 )
  300. stxt.anhängen( "*" );
  301. else
  302. stxt.anhängen( "\\*" );
  303. fHandle = FindFirstFile( stxt.getText(), &wfd );
  304. FindNextFile( fHandle, &wfd );
  305. while( FindNextFile( fHandle, &wfd ) )
  306. ++ret;
  307. FindClose( fHandle );
  308. return ret;
  309. #else
  310. if( !pfad )
  311. return 0;
  312. if( !DateiIstVerzeichnis( pfad->getThis() ) )
  313. return 0;
  314. int ret = 0;
  315. Text stxt = pfad->getText();
  316. stxt.ersetzen( '\\', '/' );
  317. if( stxt.positionVon( '/' ) == stxt.getLaenge() - 1 )
  318. stxt.loeschen( stxt.getLaenge() - 1 );
  319. DIR *hdir;
  320. hdir = opendir( stxt.getText() );
  321. for( dirent *entry = readdir( hdir ); entry; entry = readdir( hdir ) )
  322. {
  323. if( entry && entry->d_name[ 0 ] != '.' )
  324. ++ret;
  325. }
  326. closedir( hdir );
  327. return ret;
  328. #endif
  329. }
  330. RCArray< Text > *Datei::getDateiListe() const // gibt eine Liste mit unterdateien zurück
  331. {
  332. #ifdef WIN32
  333. if( !pfad )
  334. return 0;
  335. if( !DateiIstVerzeichnis( pfad->getThis() ) )
  336. return 0;
  337. HANDLE fHandle;
  338. WIN32_FIND_DATA wfd;
  339. Text stxt = pfad->getText();
  340. stxt.ersetzen( '/', '\\' );
  341. if( stxt.positionVon( '\\' ) == stxt.getLänge() - 1 )
  342. stxt.anhängen( "*" );
  343. else
  344. stxt.anhängen( "\\*" );
  345. fHandle = FindFirstFile( stxt.getText(), &wfd );
  346. FindNextFile( fHandle, &wfd );
  347. RCArray< Text > *ret = new RCArray< Text >();
  348. int count = 0;
  349. while( FindNextFile( fHandle, &wfd ) )
  350. {
  351. Text *txt = new Text( wfd.cFileName );
  352. ret->add( txt, count );
  353. ++count;
  354. }
  355. FindClose( fHandle );
  356. return ret;
  357. #else
  358. if( !pfad )
  359. return 0;
  360. if( !DateiIstVerzeichnis( pfad->getThis() ) )
  361. return 0;
  362. Text stxt = pfad->getText();
  363. stxt.ersetzen( '\\', '/' );
  364. if( stxt.positionVon( '/' ) == stxt.getLaenge() - 1 )
  365. stxt.loeschen( stxt.getLaenge() - 1 );
  366. DIR *hdir;
  367. hdir = opendir( stxt.getText() );
  368. if( hdir )
  369. {
  370. RCArray< Text > *ret = new RCArray< Text >();
  371. int count = 0;
  372. for( dirent *entry = readdir( hdir ); entry; entry = readdir( hdir ) )
  373. {
  374. if( entry && entry->d_name[ 0 ] != '.' )
  375. {
  376. ret->add( new Text( entry->d_name ), count );
  377. ++count;
  378. }
  379. }
  380. closedir( hdir );
  381. return ret;
  382. }
  383. return 0;
  384. #endif
  385. }
  386. __int64 Datei::getGröße() const // gibt die Größe der Datei zurück
  387. {
  388. if( !pfad )
  389. return 0;
  390. if( gr )
  391. return gr;
  392. if( !stream || !istOffen() )
  393. {
  394. std::fstream *stream = new std::fstream();
  395. stream->open( pfad->getText(), std::ios::binary | std::ios::in );
  396. __int64 tmp = stream->tellg();
  397. stream->seekg( 0, std::ios::end );
  398. __int64 ret = stream->tellg();
  399. stream->seekg( tmp, std::ios::beg );
  400. stream->close();
  401. delete stream;
  402. __int64 *größe = (__int64*)&gr;
  403. *größe = ret;
  404. return ret;
  405. }
  406. __int64 tmp = stream->tellg();
  407. stream->seekg( 0, std::ios::end );
  408. __int64 ret = stream->tellg();
  409. stream->seekg( tmp, std::ios::beg );
  410. __int64 *größe = (__int64*)&gr;
  411. *größe = ret;
  412. return ret;
  413. }
  414. Zeit *Datei::getLetzteÄnderung() const // gibt das Datum der letzten Änderung
  415. {
  416. if( !pfad )
  417. return 0;
  418. #ifdef WIN32
  419. HANDLE hFile = CreateFile( pfad->getText(), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL );
  420. if( hFile == INVALID_HANDLE_VALUE )
  421. return 0;
  422. FILETIME ftCreate, ftAccess, ftWrite;
  423. SYSTEMTIME stUTC, stLocal;
  424. if( !GetFileTime( hFile, &ftCreate, &ftAccess, &ftWrite ) )
  425. {
  426. CloseHandle( hFile );
  427. return 0;
  428. }
  429. CloseHandle( hFile );
  430. if( !FileTimeToSystemTime( &ftWrite, &stUTC ) )
  431. return 0;
  432. if( !SystemTimeToTzSpecificLocalTime( NULL, &stUTC, &stLocal ) )
  433. return 0;
  434. Zeit *ret = new Zeit();
  435. ret->setZeit( stLocal.wYear, stLocal.wMonth, stLocal.wDay, stLocal.wHour, stLocal.wMinute, stLocal.wSecond );
  436. return ret;
  437. #else
  438. struct stat attrib;
  439. stat( pfad->getText(), &attrib );
  440. tm *clock = gmtime( &( attrib.st_mtime ) );
  441. Zeit *ret = new Zeit();
  442. ret->setZeit( clock->tm_year + 1900, clock->tm_mon + 1, clock->tm_mday, clock->tm_hour, clock->tm_min, clock->tm_sec );
  443. return ret;
  444. #endif
  445. }
  446. bool Datei::existiert() const // prüft, ob die Datei existiert
  447. {
  448. if( !pfad )
  449. return 0;
  450. return DateiExistiert( pfad->getThis() );
  451. }
  452. __int64 Datei::getLPosition() const // gibt die Leseposition zurück
  453. {
  454. if( !stream )
  455. return 0;
  456. return stream->tellg();
  457. }
  458. __int64 Datei::getSPosition() const // gibt die Schreibeposition zurück
  459. {
  460. if( !stream )
  461. return 0;
  462. return stream->tellp();
  463. }
  464. bool Datei::istEnde() const // prüft, ob die Datei zu ende ist
  465. {
  466. if( !stream || stream->tellg() < 0 )
  467. return 1;
  468. __int64 i = getGröße();
  469. return stream->tellg() >= i;
  470. }
  471. Text *Datei::getPfad() const // gibt den Dateipfad zurück
  472. {
  473. return pfad ? pfad->getThis() : 0;
  474. }
  475. Text *Datei::zPfad() const
  476. {
  477. return pfad;
  478. }
  479. // Reference Counting
  480. Datei *Datei::getThis()
  481. {
  482. ++ref;
  483. return this;
  484. }
  485. Datei *Datei::release()
  486. {
  487. --ref;
  488. if( !ref )
  489. delete this;
  490. return 0;
  491. }
  492. // Datei Funktionen
  493. void Framework::GetFreePfad( Text *zPfad ) // Sucht einen unbenutzten Dateinamen
  494. {
  495. Text txt = zPfad->getText();
  496. for( int i = 0; DateiExistiert( txt ); i++ )
  497. {
  498. txt = zPfad->getText();
  499. txt.anhängen( i );
  500. }
  501. zPfad->setText( txt );
  502. }
  503. bool Framework::DateiPfadErstellen( Text *pfad ) // Erstellt eine Datei in dem Pfad
  504. {
  505. bool ret = DateiPfadErstellen( pfad->getText() );
  506. pfad->release();
  507. return ret;
  508. }
  509. bool Framework::DateiLöschen( Text *pfad ) // Löscht die angegebene Datei
  510. {
  511. bool ret = DateiLöschen( pfad->getText() );
  512. pfad->release();
  513. return ret;
  514. }
  515. bool Framework::DateiUmbenennen( Text *pfad_alt, Text *pfad_neu ) // Benennt die Datei um
  516. {
  517. bool ret = DateiUmbenennen( pfad_alt->getText(), pfad_neu->getText() );
  518. pfad_alt->release();
  519. pfad_neu->release();
  520. return ret;
  521. }
  522. bool Framework::DateiExistiert( Text *pfad ) // Prüft, ob Datei existiert
  523. {
  524. bool ret = DateiExistiert( pfad->getText() );
  525. pfad->release();
  526. return ret;
  527. }
  528. bool Framework::DateiIstVerzeichnis( Text *pfad ) // prüft, ob pfad ein Verzeichnis ist
  529. {
  530. bool ret = DateiIstVerzeichnis( pfad->getText() );
  531. pfad->release();
  532. return ret;
  533. }
  534. bool Framework::DateiPfadErstellen( const char *pfad ) // Erstellt eine Datei in dem Pfad
  535. {
  536. Text pf = pfad;
  537. bool erst = 1;
  538. #ifdef WIN32
  539. pf.ersetzen( "//", "\\" ); // Pfadangaben korrigieren
  540. pf.ersetzen( "/", "\\" );
  541. for( int i = 0; i < pf.anzahlVon( "\\" ); ++i ) // Jeden ordner erstellen wenn er nicht existiert
  542. {
  543. Text *t = pf.getTeilText( 0, pf.positionVon( "\\", i ) );
  544. if( !t || !t->getLänge() )
  545. {
  546. if( t )
  547. t->release();
  548. continue;
  549. }
  550. if( !DateiExistiert( t->getThis() ) )
  551. #pragma warning(suppress: 6031)
  552. _mkdir( t->getText() );
  553. t->release();
  554. if( pf.positionVon( "\\", i ) == pf.getLänge() - 1 )
  555. erst = 0;
  556. }
  557. #else
  558. pf.ersetzen( "\\", "/" ); // Pfadangaben korrigieren
  559. for( int i = 0; i < pf.anzahlVon( "/" ); ++i ) // Jeden ordner erstellen wenn er nicht existiert
  560. {
  561. Text *t = pf.getTeilText( 0, pf.positionVon( "/", i ) );
  562. if( !t || !t->getLänge() )
  563. {
  564. if( t )
  565. t->release();
  566. continue;
  567. }
  568. if( !DateiExistiert( t->getThis() ) )
  569. mkdir( t->getText(), 0777 );
  570. t->release();
  571. if( pf.positionVon( "\\", i ) == pf.getLänge() - 1 )
  572. erst = 0;
  573. }
  574. #endif
  575. if( erst )
  576. {
  577. std::ofstream f( pf, std::ios::binary ); // Datei erstellen
  578. f.close();
  579. }
  580. return DateiExistiert( pf );
  581. }
  582. bool Framework::DateiLöschen( const char *pfad ) // Löscht die angegebene Datei
  583. {
  584. Text pfa = pfad;
  585. #ifdef WIN32
  586. pfa.ersetzen( '\\', '/' );
  587. bool ret = 0;
  588. // prüfen ob Datei existiert
  589. if( !DateiIstVerzeichnis( pfa.getThis() ) )
  590. ret = DeleteFile( pfa.getText() ) == 1; // Datei löschen
  591. else
  592. {
  593. ret = 1;
  594. Datei *dat = new Datei();
  595. dat->setDatei( pfa.getThis() );
  596. int anz = dat->getUnterdateiAnzahl();
  597. RCArray< Text > *liste = dat->getDateiListe();
  598. for( int i = 0; i < anz; ++i )
  599. {
  600. Text *pf = new Text( pfa.getText() );
  601. if( pf->getText()[ pf->getLänge() - 1 ] != '/' )
  602. pf->anhängen( "/" );
  603. pf->anhängen( liste->get( i ) );
  604. if( ret )
  605. ret = DateiLöschen( pf );
  606. else
  607. DateiLöschen( pf );
  608. }
  609. liste->release();
  610. dat->release();
  611. if( ret )
  612. ret = RemoveDirectory( pfa.getText() ) == 1;
  613. else
  614. RemoveDirectory( pfa.getText() );
  615. }
  616. return ret;
  617. #else
  618. pfa.ersetzen( '\\', '/' );
  619. bool ret = 0;
  620. // pruefen ob Datei existiert
  621. if( !DateiIstVerzeichnis( pfa.getThis() ) )
  622. ret = std::remove( pfa.getText() ) == 0; // Datei loeschen
  623. else
  624. {
  625. ret = 1;
  626. Datei *dat = new Datei();
  627. dat->setDatei( pfa.getThis() );
  628. int anz = dat->getUnterdateiAnzahl();
  629. RCArray< Text > *liste = dat->getDateiListe();
  630. for( int i = 0; i < anz; ++i )
  631. {
  632. Text *pf = new Text( pfa.getText() );
  633. if( pf->getText()[ pf->getLaenge() - 1 ] != '/' )
  634. pf->anhaengen( "/" );
  635. pf->anhaengen( liste->get( i ) );
  636. if( ret )
  637. ret = DateiLoeschen( pf );
  638. else
  639. DateiLoeschen( pf );
  640. }
  641. liste->release();
  642. dat->release();
  643. if( ret )
  644. ret = std::remove( pfa.getText() ) == 0;
  645. else
  646. std::remove( pfa.getText() );
  647. }
  648. return ret;
  649. #endif
  650. }
  651. bool Framework::DateiUmbenennen( const char *pfad_alt, const char *pfad_neu ) // Benennt die Datei um
  652. {
  653. #ifdef WIN32
  654. if( pfad_alt && pfad_neu && DateiExistiert( pfad_alt ) )
  655. {
  656. bool ret = 1;
  657. if( DateiIstVerzeichnis( pfad_alt ) )
  658. {
  659. if( !DateiExistiert( pfad_neu ) )
  660. {
  661. Text tmp = pfad_neu;
  662. tmp += "/a";
  663. DateiPfadErstellen( tmp );
  664. DateiLöschen( tmp );
  665. }
  666. Datei d;
  667. d.setDatei( pfad_alt );
  668. RCArray< Text > *list = d.getDateiListe();
  669. int anz = list->getEintragAnzahl();
  670. for( int i = 0; i < anz; i++ )
  671. {
  672. Text pf = pfad_neu;
  673. pf += "/";
  674. pf += list->z( i )->getText();
  675. Text pf_a = pfad_alt;
  676. pf_a += "/";
  677. pf_a += list->z( i )->getText();
  678. ret |= DateiUmbenennen( pf_a, pf );
  679. }
  680. d.löschen();
  681. }
  682. else
  683. {
  684. if( DateiExistiert( pfad_neu ) )
  685. return 0;
  686. }
  687. ret |= MoveFile( pfad_alt, pfad_neu ) == 1; // Datei umbenennen
  688. return ret;
  689. }
  690. return 0;
  691. #else
  692. if( pfad_alt && pfad_neu && DateiExistiert( pfad_alt ) )
  693. {
  694. bool ret = 1;
  695. if( DateiIstVerzeichnis( pfad_alt ) )
  696. {
  697. if( !DateiExistiert( pfad_neu ) )
  698. {
  699. Text tmp = pfad_neu;
  700. tmp += "/a";
  701. DateiPfadErstellen( tmp );
  702. DateiLöschen( tmp );
  703. }
  704. Datei d;
  705. d.setDatei( pfad_alt );
  706. RCArray< Text > *list = d.getDateiListe();
  707. int anz = list->getEintragAnzahl();
  708. for( int i = 0; i < anz; i++ )
  709. {
  710. Text pf = pfad_neu;
  711. pf += "/";
  712. pf += list->z( i )->getText();
  713. Text pf_a = pfad_alt;
  714. pf_a += "/";
  715. pf_a += list->z( i )->getText();
  716. ret |= DateiUmbenennen( pf_a, pf );
  717. }
  718. d.löschen();
  719. }
  720. else
  721. {
  722. if( DateiExistiert( pfad_neu ) )
  723. return 0;
  724. }
  725. ret |= rename( pfad_alt, pfad_neu ) == 1; // Datei umbenennen
  726. return ret;
  727. }
  728. return 0;
  729. #endif
  730. }
  731. bool Framework::DateiExistiert( const char *pfad ) // Prüft, ob Datei existiert
  732. {
  733. #ifdef WIN32
  734. bool ret = PathFileExists( pfad ) != 0;
  735. return ret;
  736. #else
  737. std::ifstream file( pfad );
  738. if( file.good() )
  739. return 1;
  740. return 0;
  741. #endif
  742. }
  743. bool Framework::DateiIstVerzeichnis( const char *pfad ) // prüft, ob pfad ein Verzeichnis ist
  744. {
  745. #ifdef WIN32
  746. WIN32_FIND_DATA wfd;
  747. HANDLE handle = FindFirstFile( pfad, &wfd );
  748. if( handle == INVALID_HANDLE_VALUE )
  749. return 0;
  750. FindClose( handle );
  751. return ( wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) != 0;
  752. #else
  753. std::ifstream file( pfad );
  754. if( file.good() )
  755. {
  756. std::ifstream file2( pfad, std::ios::out );
  757. if( !file2.good() )
  758. return 1;
  759. }
  760. return 0;
  761. #endif
  762. }