Datei.cpp 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428
  1. #include "Datei.h"
  2. #include "Text.h"
  3. #include <direct.h>
  4. #include <Shlwapi.h>
  5. #pragma comment(lib, "Shlwapi.lib")
  6. using namespace Framework;
  7. // Inhalt der Datei Klasse aus Datei.h
  8. // Konstruktor
  9. Datei::Datei()
  10. {
  11. ref = 1;
  12. stream = 0;
  13. pfad = 0;
  14. gr = 0;
  15. }
  16. // Destruktor
  17. Datei::~Datei()
  18. {
  19. if( stream )
  20. delete stream;
  21. if( pfad )
  22. pfad->release();
  23. }
  24. // nicht constant
  25. void Datei::setDatei( const char *pfad ) // setzt die Datei
  26. {
  27. if( istOffen() )
  28. schließen();
  29. if( !this->pfad )
  30. this->pfad = new Text();
  31. this->pfad->setText( pfad );
  32. gr = 0;
  33. }
  34. void Datei::setDatei( Text *pfad )
  35. {
  36. if( istOffen() )
  37. schließen();
  38. if( !this->pfad )
  39. this->pfad = new Text();
  40. this->pfad->setText( pfad );
  41. gr = 0;
  42. }
  43. bool Datei::umbenennen( const char *pfad ) // benennt die Datei um und verschiebt sie eventuell
  44. {
  45. if( !pfad )
  46. return 0;
  47. if( DateiUmbenennen( this->pfad->getThis(), new Text( pfad ) ) )
  48. {
  49. this->pfad->setText( pfad );
  50. return 1;
  51. }
  52. return 0;
  53. }
  54. bool Datei::umbenennen( Text *pfad )
  55. {
  56. if( !this->pfad )
  57. {
  58. pfad->release();
  59. return 0;
  60. }
  61. if( DateiUmbenennen( this->pfad->getThis(), pfad->getThis() ) )
  62. {
  63. this->pfad->setText( pfad->getText() );
  64. return 1;
  65. }
  66. return 0;
  67. }
  68. bool Datei::löschen() // löscht die Datei
  69. {
  70. if( !pfad )
  71. return 0;
  72. gr = 0;
  73. return DateiLöschen( pfad->getThis() );
  74. }
  75. bool Datei::erstellen() // erstellt die Datei
  76. {
  77. if( !pfad )
  78. return 0;
  79. return DateiPfadErstellen( pfad->getThis() );
  80. }
  81. bool Datei::öffnen( int style ) // öffnet die Datei
  82. {
  83. if( !pfad )
  84. return 0;
  85. if( stream )
  86. delete stream;
  87. stream = new std::fstream();
  88. std::ios_base::openmode om = std::ios::binary;
  89. if( ( style | D_Style::lesen ) == style )
  90. om |= std::ios::in;
  91. if( ( style | D_Style::schreiben ) == style )
  92. om |= std::ios::out;
  93. stream->open( pfad->getText(), om );
  94. if( ( style | D_Style::ende ) == style )
  95. {
  96. if( ( style | D_Style::lesen ) == style )
  97. stream->seekg( 0, std::ios::end );
  98. if( ( style | D_Style::schreiben ) == style )
  99. stream->seekp( 0, std::ios::end );
  100. }
  101. if( !stream->is_open() || !stream->good() )
  102. {
  103. delete stream;
  104. stream = 0;
  105. return 0;
  106. }
  107. return 1;
  108. }
  109. void Datei::setLPosition( __int64 pos, bool ende ) // setzt die Leseposition
  110. {
  111. if( !pfad )
  112. return;
  113. if( stream )
  114. {
  115. if( ende )
  116. stream->seekg( pos, std::ios::end );
  117. else
  118. stream->seekg( pos, std::ios::beg );
  119. }
  120. }
  121. void Datei::setSPosition( __int64 pos, bool ende ) // setzt die Schreibeposition
  122. {
  123. if( !pfad )
  124. return;
  125. if( stream )
  126. {
  127. if( ende )
  128. stream->seekp( pos, std::ios::end );
  129. else
  130. stream->seekp( pos, std::ios::beg );
  131. }
  132. }
  133. void Datei::schreibe( char *bytes, int län ) // schreibt bytes in datei
  134. {
  135. if( !pfad )
  136. return;
  137. if( stream )
  138. stream->write( bytes, län );
  139. }
  140. void Datei::lese( char *bytes, int län ) // ließt bytes aus datei
  141. {
  142. if( !pfad )
  143. return;
  144. if( stream )
  145. stream->read( bytes, län );
  146. }
  147. Text *Datei::leseZeile() // ließt eine zeile
  148. {
  149. if( !pfad | !stream )
  150. return 0;
  151. if( istEnde() || !stream->good() )
  152. return 0;
  153. Text *ret = new Text( "" );
  154. __int64 län = getGröße();
  155. for( char c = 0; c != '\n' && stream->tellg() < län; )
  156. {
  157. stream->read( &c, 1 );
  158. if( c )
  159. ret->anhängen( (const char*)&c, 1 );
  160. }
  161. return ret;
  162. }
  163. void Datei::schließen() // schließt die Datei
  164. {
  165. if( !pfad )
  166. return;
  167. if( stream )
  168. stream->close();
  169. delete stream;
  170. stream = 0;
  171. }
  172. // constant
  173. bool Datei::istOrdner() const // prüft, ob die Datei ein Ordner ist
  174. {
  175. if( !pfad )
  176. return 0;
  177. return DateiIstVerzeichnis( pfad->getThis() );
  178. }
  179. bool Datei::istOffen() const // prüft, ob die Datei geöffnet ist
  180. {
  181. if( !pfad )
  182. return 0;
  183. if( stream )
  184. return stream->is_open() && stream->good();
  185. return 0;
  186. }
  187. int Datei::getUnterdateiAnzahl() const // gibt die Anzahl der unterdateien an
  188. {
  189. if( !pfad )
  190. return 0;
  191. if( !DateiIstVerzeichnis( pfad->getThis() ) )
  192. return 0;
  193. int ret = 0;
  194. HANDLE fHandle;
  195. WIN32_FIND_DATA wfd;
  196. Text *stxt = new Text( pfad->getText() );
  197. stxt->ersetzen( '/', '\\' );
  198. if( stxt->positionVon( '\\' ) == stxt->getLänge() - 1 )
  199. stxt->anhängen( "*" );
  200. else
  201. stxt->anhängen( "\\*" );
  202. fHandle=FindFirstFile( stxt->getText(), &wfd );
  203. stxt->release();
  204. FindNextFile( fHandle, &wfd );
  205. while( FindNextFile( fHandle, &wfd ) )
  206. ret++;
  207. FindClose( fHandle );
  208. return ret;
  209. }
  210. TArray< Text > *Datei::getDateiListe() const // gibt eine Liste mit unterdateien zurück
  211. {
  212. if( !pfad )
  213. return 0;
  214. if( !DateiIstVerzeichnis( pfad->getThis() ) )
  215. return 0;
  216. HANDLE fHandle;
  217. WIN32_FIND_DATA wfd;
  218. Text *stxt = new Text( pfad->getText() );
  219. stxt->ersetzen( '/', '\\' );
  220. if( stxt->positionVon( '\\' ) == stxt->getLänge() - 1 )
  221. stxt->anhängen( "*" );
  222. else
  223. stxt->anhängen( "\\*" );
  224. fHandle=FindFirstFile( stxt->getText(), &wfd );
  225. stxt->release();
  226. FindNextFile( fHandle, &wfd );
  227. TArray< Text > *ret = new TArray< Text >();
  228. int count = 0;
  229. while( FindNextFile( fHandle, &wfd ) )
  230. {
  231. Text *txt = new Text( wfd.cFileName );
  232. ret->add( txt, count, 0 );
  233. count++;
  234. }
  235. FindClose( fHandle );
  236. return ret;
  237. }
  238. __int64 Datei::getGröße() const // gibt die Größe der Datei zurück
  239. {
  240. if( !pfad )
  241. return 0;
  242. if( gr )
  243. return gr;
  244. if( !stream || !istOffen() )
  245. {
  246. std::fstream *stream = new std::fstream();
  247. stream->open( pfad->getText(), std::ios::binary | std::ios::in );
  248. __int64 tmp = stream->tellg();
  249. stream->seekg( 0, std::ios::end );
  250. __int64 ret = stream->tellg();
  251. stream->seekg( tmp, std::ios::beg );
  252. stream->close();
  253. delete stream;
  254. __int64 *größe = (__int64*)&gr;
  255. *größe = ret;
  256. return ret;
  257. }
  258. __int64 tmp = stream->tellg();
  259. stream->seekg( 0, std::ios::end );
  260. __int64 ret = stream->tellg();
  261. stream->seekg( tmp, std::ios::beg );
  262. __int64 *größe = (__int64*)&gr;
  263. *größe = ret;
  264. return ret;
  265. }
  266. bool Datei::existiert() const // prüft, ob die Datei existiert
  267. {
  268. if( !pfad )
  269. return 0;
  270. return DateiExistiert( pfad->getThis() );
  271. }
  272. __int64 Datei::getLPosition() const // gibt die Leseposition zurück
  273. {
  274. if( !stream )
  275. return 0;
  276. return stream->tellg();
  277. }
  278. __int64 Datei::getSPosition() const // gibt die Schreibeposition zurück
  279. {
  280. if( !stream )
  281. return 0;
  282. return stream->tellp();
  283. }
  284. bool Datei::istEnde() const // prüft, ob die Datei zu ende ist
  285. {
  286. if( !stream )
  287. return 1;
  288. __int64 i = getGröße();
  289. return stream->tellg() >= i;
  290. }
  291. Text *Datei::getPfad() const // gibt den Dateipfad zurück
  292. {
  293. return pfad ? pfad->getThis() : 0;
  294. }
  295. Text *Datei::zPfad() const
  296. {
  297. return pfad;
  298. }
  299. // Reference Counting
  300. Datei *Datei::getThis()
  301. {
  302. ref++;
  303. return this;
  304. }
  305. Datei *Datei::release()
  306. {
  307. ref--;
  308. if( !ref )
  309. delete this;
  310. return 0;
  311. }
  312. // Datei Funktionen
  313. bool Framework::DateiPfadErstellen( Text* pfad ) // Erstellt eine Datei in dem Pfad
  314. {
  315. pfad->ersetzen( "//", "\\" ); // Pfadangaben korrigieren
  316. pfad->ersetzen( "/", "\\" );
  317. for( int i = 0; i < pfad->anzahlVon( "\\" ); i++ ) // Jeden ordner erstellen wenn er nicht existiert
  318. {
  319. Text *t = pfad->getTeilText( 0, pfad->positionVon( "\\", i ) );
  320. if( !DateiExistiert( t->getThis() ) )
  321. _mkdir( t->getText() );
  322. t->release();
  323. }
  324. std::ofstream f( pfad->getText(), std::ios::binary ); // Datei erstellen
  325. f.close();
  326. return DateiExistiert( pfad );
  327. }
  328. bool Framework::DateiLöschen( Text *pfad ) // Löscht die angegebene Datei
  329. {
  330. pfad->ersetzen( '\\', '/' );
  331. bool ret = 0;
  332. if( pfad )
  333. { // prüfen ob Datei existiert
  334. if( !DateiIstVerzeichnis( pfad->getThis() ) )
  335. ret = DeleteFile( pfad->getText() ) == 1; // Datei löschen
  336. else
  337. {
  338. ret = 1;
  339. Datei *dat = new Datei();
  340. dat->setDatei( pfad->getThis() );
  341. int anz = dat->getUnterdateiAnzahl();
  342. TArray< Text > *liste = dat->getDateiListe();
  343. for( int i = 0; i < anz; i++ )
  344. {
  345. Text *pf = new Text( pfad->getText() );
  346. if( pf->getText()[ pf->getLänge() - 1 ] != '/' )
  347. pf->anhängen( "/" );
  348. pf->anhängen( liste->get( i, 0 ) );
  349. if( ret )
  350. ret = DateiLöschen( pf );
  351. else
  352. DateiLöschen( pf );
  353. }
  354. liste->release();
  355. if( ret )
  356. ret = RemoveDirectory( pfad->getText() ) == 1;
  357. else
  358. RemoveDirectory( pfad->getText() );
  359. dat->release();
  360. }
  361. pfad->release();
  362. }
  363. return ret;
  364. }
  365. bool Framework::DateiUmbenennen( Text *pfad_alt, Text *pfad_neu ) // Benennt die Datei um
  366. {
  367. if( pfad_alt && pfad_neu )
  368. {
  369. bool ret = 0;
  370. if( DateiExistiert( pfad_alt->getThis() ) && !DateiExistiert( pfad_neu->getThis() ) ) // prüfen ob Dateien existieren
  371. ret = MoveFile( pfad_alt->getText(), pfad_neu->getText() ) == 1; // Datei umbenennen
  372. pfad_alt->release();
  373. pfad_neu->release();
  374. return ret;
  375. }
  376. return 0;
  377. }
  378. bool Framework::DateiExistiert( Text *pfad ) // Prüft, ob Datei existiert
  379. {
  380. bool ret = PathFileExists( pfad->getText() ) != 0;
  381. pfad->release();
  382. return ret;
  383. }
  384. bool Framework::DateiIstVerzeichnis( Text *pfad ) // prüft, ob pfad ein Verzeichnis ist
  385. {
  386. WIN32_FIND_DATA wfd;
  387. HANDLE handle = FindFirstFile( pfad->getText(), &wfd );
  388. pfad->release();
  389. if( handle == INVALID_HANDLE_VALUE )
  390. return 0;
  391. FindClose( handle );
  392. return ( wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) != 0;
  393. }