Datei.cpp 18 KB

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