#ifndef Datei_H
#define Datei_H

#include "Array.h"
#include <fstream>

namespace Framework
{
	class Text; // Text.h
	class Datei; // aus dieser Datei

	namespace D_Style
	{
		const int lesen     = 0x01; // datei wird zum lesen geöffnet
		const int schreiben = 0x02; // datei wirt zum schreiben geöffnet
		const int ende      = 0x04; // setzt dateizeiger ans Ende der Datei
	}

	class Datei
	{
	private:
		int ref;
		std::fstream *stream;
		Text *pfad;
		__int64 gr;

	public:
		// Konstruktor 
		Datei();
		// Destruktor 
		~Datei();
		// nicht constant 
		void setDatei( const char *pfad ); // setzt die Datei
		void setDatei( Text *pfad );
		bool umbenennen( const char *pfad ); // benennt die Datei um und verschiebt sie eventuell
		bool umbenennen( Text *pfad );
		bool löschen(); // löscht die Datei
		bool erstellen(); // erstellt die Datei
		bool öffnen( int style ); // öffnet die Datei
		void setLPosition( __int64 pos, bool ende ); // setzt die Leseposition
		void setSPosition( __int64 pos, bool ende ); // setzt die Schreibeposition
		void schreibe( char *bytes, int län ); // schreibt bytes in datei
		void lese( char *bytes, int län ); // ließt bytes aus datei
		Text *leseZeile(); // ließt eine zeile
		void schließen(); // schließt die Datei
		// constant 
		bool istOrdner() const; // prüft, ob die Datei ein Ordner ist
		bool istOffen() const; // prüft, ob die Datei geöffnet ist
		int getUnterdateiAnzahl() const; // gibt die Anzahl der unterdateien an
		TArray< Text > *getDateiListe() const; // gibt eine Liste mit unterdateien zurück
		__int64 getGröße() const; // gibt die Größe der Datei zurück
		bool existiert() const; // prüft, ob die Datei existiert
		__int64 getLPosition() const; // gibt die Leseposition zurück
		__int64 getSPosition() const; // gibt die Schreibeposition zurück
		bool istEnde() const; // prüft, ob die Datei zu ende ist
		Text *getPfad() const; // gibt den Dateipfad zurück
		Text *zPfad() const;
		// Reference Counting 
		Datei *getThis();
		Datei *release();
	};

	// Datei Funktionen
	bool DateiPfadErstellen( Text* pfad ); // Erstellt den vollständigen Pfad mit Datei
	bool DateiLöschen( Text *pfad ); // Löscht die angegebene Datei
	bool DateiUmbenennen( Text *pfad_alt, Text *pfad_neu ); // Benennt die Datei um
	bool DateiExistiert( Text *pfad ); // Prüft, ob Datei existiert
	bool DateiIstVerzeichnis( Text *pfad ); // prüft, ob pfad ein Verzeichnis ist
}

#endif