AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Fehlermeldung bei Schreiben nach CSIDL_APPDATA

Ein Thema von Bjoerk · begonnen am 15. Apr 2011 · letzter Beitrag vom 16. Apr 2011
Antwort Antwort
Seite 1 von 2  1 2      
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#1

Fehlermeldung bei Schreiben nach CSIDL_APPDATA

  Alt 15. Apr 2011, 18:42
Delphi-Version: 5
Die folgende Routine ist Bestandteil eines iniFile Parsers. SaveFile ist gelegentlich (!?) false. Ich suche schon seit Wochen, in den Apps kann ich jedoch keine Fehler entdecken. Dateien vom Typ TStrIniFile werden procdure intern vereinbart, erzeugt und freigegegen. Bei free wird ggf. SaveToFile aufgerufen. Ich bin mir sicher, daß innerhalb von TStrInfile kein Fehler ist.
Delphi-Quellcode:
function TStrIniFile.SaveFile : boolean;
var
  f: TextFile;
  i: integer;
begin
  RESULT:=false;
  AssignFile(f,FileName);
  {$I-} Rewrite(f); {$I+}
  if IoResult=0 then
  begin
    RESULT:=true;
    for i:=0 to Count-1 do
    begin
      if i>0 then
        if posIS[i]<0 then writeln(f);
      writeln(f,item[i]);
    end;
    closeFile(f);
  end;
  sleep(10);
  *** if not RESULT then ***
    MessageDlg(application.ExeName+': '+FileName+' is not ready for WRITE.',mtWarning,[mbOk],0);
end;

procedure TStrIniFile.UpdateFile;
begin
  if FileName<>'then
  begin
    SaveFile;
    IniFileChanged:=false;
  end;
end;

destructor TStrIniFile.Destroy;
begin
  if IniFileChanged then UpdateFile;
  inherited;
end;
Das Verzeichnis der Dateien ist:
verzA:=VerzMitSlash(trim(GetShellFolderPath(CSIDL_APPDATA)))+'Abel\'; Ein Hauptmenu wird mit einem {$R Adminrechte.res} gestartet und ruft die verschiedenen Apps so auf:
Delphi-Quellcode:
rocedure TForm101.ExecuteWinFileAndWait(Prozess: String);
var SI: TStartupInfo;
    PI: TProcessInformation;
begin
  screen.cursor:=crAppStart;
  FillChar(SI, SizeOf(SI), 0);
  SI.cb:= SizeOf(SI);
  SI.wShowWindow:= SW_SHOWNORMAL;
  if not CreateProcess(nil,PChar(Prozess),nil,nil,false,NORMAL_PRIORITY_CLASS,nil,PChar(VerzE),SI,PI) then
  begin
    messagedlg('... kann den Prozess nicht ausführen.',mterror,[mbok],0);
    EscDateiAnlegen;
  end
  else
  Begin
    WaitForSingleObject(PI.hProcess,INFINITE);
  End;
  screen.cursor:=crdefault;
end;
Woran könnte das liegen, daß es ab und zu nicht geht? Alle Ideen sind willkommen. // D2007
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.771 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Fehlermeldung bei Schreiben nach CSIDL_APPDATA

  Alt 15. Apr 2011, 18:52
Hallo,

es wäre dann vielleicht hilfreich den ErrorCode von IOResult zu erfahren.
Habe deswegen einige Änderungen im Code vorgenommen.

Delphi-Quellcode:
function TStrIniFile.SaveFile : boolean;
var
  f: TextFile;
  i: integer;
  errorCode : Integer;
begin
  RESULT:=false;
  AssignFile(f,FileName);
  {$I-} Rewrite(f); {$I+}
  errorCode := IOResult;
  if errorCode=0 then
  begin
    RESULT:=true;
    for i:=0 to Count-1 do
    begin
      if i>0 then
        if posIS[i]<0 then writeln(f);
      writeln(f,item[i]);
    end;
    closeFile(f);
  end;
  sleep(10);
  *** if not RESULT then ***
    MessageDlg(application.ExeName+': '+FileName+' is not ready for WRITE ['+sysErrorMessage(errorCode)+'].',mtWarning,[mbOk],0);
end;

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Fehlermeldung bei Schreiben nach CSIDL_APPDATA

  Alt 15. Apr 2011, 20:11
Hi Klaus,

Exception.create bringt: Kann die Datei nicht öffnen.

Was mir aber eben einfällt, was passiert denn, wenn die gleiche Datei von zwei Instanzen gleichzeitig geöffnet ist und im Destroy der Form beide sozusagen gleichzeitig geschrieben werden sollen. Gibt es da eine queue oder dann die Fehlermeldung? Ist mir eben eingefallen. Kann man ein Textdatei sharen wie einen Stream?

Gruß
Thomas
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.771 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Fehlermeldung bei Schreiben nach CSIDL_APPDATA

  Alt 15. Apr 2011, 20:25
Hallo,

rewrite öffnet die Datei exclusiv.

Was bezweckst Du denn damit das zwei Instanzen die Datei bearbeiten dürfen?

Die Configurationeinstellungen würde ich zentral bearbeiten (lesen und schreiben)
und dann nur von einer Instanz (eine Singleton Klasse würde sich da anbieten).

Grüße
Klaus
Klaus

Geändert von Klaus01 (15. Apr 2011 um 20:30 Uhr)
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Fehlermeldung bei Schreiben nach CSIDL_APPDATA

  Alt 15. Apr 2011, 20:31
Anlage errorCode
Angehängte Dateien
Dateityp: pdf Dokument1.pdf (20,9 KB, 5x aufgerufen)
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.771 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Fehlermeldung bei Schreiben nach CSIDL_APPDATA

  Alt 15. Apr 2011, 20:33
Anlage errorCode
siehe Post #4

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: Fehlermeldung bei Schreiben nach CSIDL_APPDATA

  Alt 15. Apr 2011, 20:40
Stimmt, eigentlich ja, ist historisch begründet. Die Datei wird an 100-200 Stellen in der Software gelesen und/oder geschrieben, in der Form, in anderen Units, in mehreren Komponenten usw.. Ich werde die Datei jetzt global EINMAL in der Unit in initialization erzeugen und in finalization freigeben. Müsste doch funktionieren?
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#8

AW: Fehlermeldung bei Schreiben nach CSIDL_APPDATA

  Alt 15. Apr 2011, 20:43
[OT]Mal was anderes: Was soll das Sleep(10); ?[/OT]
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.771 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: Fehlermeldung bei Schreiben nach CSIDL_APPDATA

  Alt 15. Apr 2011, 20:54
.. Ich werde die Datei jetzt global EINMAL in der Unit in initialization erzeugen und in finalization freigeben. Müsste doch funktionieren?
Sollte funktionieren, wenn Du dann die Daten aus der Liste (item[i]) liest
und darin auch die Daten änderst.

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#10

AW: Fehlermeldung bei Schreiben nach CSIDL_APPDATA

  Alt 15. Apr 2011, 21:07
Hi Philip, war eine Verzweiflungstat für Give another Process a chance.

Klaus, funktioniert das auch noch bei Komponenten, die werden u.U. zur Laufzeit schon free und benutzen das selbe initialization/finalization wie die Formulare.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:35 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