Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   meminifiles, inifiles , einlesen scheitert (https://www.delphipraxis.net/209072-meminifiles-inifiles-einlesen-scheitert.html)

bernhard_LA 21. Okt 2021 13:54

meminifiles, inifiles , einlesen scheitert
 
ich habe schon wieder ein Probleme beim Einlesen von *.ini files,
der Code wurde auf TMemInifile umgestellt, allerdings das Einlesen klappt nur bei ~50 % alles Infiles,
Im Notepad sehen alle Files
sinnvoll aus, die Files werden aus einer Delphi Anwendung heraus geschrieben mit der Klasse TInifile.



Delphi-Quellcode:
function ReadINIString(filename: string; SectionStr: string;
  IdentStr: String): string;
var
  IniFile: TMemIniFile;
begin
  if FileExists(filename) then
  begin
    IniFile := TMemIniFile.Create(filename);
    try
      Result := IniFile.ReadString(SectionStr, IdentStr, '<none>');
    finally
      IniFile.Free;
    end;
  end
  else
  begin
    Result := '<no file found>';
  end;
end;


Frage : hat jemand eine Anwendung / Code mit der ich eine *.ini Datei prüfen kann ob sie erfolgreich gelesen werden kann ?

Uwe Raabe 21. Okt 2021 14:00

AW: meminifiles, inifiles , einlesen scheitert
 
Zitat:

Zitat von bernhard_LA (Beitrag 1496411)
allerdings das Einlesen klappt nur bei ~50 % alles Infiles,

Dann häng doch mal so eine Datei an, die nicht eingelesen wird.

bernhard_LA 21. Okt 2021 14:17

AW: meminifiles, inifiles , einlesen scheitert
 
leider unmöglich ... Firmen interne Daten :-(

Der schöne Günther 21. Okt 2021 14:20

AW: meminifiles, inifiles , einlesen scheitert
 
Ini-Dateien sind echt kein Hexenwerk, das TMemIniFile ist im Endeffekt nur eine StringList. Schau doch im Debugger einfach ob er den Kram richtig einliest oder ob z.B. beim Encoding was quer hängt.

venice2 21. Okt 2021 14:25

AW: meminifiles, inifiles , einlesen scheitert
 
Vor allem prüfe das Daten Format mit dem die Ini Dateien geschrieben wurden.
Mit UltraEdit geht das gut. Steht unten in der Status Zeile.

DOS, UNIX oder what ever

Delphi.Narium 21. Okt 2021 14:42

AW: meminifiles, inifiles , einlesen scheitert
 
Wie groß sind die Dateien?

5 Zeilen?
50 Zeilen?
5000 Zeilen?
50000000 Zeilen?

Dateigröße in Byte, KByte, ... TByte?

Zeichensatz:
Schreiben OEM Lesen UTF8?
Schreiben ANSI Lesen UTF8?
...
Schreiben UTF8 Lesen ANSI?
Schreiben UTF8 Lesen OEM?

Oder was auch immer?

Klappt es einfach nur nicht oder gibt es auch 'ne Fehlermeldung?

Wo ist die Fehlerbehandlung? Außerhalb von ReadINIString?

Würde da mal noch ein Try Except end mit einbauen.

BerndS 21. Okt 2021 15:38

AW: meminifiles, inifiles , einlesen scheitert
 
Bis zu einer bestimmten Version wurde beim Einlesen abgebrochen, wenn in der Datei /Stream ein #0 vorkommt.
In XE7 ist das so und bei 10.4 nicht mehr.
Erkennbar ist das in der System.Classes in der Methode
Delphi-Quellcode:
procedure TStrings.SetTextStr
...
while P^ <> #0 do
...
Ich würde da mal einen Haltepunkt setzen oder mit dem Hex-Editor (HxD) nach #0 suchen.

bernhard_LA 22. Okt 2021 10:07

AW: meminifiles, inifiles , einlesen scheitert
 
das Problem liegt vlt. doch nicht an den Files ....
ich habe eine Mini-Testprogramm geschrieben , in diesem Falle klappt das einlesen der Sections, welches in der echten Anwendung fehlschlägt



Delphi-Quellcode:
procedure TForm2.ReadPointlist3Dfile(filename: string);
var
  AptList: TPointList3DAlign;
begin
  AptList := TPointList3DAlign.Create;

  AptList.LoadfromFile(filename);

  CopyPointList2Memo(AptList, 'debug 3D', Memo3);
end;

procedure TForm2.ReadPointlistfile(filename: string);
var
  AptList: TPointlist;
begin
  AptList := TPointlist.Create;

  AptList.LoadfromFile(filename);

  CopyPointList2Memo(AptList, 'debug 2D ', Memo3);

  AptList.SavetoFile(filename);
end;

procedure TForm2.ReadInifile(filename: string);
var
  aini: TInifile;
  Sections: TStringlist;
begin
  aini := TInifile.Create(filename);

  Sections := TStringlist.Create;

  aini.ReadSections(Sections);

  Memo2.Lines.AddStrings(Sections);

  aini.Free;

  Sections.Free;
end;

procedure TForm2.Button1Click(Sender: TObject);
begin
  if OpenDialog1.Execute() then
  begin
    Memo1.Lines.LoadfromFile(OpenDialog1.filename);

    ReadInifile(OpenDialog1.filename);

    ReadPointlistfile(OpenDialog1.filename);

    ReadPointlist3Dfile(OpenDialog1.filename);
  end;
end;

end.

Das nun existierende Problem, die eigentliche Anwendung führt auch nur diese 3 Schritte aus (und natürlich viele anderr ...) schlägt weiterhin fehl.

Delphi-Quellcode:
 
  AptList := TPointList3DAlign.Create;

  AptList.LoadfromFile(filename);

  CopyPointList2Memo(AptList, 'debug 3D', Memo3);
im Debugging zeigt sich , daß bei AptList.LoadfromFile(filename); keine Sections gefunden werden .....

Uwe Raabe 22. Okt 2021 10:35

AW: meminifiles, inifiles , einlesen scheitert
 
Vielleicht ist die Datei noch von einer anderen Anwendung gesperrt oder sowas in der Art.

himitsu 22. Okt 2021 11:46

AW: meminifiles, inifiles , einlesen scheitert
 
Da hier sämtliche Ressourcenschutzblöche fehlen, kann er es auch selber sein.

bernhard_LA 22. Okt 2021 16:36

AW: meminifiles, inifiles , einlesen scheitert
 
@himitsu
Zitat:

sämtliche Ressourcenschutzblöche fehlen, kann er es auch selber sein.
was wäre denn hier zu tun ?
eine andere *.ini Datei, im anderen Ordner mit der selben Delphi Anwendung geschieben funktioniert perfekt

bernhard_LA 22. Okt 2021 17:18

AW: meminifiles, inifiles , einlesen scheitert
 
PS: problem gelöst, im der eigentlichen Anwendung wurde der "nur fast" richtige Filename übergeben,super peinlich :shock:

schade , daß ich keine exception bekomme wenn ich aus einer ini Datei lesen, die nicht existiert,

dann wäre der Bug viel früher aufgefallen

Delphi.Narium 22. Okt 2021 17:27

AW: meminifiles, inifiles , einlesen scheitert
 
Delphi-Quellcode:
procedure TForm2.ReadPointlist3Dfile(filename: string);
var
  AptList: TPointList3DAlign;
begin
  if not FileExists(filename) then begin
    MessageDlg(Format('Datei %s wurde nicht gefunden.',[ExtractFileName(Filename)]),mtError,[mbOk],0);
    exit;
  end;
  AptList := TPointList3DAlign.Create;
  try
    AptList.LoadfromFile(filename);
    CopyPointList2Memo(AptList, 'debug 3D', Memo3);
  finally
    AptList.Free; // oder muss AptList nicht freigegben werden???
  end;
end;
Delphi-Quellcode:
procedure TForm2.ReadInifile(filename: string);
var
  aini: TInifile;
  Sections: TStringlist;
begin
  if not FileExists(filename) then begin
    MessageDlg(Format('Datei %s wurde nicht gefunden.',[ExtractFileName(Filename)]),mtError,[mbOk],0);
    exit;
  end;
  aini := TInifile.Create(filename);
  try
    Sections := TStringlist.Create;
    try
      aini.ReadSections(Sections);
      Memo2.Lines.AddStrings(Sections);
    finally
      Sections.Free; // Damit die Freigabe auch bei Fehlern erfolgt.
    end;
  finally
    aini.Free; // Damit die Freigabe auch bei Fehlern erfolgt.
  end;
end;
Wenn in der ursprünglichen Routine einmal ein Fehler auftritt, bleibt (schlimmstenfalls) der Zugriff auf die Datei "Filename" bestehen und wenn Du Pech hast, ist die Datei (dauerhaft) blockiert. (Kommt halt auf die jeweils verwendeten Zugriffsrechte auf Dateiebene an.)

Wenn
Zitat:

eine andere *.ini Datei, im anderen Ordner mit der selben Delphi Anwendung geschieben funktioniert perfekt
, heißt das nicht, dass man auf jegliche Fehlerbehandlung und die gesicherte Freigabe von Objekten, ... verzichten kann.

Fehlerbehandlung und Ressourcenschutzblöcke sind halt nicht für den funktionierenden Normalfall, sondern für die Ausnahmen-/Fehlerbehandlung erforderlich, damit eben auch dann "normal" weitergearbeitet werden kann und nicht "irgendwie, irgendwo, irgendwann" nicht nachvollziehbare "Spätfolgen" auftreten.

venice2 22. Okt 2021 17:35

AW: meminifiles, inifiles , einlesen scheitert
 
Zitat:

PS: problem gelöst, im der eigentlichen Anwendung wurde der "nur fast" richtige Filename übergeben,super peinlich
Fehler wäre nie aufgetreten wenn die Dateinamen bekannt und immer gleich sind diese als Konstante definiert gewesen wären.
Man vertippt sich doch sehr leicht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:58 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz