AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi TFileStream - Datei bereits geöffnet ?
Thema durchsuchen
Ansicht
Themen-Optionen

TFileStream - Datei bereits geöffnet ?

Ein Thema von slemke76 · begonnen am 28. Mai 2008 · letzter Beitrag vom 19. Jun 2008
Antwort Antwort
Seite 3 von 3     123   
Benutzerbild von Codewalker
Codewalker

Registriert seit: 18. Nov 2005
Ort: Ratingen
945 Beiträge
 
Delphi XE2 Professional
 
#21

Re: TFileStream Problem - Datei bereits geöffnet ?

  Alt 29. Mai 2008, 08:03
Zitat von littleDave:
Ich glaube sogar, dass das:
fmCreate or fmOpenWrite Probleme machen kann.
Probleme eigentlich nicht. Laut Delphi-Hilfe erstellt fmCreate eine Datei und wenn diese bereits vorhanden ist wird sie mit Schreibzugriff geöffnet.
Thomas
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#22

Re: TFileStream - Datei bereits geöffnet ?

  Alt 29. Mai 2008, 11:01
@CodeWalker: Doch die Stelle ist soweit falsch, weil fmCreate eine vorhandene Datei überschreibt während fmOpenReadWrite die Datei nur öffnet aber ihren Inhalt bestehen lässt. Somit ist hier das Verhalten komplett gegensätzlich, deshalb können nicht beide angegeben werden. Aber das es zu keinen Problemen kommt wenn doch, liegt an der Implementierung von FileOpen() der VCL, welche nur auf fmCreate und nur in diesem Falle das richtige Flag an CreateFile() gibt -> es ignoriert das fmOpenReadWrite damit komplett, so lange fmCreate angegeben ist.
  Mit Zitat antworten Zitat
slemke76

Registriert seit: 29. Mär 2005
Ort: Quakenbrück
146 Beiträge
 
#23

Re: TFileStream - Datei bereits geöffnet ?

  Alt 15. Jun 2008, 15:23
Hallo,

ich wieder 8)

Also mit IsFileInUse hat es mehrere Tage gebraucht, aber es ist wieder "hängen" geblieben - ich könnte jetzt ein try...except...end drumherum bauen, aber ich würde schon gerne wissen, woher das Problem kommt.

Was ich jetzt noch probiert habe, ist mit Delphi 2007 statt Delphi 7 zu compilieren.

Hat aber auch nicht geklappt.

Jetzt werde ich die MappedStreams ausprobieren.

lg
Sebastian
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.335 Beiträge
 
Delphi 12 Athens
 
#24

Re: TFileStream Problem - Datei bereits geöffnet ?

  Alt 15. Jun 2008, 15:56
Zitat von slemke76:
Ich habe ausserdem gelesen, das TStream von Delphi gepuffert ist.
erstmal ist TStream abstract und da es aus diesem Grund erstmal garnichts ließt/schreibt, wird auch nichts gepuffert.

TFileStream(THandleStream) puffern selber nichts und die WindowsPufferung sollte bei diesem Problem keinen Einfluß haben, da sie vom Programm aus keinen Einfluß hat ... also wird FlushFileBuffers(Stream.Handle) nichts bewirken.


man müßte also erstmal rausbekommen welches Programm die Datei noch geöffnet hat (könntest ja z.B. mal mit einen Bei Google suchenUnlocker, oder 'nem Bei Google suchenProcess Explorer selber nachsehn, wer das ist),

oder wenn es an deinem Programm liegt: warum/wo die Datei nicht mehr geschlossen/freigegeben wird.


PS: wenn die Datei noch geöffnet ist, dann bring es auch nichts, wenn du eine andere Komponente verwendest, um auf diese Datei zuzugreifen ... gesperrt ist gesperrt.
(abgesehn die Komponente ist defekt und der Fehler kommt von ihr ... aber TFileStream selber sollte diesen Fehler nicht verursachen)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
slemke76

Registriert seit: 29. Mär 2005
Ort: Quakenbrück
146 Beiträge
 
#25

Re: TFileStream - Datei bereits geöffnet ?

  Alt 15. Jun 2008, 17:15
Hallo zusammen,

ich habe jetzt mal die Routine in ein einigenes Programm gekapselt; das Problem trat immer noch auf. Ich habe daraufhin mal ein wenig herumgespielt und es hat sich herausgestellt, dass die Kombination (oder nur der AV) Virenscanner und Betriebssystem das Problem verursacht haben:

Vista mit Kaspersky Antivirus 2009: keine Probleme
W2K3 SBS mit Kaspersky für Windows Servers 6.x: Nach kurzer Zeit Absturz, da die Datei in Benutzung sei.

Die Routine sieht so aus:

Delphi-Quellcode:
procedure TForm1.btnStartClick(Sender: TObject);
begin
  btnStart.Enabled:=false;
  btnStart.Caption:='running...';
  Timer1.Enabled:=true;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Memo1.Lines.Add('rein');
  Timer1.Enabled:=false;
  DoSave();
  Timer1.Enabled:=true;
  Memo1.Lines.Add('raus');
end;
Delphi-Quellcode:
procedure DoSave();
var Stream: TFileStream;
    XMLFile: String;
    DomToXmlParser1: TDomToXmlParser;
    DomImplementation1: TDomImplementation;
    FDoc: TDOMDocument;
    FNodeElement: TDomElement;

begin
  XMLFile:='test.xml';
  // ----- XML-Zeugs -----
  DomImplementation1:=TDomImplementation.Create(nil);
  FDoc := TDomDocument.Create(DomImplementation1);
  DomToXmlParser1:=TDomToXmlParser.Create(nil);
  DomToXmlParser1.DOMImpl:=DomImplementation1;

  // --- XML root für Schnittstelle anlegen ---
  FNodeElement:=TDomElement.Create(FDoc, 'TEST');
  FDoc.AppendChild(FNodeElement);

  Stream := TFileStream.Create(XMLFile, fmCreate);
  DomToXmlParser1.WriteToStream(FDoc, 'UTF-8', Stream);
  Stream.Free;

  FNodeElement.Free;
  DomToXmlParser1.Free;
  FDoc.Free;
  DomImplementation1.Free;
end;
lg
Sebastian
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.335 Beiträge
 
Delphi 12 Athens
 
#26

Re: TFileStream - Datei bereits geöffnet ?

  Alt 16. Jun 2008, 09:20
also könnte es so aussehn, als wenn der Virenscanner die Datei noch geöffnet hat.

abgesehn, daß zur Sicherheit in DoSave in paar Try-Except/Finally nicht schaden könnten, damit bei einem/dem Fehler nicht vergessen wird etwas freizugeben ... vorallem die Datei zu schließen.

PS: wenn der Code mehrmals die Minute aufgerufen wird, warum öffnest du diese Datei dann ständig neu?
könnte sie denn nicht einmal geöffnet und die ganze Zeit über offen gelassen werden?

Da IsFileInUse scheinbar nichts bringt, da zwischen diesem und TFileStream.Create die Datei immernoch gesperrt werden kann (bzw. was anscheind auch schon passiert ist):
Delphi-Quellcode:
procedure DoSave();
var Stream: TFileStream;
    XMLFile: String;
    DomToXmlParser1: TDomToXmlParser;
    DomImplementation1: TDomImplementation;
    FDoc: TDOMDocument;
    FNodeElement: TDomElement;
    B: Boolean;

begin
  XMLFile:='test.xml';
  // ----- XML-Zeugs -----
  DomImplementation1:=TDomImplementation.Create(nil);
  FDoc := TDomDocument.Create(DomImplementation1);
  DomToXmlParser1:=TDomToXmlParser.Create(nil);
  DomToXmlParser1.DOMImpl:=DomImplementation1;

  // --- XML root für Schnittstelle anlegen ---
  FNodeElement:=TDomElement.Create(FDoc, 'TEST');
  FDoc.AppendChild(FNodeElement);


  B := False;
  repeat
    try
      Stream := TFileStream.Create(XMLFile, fmCreate);
      B := True;
    except
      Sleep(0);
    end;
  until B;
  try
    DomToXmlParser1.WriteToStream(FDoc, 'UTF-8', Stream);
  finally
    Stream.Free;
  end;

  FNodeElement.Free;
  DomToXmlParser1.Free;
  FDoc.Free;
  DomImplementation1.Free;
end;
OK, es ist nicht wirklich optimal und vorallem ein Except ohne Fehlerbehandlung wird nicht grad gern gesehn, aber was soll's
(zusetzlich noch ein (paar) Try-Finally für das ganze XML-Zeugs könnten dennoch nicht Schaden)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
slemke76

Registriert seit: 29. Mär 2005
Ort: Quakenbrück
146 Beiträge
 
#27

Re: TFileStream - Datei bereits geöffnet ?

  Alt 17. Jun 2008, 11:38
Hi !

Der Code ist wirklich gut; ich habe es jetzt im Moment anders gelöst, aber das wird nochmal angepasst. Danke für den Input.
try-except für XML ist nicht wirklich notwendig - die Routinen laufen absolut problemlos; praktisch gesehen gibt es da nix, was abstürzt

lg
Sebastian
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.335 Beiträge
 
Delphi 12 Athens
 
#28

Re: TFileStream - Datei bereits geöffnet ?

  Alt 19. Jun 2008, 12:38
Zitat von slemke76:
try-except für XML ist nicht wirklich notwendig - die Routinen laufen absolut problemlos; praktisch gesehen gibt es da nix, was abstürzt
Na dann ist ja gut ... bin' halt nur gewohnt, daß zuviele DelphiObjekte mit Exceptions nur so um sich werfen

Aber wenn das so ist, dann sollte es ja reichen, wenn in der Schleife das Try-Except und "B" wegkommt und stattdessen einfach der Wert von "Stream" geprüft wird. (war mir aber fast sicher, daß der Konstruktor im Fehlerfall eine exception wirft )

grad nachgesehn ... wenn die datei nicht geöffnet wird, dann wird mit EFCreateError geworfen.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 3     123   


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 08:59 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