{
  Autor            : Michael Springwald
  Erstellung Datum : 06.06.2005
  Updatet          : 30.04.2006
}

unit Tools_File;

interface

uses Classes,SysUtils,inifiles,Tools,dialogs,Graphics,FileCtrl;

  // Startet eine anwendung
//  procedure RunApp(f:TFileName;param:string;handle:hwnd);
  // Splitet einen Dateipfad in zwei hälften
  function ExtractFilePfad1(Pfad:String):String;
  
  // Prüft ob es die erweiterung schon im Dateiname gibt, wenn ja wird nur der dateinamen
  // Zurück geben, wenn nicht: Dateiname + Erweiterung
  function AddExt(FileName:TFileName; Ext:String):String;

  // Erstelle eine leer Datei
  procedure CreateFile1(FileName:TFileName);
  // Löscht gefüllt verzeichnise
//  function Deltree(dir: string): Boolean;
  
//  function ReadDir(Path, Mask:string; ShowPath: boolean; mitExt,mitData:Boolean): TStringlist;
  // Liefrt das exe verzeichnis
  function GetExeDir(isS:Boolean = False):String;

  // Wenn exedir vorkommt wird es durch das exedir verzeichnis ersetzt
  function GetDir(dir:string):string;

  // gibt Datei infos zurück
//  function GetFileInfo(FileName,ch:String):String;

  // Schaut in der ExtList nach ob, es sich um eine erlaubte Dateiendung handelt oder nicht
  function FileNameInTheList(FileName, extList:String):boolean;

  // Liefert alle verzeichnise einschließnd unterverzeichnise eines verzeichnis
  procedure GetAllFiles(Path, ExtMask: String; List: TStrings;SubFolder: Boolean);

  //  Liefert die genaue datei größe als Bytes
  function GetFileSize1(const AFileName: String): INT64;

  // Prüft ob in bestimmtens zeichem im im Dateinamen vorhanden ist
  function IsChar(const AFilename: string; ch: string): String; overload;

  // Prüft ob in bestimmtens zeichem im im Dateinamen vorhanden ist
  function IsChar(const AFilename: string; ch: char): String; overload;

  // Prüft ob in den Dateinamen ein ein \ ist und wenn nicht, fügt er es hinzu
  function CheckBackSlash(const AFilename: String): String;

  // List ein verzeichnis in eine TStringList und pack einige Daten hinzu(nach wunsch)
//  function GetFileSizeDir(Path, Mask:string; ShowPath: boolean; isdata:Boolean): TStringlist;

  // Gibt einen folgendes zurück(als beispiel: 18 KB
  function FormatFileSize(Size: INT64): string;
  // Ließt einen String aus einer ini datei
  function  ReadIni(FileName,Sektion,ident,fehler:String) :String;

  // Schreibt einen String in eine Ini Datei
  procedure WriteIni(FileName,Sektion,ident,WriteText:String);

  // prüft ob es eine bestimmte ini Sektion schon gibt oder nicht
  function isIniSek(FileName:TFileName; Sek:String):boolean;

  // Löscht alle dateien im verzeichnis
//  procedure DeleteFiles(directory: string);

  // Löscht eine Datei
  function DelFile(FileName:String):Boolean;

  // Wandelt eine BMP zu einer Jpeg um
//  procedure BmpToJpeg(const Filename: String);

  // Schießt ein Bild vom Aktivien fenster
//  function FormularSaveScreenShot(FileName: String; h : hWnd): Boolean;
  // Schneidet aus dir da was in dir1 und dir2 steht ab
  function ChagenDir(dir,dir1,dir2,char:String):String;
  // Ersetzt das angeben zeichen durch die angeben verzeichnise
  function ReplaceDir(dir, chr,newDir,newDir1:String):String;
  // Past den FileName ob da z.b. eine Klammer auf steht
  function PasteFileName(FileName:TFileName):String;
  // List aus der aktellen datei die icon eigenschaft aus(offentlich)
  // Gibt ein Realtiv verzeichnis zurück
  function GetRealtiv(dir1,dir2:String):String;
  // Prüft einen Dateinamen auf gültigkeit
//  function IsFileName(FileName: String): Boolean;
  function RandomID(fileName:TFileName; c:Integer):String;
  function RandomID2(count:Integer):string;
  // gibt zurück ob sich bestimmter eintrag im verzeichnis befindet
  function GetAnderDir(dir,mask:String;attri:Integer):boolean;
  // gibt mir die letzte verzeichnise ebene zurück(C:\test1\test1 = test1)
  function GetPrvDir(dir:String):String;
  // macht aus C:\verzeichnis1\verzeichnis2 c:\verzeichnis1\
  function GetPrvDir1(dir:String):String;
//  function GetFilesInDirectory(Directory: String; const Mask: String):boolean;
  function GetFilesInDirectory(ADirectory: string; AMask: String; ARekursiv: Boolean;notMask:String = ''):Boolean;
  // Gibt zurück ob sich einträge aus der angeben liste in einem verzeichnis befindet
//  function GetAnderItem(dir:String;extList:String):Boolean;
//  function IstErweiterungImOrdner(Pfad, Erweiterung: String): Boolean;
//  function FileCount(const dir, masks: String): Integer;
implementation

uses TypInfo, StdCtrls;


// geht eine verzeichnis ebene nach unten
function GetPrvDir(dir:String):String;
var
  str:String;
  startx,endx,x,m:Integer;
begin
  startx:=-1; endx:=-1;str:='';
  if dir[Length(dir)] = '\' then
    m:=1
  else
    m:=0;
  endx:=(Length(dir)-1)-m;
  for x:=endx-1 downto 1 do begin
    if dir[x] = '\' then begin
      startx:=x;
      break;
    end;
  end;
  str:=copy(dir,startx+1,endx-startx);
  result:=str;
end;

// 
function GetPrvDir1(dir:String):String;
var
  str:String;
  startx,endx,x,m:Integer;
begin
  startx:=-1; endx:=-1;str:='';
  if dir[Length(dir)] = '/' then
    m:=1
  else
    m:=0;
  startx:=(Length(dir))-m;
  for x:=startx downto 1 do begin
    if dir[x] = '/' then begin
      endx:=x;
      break;
    end;
  end;
  Delete(dir,endx,startx-(endx-1));
  result:=dir;
end;

function GetAnderDir(dir,mask:String;attri:Integer):boolean;
var
  sr:TSearchRec;
  t:Integer;
begin
  t:=0;
  RESULT := False;  //<<--vorbelegen
  if FindFirst(Dir+'*', faDirectory,SR) = 0 then begin //<<--faDirectory sollte hier die Lösung sein
    repeat
      if (sr.Name <> '..') and (sr.name <> '.') and ((sr.Attr and faDirectory) = faDirectory) then begin
        RESULT :=true;
        break;
      end
    until RESULT or (FindNext(sr) <> 0); //<--Abbruch bei RESULT=True oder wenn Verzeichnis komplett durch
  end;
  FindClose(sr);
end;


{function FileCount(const dir, masks: String): Integer;
begin
  with TFileListBox.CreateParented(HWND(-3)) do
  try
    Mask := masks;
    Directory := IncludeTrailingPathDelimiter(dir);

    FileType := [ftArchive];
    Result := Items.Count;
  finally
    Free;
  end;
end; }

{function IstErweiterungImOrdner(Pfad, Erweiterung: String): Boolean;
var
  lpFindFileData: TWIN32FindData;
  hFindFile: THandle;
begin
  Result := False;
  if (Erweiterung = '') or (Pfad = '') then Exit;
  //if (Erweiterung[1] <> '.') then Erweiterung := '.' + Erweiterung;
  Pfad := IncludeTrailingBackslash(Pfad);
  Pfad := Pfad + '*.*';
  ZeroMemory(@lpFindFileData, sizeof(TWIN32FindData));
  hFindFile := FindFirstFile(PChar(PFad), lpFindFileData);
  if (hFindFile <> 0) and (hFindFile <> INVALID_HANDLE_VALUE) then
  begin
    repeat
      with lpFindFileData do
      begin
        if (dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY = 0) then
        begin
          if (String(cFilename) <> '.') and (String(cFilename) <> '..') then
          begin
            if UpperCase(Erweiterung) = UpperCase(ExtractFileExt(String(cFilename))) then
            begin
              Result := True;
              break;
            end;
          end;
        end;
      end;
    until not Windows.FindNextFile(hFindFile, lpFindFileData);
    Windows.FindClose(hFindFile);
  end;
//end;

}
procedure GetAllFilesM(Path, Mask: String; List: TStrings;
  SubFolder: Boolean;notMask:String);
var
  Attrib, k: Integer;
  Search: TSearchRec;
begin
  Attrib := faArchive + faReadOnly + faHidden;

  if Path[Length(Path)] <> '\' then Path := Path + '\';

  with TStringList.Create do
  try
    QuoteChar:='.';
//    CommaText := Mask;
    DelimitedText:= Mask;
    for k := 0 to Count - 1 do
    if FindFirst(Path + Strings[k], Attrib, Search) = 0 then
      repeat
        if  ((Pos(UpperCase(ExtractFileExt(Search.name)),notMask) = 0) or (notMask = '')) then begin
          List.Add(AnsiUpperCase(Path + Search.Name));
          exit;
        end;
      until FindNext(Search) <> 0;

    FindClose(Search);
  finally Free end;

  if SubFolder then
  begin
    if FindFirst(Path + '*.*', faDirectory, Search) = 0 then
    begin
      repeat
        if ((Search.Attr and faDirectory) = faDirectory) and  (Search.Name[1] <> '.') then begin
          GetAllFilesM(Path + Search.Name, Mask, List, SubFolder,notMask);
        end;
      until FindNext(Search) <> 0;

      FindClose(Search);
    end;
  end;
end; {Popov}

function GetFilesInDirectory(ADirectory: string; AMask: String; ARekursiv: Boolean;notMask:String = ''):Boolean;
var
  extList:TStringList;

begin
  extList:=TStringList.Create;
  AMask:=StringReplace(aMask,'.',',*.',[rfReplaceAll	]);
  Delete(amask,1,1);
  Delete(amask,(Length(ADirectory)-1)-2,3);

  GetAllFilesM(ADirectory,amask,extlist,ARekursiv,notMask);

  if extlist.count > 0 then
    result:=true
  else
    result:=False;
end;


function RandomID2(count:Integer):string;
const
  noChar = ':\-._';
var
  x:Integer;
  s:String;
  z:string;
begin
  s:='';z:='';
  for x:=1 to count do begin
    z:=intTostr(random(255)+1);
    z:=IntTostr(ord(char(z[1])));

    if Pos(z,noChar) > 0 then begin
      repeat
        z:=intTostr(random(255)+1);
        z:=IntTostr(ord(char(z[1])));
      until Pos(z,noChar) = 0;
    end;
    if z <> '' then
    s:=s + IntTostr(ord(StrToInt(z)));
  end;
  result:=s;
end;

function RandomID(fileName:TFileName; c:Integer):String;
const
  noChar = ':\-._';
var
  x:Integer;
  s:String;
  z:String;
begin
  s:='';z:='';
  for x:=1 to c do begin
    z:=fileName[random(StrLen(Pchar(FileName)))+1];
    if Pos(z,noChar) > 0 then begin
      repeat
        z:=fileName[random(StrLen(Pchar(FileName)))+1];
      until Pos(z,noChar) = 0;
    end;

    s:=s + z;
  end;
  result:=s;
end;

{function IsFileName(FileName: String): Boolean;
const ForbiddenChars = ['"', '<', '>', '|', '*', '/', '\', '?']; // verbotene Zeichen

const ForbiddenNames: Array[0..22] of String[6] = ('AUX', 'NUL', 'PRN' ,'CON', 'CLOCK$',  // verbotene Namen
'COM1', 'COM2', 'COM3', 'COM4', 'COM5', 'COM6', 'COM7', 'COM8', 'COM9',
'LPT1', 'LPT2', 'LPT3', 'LPT4', 'LPT5', 'LPT6', 'LPT7', 'LPT8', 'LPT9');

var i: Integer;
var p: PChar;
var FileNameU: String;
begin
Result := False;

  if FileName <> '' then // Name darf nicht leer sein
  begin
    i := Length(FileName);

    if FileName[i] <> '.' then // letze Zeichen darf kein Punkt sein
    begin
      p := Pointer(FileName);

      repeat if p^ in ForbiddenChars then
        Exit;
        inc(p);
      until p^ = #0;

      if (i < 7) and (i > 2) then
      begin
        FileNameU := UpperCase(FileName);
        for i := 0 to High(ForbiddenNames) do
        begin
          if CompareStr(ForbiddenNames[i], FileNameU) = 0 then
          Exit;
        end;
      end;

    Result := True;
  end;
  end;
end;   }

function GetIndexToken(index:Integer;str:String):string;
var
  x,i:Integer;
begin
  for i:=index to (Length(str)-1) do begin
    if str[i] = '\' then begin
      x:=i;
      break;
    end;
  end;
  ShowMEssage(copy(str,index,x)); 
  result:=copy(str,index,x);
end;

function GetRealtiv(dir1,dir2:String):String;
var
  x:Integer;
  str,str1:String;
begin
//    ShowMessage(dir1);
  for x:=1 to (Length(dir1)-1) do begin
    if x = 4 then str:='\'+dir1[x];
    if x > 4 then str:=str+dir1[x];

  end;
  result:=str;
end;



{function FileIcon(FileName: String): TIcon;
var FileInfo: TSHFileInfo; AIcon: TIcon;
begin
  FillChar(FileInfo,SizeOf(FileInfo),#0);
  SHGetFileInfo(PChar(FileName),0,FileInfo,SizeOf(FileInfo),SHGFI_ICON or SHGFI_LARGEICON);
  AIcon:=TIcon.Create;
  Try
    AIcon.Handle:=FileInfo.HIcon;
    AIcon.Transparent:=False;
  Except end;
  Result:=AIcon;
end; }

//procedure RunApp(f:TFileName;param:string;handle:hwnd);
//begin
//  ShellExecute(handle, 'open' ,PChar(f), nil, PChar(param), SW_SHOWMINIMIZED);
//end;

function PasteFileName(FileName:TFileName):String;
var
  str,str1:String;
  r,x:Integer;
begin
  str:='';
  Randomize;
  if Pos('|',FileName) > 0 then
    str:=GetToken(FileName,'|',random(NumToken(FileName,'|'))+1)
  else
    str:=FileName;

  x:=Pos('(',str);
  if x > 0 then begin
    str1:=GetToken(GetToken(str,'(',2),')',1);

    if Pos('-',str1) > 0 then
      str1:=IntToStr(RandomRange(StrToInt(GetToken(str1,'-',1)),StrToInt(GetToken(str1,'-',2))))
    else
      str1:=IntToStr(Random(StrToInt(str1))+1);

    str:=Copy(str,0,x-1) + str1 + Copy(str,Pos(')',str)+1,Length(str));
  end;
  result:=str;
end;

function ReplaceDir(dir, chr,newDir,newDir1:String):String;
var
  str:String;
  x:Integer;
begin
  str:='';
  x:=Pos(chr,dir);
  if x > 0 then begin
    str:=copy(dir,(x+length(chr))+1, length(dir));
    result:=NewDir + str;
  end;
  if str = '' then begin
    result:=NewDir1 + dir;
  end;


end;

function ChagenDir(dir,dir1,dir2,char:String):String;
var
  str:String;
  x:Integer;
begin

  if Pos(dir1,dir) > 0 then
    str:='~' + Copy(dir,length(dir1),length(dir))
  else begin
    if Pos(dir2,dir) > 0 then
      str:=Copy(dir,length(dir2)+1,length(dir))
  end;

  result:=str;
end;

function ExtractFilePfad1(Pfad:String):String;
begin
end;

function AddExt(FileName:TFileName; Ext:String):String;
begin
  if Pos(ext,FileName) = 0 then
    result:=FileName+Ext
  else
    result:=FileName;
end;

procedure CreateFile1(FileName:TFileName);
var
  F:TStringList;
begin
  F:=TStringList.Create;
  f.SaveToFile(FileName);
  f.Free;
end;

{¬function Deltree( Dir: string): Boolean;
procedure Del(const Dir: string);
var
  SearchRec: TSearchRec;
  Found: Cardinal;
begin
  FindFirst( Dir + '*.*', faAnyFile, SearchRec);
  FindNext( SearchRec);
  Found := FindNext( SearchRec);
  while ( Found = 0) do
  begin
   SetFileAttributes( PChar(Dir + SearchRec.Name), FILE_ATTRIBUTE_NORMAL);
   if (SearchRec.Attr and faDirectory >0) then Del(Dir + SearchRec.Name + '\')
   else DeleteFile(PChar(Dir + SearchRec.Name));
   Found := FindNext(SearchRec);
  end;
  FindClose( SearchRec);
//  RemoveDirectory(pchar(dir));
end;
begin
  Dir:= IncludeTrailingPathDelimiter( Dir);
  Result := True;
  if DirectoryExists(Dir) then
  begin
    Del(Dir);
    if DirectoryExists(Dir) then Result := False;
  end
  else Result := False;
end;   }

{procedure BmpToJpeg(const Filename: String);
var
jpeg: TJPEGImage;
bmp: TBitmap;
begin
bmp:=TBitmap.Create;
try
   bmp.LoadFromFile(Filename);
   jpeg:=TJPEGImage.Create;
   try
     jpeg.Assign(bmp);
     jpeg.SaveToFile(Filename);
   finally
     jpeg.free;
   end;
finally
   bmp.free;
end;
end;  }
{
function FormularSaveScreenShot(FileName: String; h : hWnd): Boolean;
var
  Rec: TRect;
  iWidth, iHeight: Integer;
begin
  with TBitmap.Create do try
    GetWindowRect(h, Rec);

    iWidth  := Rec.Right - Rec.Left;
    iHeight := Rec.Bottom - Rec.Top;

    Width := iWidth;
    Height := iHeight;

    BitBlt(Canvas.Handle, 0, 0, iWidth, iHeight, GetWindowDC(h), 0, 0, SRCCOPY);

    Result := True;

    try SaveToFile(Filename) except Result := False end;
  finally
    ReleaseDC(h, GetWindowDC(h));
    Free;
  end;
//  BmpToJpeg(FileName );
//end}


function DelFile(FileName:String):Boolean;
begin
//  result:=DeleteFile(PChar(FileName))
end;

{function GetFileInfo(FileName,ch:String):String;
var
  CFTime, EFTime, RFTime:_FileTime;
  FileInfo:TSearchRec;
  
begin

   FindFirst(FileName,faAnyFile,FileInfo);

   FileTimeToLocalFileTime(FileInfo.FindData.ftCreationTime, CFTime);
   FileTimeToLocalFileTime(FileInfo.FindData.ftLastWriteTime, EFTime);
   FileTimeToLocalFileTime(FileInfo.FindData.ftLastAccessTime, RFTime);
   
//   result:= DateTimeToStr(FileTimeToDateTime(CFTime)) + ch + DateTimeToStr(FileTimeToDateTime(EFTime)) + ch + DateTimeToStr(FileTimeToDateTime(RFTime));
end;    }

procedure GetAllFiles(Path, ExtMask: String; List: TStrings;
  SubFolder: Boolean);
var
  Attrib, i: Integer;
  Search: TSearchRec;
begin
  Attrib := faArchive + faReadOnly + faHidden;

  if Path[Length(Path)] <> '\' then Path := Path + '\';

  with TStringList.Create do
  try
    CommaText := ExtMask;

    for i := 0 to Count - 1 do
    if FindFirst(Path + '*.' + Strings[i]+#0, Attrib, Search) = 0 then
      repeat
        if SubFolder = True then
          List.Add(Path + Search.Name)
        else
          List.Add(Search.Name)
      until FindNext(Search) <> 0;

  //  FindClose(Search);
  finally Free end;

  if SubFolder then
  begin
    if FindFirst(Path + '*.*', faDirectory, Search) = 0 then
    begin
      repeat
        if ((Search.Attr and faDirectory) = faDirectory) and
          (Search.Name[1] <> '.') then
          GetAllFiles(Path + Search.Name, ExtMask, List, SubFolder);
      until FindNext(Search) <> 0;

      FindClose(  Search);
    end;
  end;
end;

function IsChar(const AFilename: string; ch: char): String;
begin  
  if(length(AFilename) > 0) and (AFileName[length(AFilename)] <> ch) then  
    Result := AFilename + ch  
  else  
    Result := AFilename;  
end;  

function IsChar(const AFilename: string; ch: string): String;
begin  
  if(length(AFilename) > 0) and (pos(ch,AFilename) = 0 ) then
    Result := AFilename + ch
  else
    Result := AFilename;  
end;

function CheckBackSlash(const AFilename: String): String;
begin
  if aFileName <> '' then
    Result   := IsChar(AFileName,'\');
end;

function FormatFileSize(Size: INT64): string;
var
  Byte, Ausgabe: string;
begin
  Byte := ' Byte';
  result       := IntToStr(Size);

  if Size >= 10737418240 then
  begin
    Ausgabe := CurrToStrF((Size / (1024 * 1024 * 1024)), ffNumber, 2);
    Byte := ' GB';
  end
  else
  if Size >= 1048576 then
  begin
    Ausgabe := CurrToStrF((Size / (1024 * 1024)), ffNumber, 2);
    Byte := ' MB';
  end
  else
  begin
    if Size >= 1024 then
    begin
      Ausgabe := CurrToStrF((Size / 1024), ffNumber, 2);
      Byte := ' KB';
    end
    else
      Ausgabe := IntToStr(Size);
  end;
  result := Ausgabe + Byte;
end;


function FileNameInTheList(FileName, extList:String):Boolean;
var
  t:Boolean;
begin
  t:=False;
  if extList <> '' then begin
    if Pos(UpperCase(ExtractFileExt(FileName)),extList) > 0 then t:=True;
  end
  else
    t:=True;
    
  result:=t;
end;

function GetFileSize1(const AFileName: String): INT64;
//Var
//  tmpW32FD : WIN32_FIND_DATA;
//  FindHandle : THandle;
Begin
{ FindHandle := FindFirstFile(PCHAR(AFileName), tmpW32FD);
  If FindHandle <> INVALID_HANDLE_VALUE Then
  Begin
    Result := (tmpW32FD.nFileSizeHigh Shl 32) +
      tmpW32FD.nFileSizeLow;
//    FindClose(FindHandle);
  End Else
    Result := 0;}
end;

{function ReadDir(Path, Mask:string; ShowPath: boolean; mitExt,mitData:Boolean): TStringlist;
  function GetFilename(Dateinamen:String):String;
  begin
    if mitExt = true then
      result:=Dateinamen
    else
      result:=SplitStr(Dateinamen,'.'
  end;

var
  SL: TStringList;
  SRec: TSearchRec;
  str:String;
begin
  SL := TStringList.Create;
  FindFirst(Path + Mask + #0, not faDirectory, SRec);
 if mitData = True then
    str:='!' + IntToStr(SRec.Size) + '!' + GetFileInfo(Path + SRec.Name,';')
 else
   str:='';
      
  if ShowPath then
    SL.Add(Path + GetFilename(SRec.Name) + str)
  else
    SL.Add(GetFilename(SRec.Name) + str);

  while FindNext(SRec) = 0 do
    if ShowPath then
      SL.Add(Path + GetFilename(SRec.Name) + str)
    else
      SL.Add(GetFilename(SRec.Name)+ str);

  findClose(SRec);
  Result := SL;
end;  }


function GetFileSizeDir(Path, Mask:string; ShowPath: boolean;isdata:Boolean): TStringlist;
var
  SL: TStringList;
  SRec: TSearchRec;
  str:String;
begin
  SL := TStringList.Create;
  FindFirst(Path + Mask + #0, not faAnyFile, SRec);

//  if isdata = True then
//    str:='!' + IntToStr(SRec.Size) + '!' + GetFileInfo(Path + SRec.Name,';');

  if SRec.Name <> '' then begin
    if ShowPath then
      SL.Add(Path + SRec.Name + str)
    else
      SL.Add(SRec.Name  + str);
  end;

  while FindNext(SRec) = 0 do begin
//    if isdata = True then
//       str:='!' + IntToStr(SRec.Size) + '!' + GetFileInfo(Path + SRec.Name,';');

    if ShowPath then
      SL.Add(Path + SRec.Name  + str)
    else
      SL.Add(SRec.Name  + str);
  end;

//  FindClose(SRec);
  Result := SL;
end;

{procedure DeleteFiles(directory: string);
var fos: TSHFileOpStruct;
begin
  ZeroMemory(@fos, SizeOf(fos));
  with fos do begin
    wFunc := FO_DELETE;
    fFlags := FOF_SILENT or FOF_NOCONFIRMATION;
    pFrom := PChar(directory+#0);
  end;
  if (SHFileOperation(fos)<>0) then
    MessageBox(0, 'Fehler beim Löschen', nil, MB_ICONERROR);
end;  }

function isIniSek(FileName:TFileName; Sek:String):boolean;
var
  inifile:TInifile;
begin
  IniFile:=TiniFile.Create(FileName);
  result:=IniFile.SectionExists(Sek);
  inifile.Free;
end;


function ReadIni(FileName,Sektion,ident,fehler:String):String;
var
  inifile1:TIniFile;
begin
  if FileExists(FileName) = True then begin
    IniFile1:=TiniFile.Create(FileName);
    if IniFile1.ValueExists(Sektion,ident) = True then
      Result:=Inifile1.ReadString(Sektion,ident,fehler)
    else
      result:='';
  end
  else
    result:='';

  IniFile1.Free;
end;

procedure WriteIni(FileName,Sektion,ident,WriteText:String);
var
  inifile:TInifile;
begin
  IniFile:=TiniFile.Create(FileName);
  Inifile.WriteString(Sektion,ident,WriteText);
  inifile.Free;
end;

function GetExeDir(isS:Boolean = False):String;
begin
  if isS = False then
    result:=ExtractFilePath(ParamStr(0))
  else
    result:=ExtractFileDir(ParamStr(0))  
end;
                               
function GetDir(dir:string):string;
begin
  if pos('exedir',dir) > 0 then
  result:=GetExeDir+GetToken(dir,'\',2) + '\';
end;

end.
