AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Datei öffnen, die von einem anderen Prozess benutzt wird
Thema durchsuchen
Ansicht
Themen-Optionen

Datei öffnen, die von einem anderen Prozess benutzt wird

Ein Thema von oki · begonnen am 18. Mai 2010 · letzter Beitrag vom 18. Mai 2010
Antwort Antwort
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#1

Datei öffnen, die von einem anderen Prozess benutzt wird

  Alt 18. Mai 2010, 09:01
Hallo Leute,

trotz Suche bin ich nicht weiter. Ich will eine Datei öffnen, in die ein anderes Programm Daten schreibt um diese sofort (während der Messung) zu lesen. Jetzt bekomme ich immer die Meldung, dass die Datei nicht geöffnet werden kann, da sie von einem anderen Prozess verwendet wird.

Ich versuche die Datei so zu öffnen:
Delphi-Quellcode:
procedure TLTC2440_DataList.LoadData(AFileName: String);
var AFStream : TFileStream;
    ASStream : TStringStream;
begin
  FFileName := AFileName;
  Clear;

  if not FileExists(AFileName) then
    Exit;
  FFileText := TStringList.Create;
  AFStream := TFileStream.Create(AFileName, fmOpenRead, fmShareDenyNone);
  try
    ASStream := TStringStream.Create;
    try
      ASStream.LoadFromStream(AFStream);
      FFileText.Text := ASStream.DataString;
    finally
      FreeAndNil(ASStream);
    end;
  finally
    FreeAndNil(AFStream);
  end;
  try
    DecodeHeaderfromFile(FFileText);
    DecodeValues(FFileText);
  finally
    FreeAndNil(FFileText);
  end;
end;
Vorher hatte ich es erst nur über die TStringList mit LoadfromFile versucht. Kein Erfolg. Wenn ich die Datei mit dem Windows-Editor öffne gibt es keine Fehlermeldung. Also mache ich was falsch. Die Frage ist nur was?

Ich hoffe auf eure Hilfe,

Gruß oki
42
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Datei öffnen, die von einem anderen Prozess benutzt wird

  Alt 18. Mai 2010, 09:16
TFileStream (wird auch bei LoadFromFile in TStrings/TStringList) verwendet, läßt beim Auslesen nur Lesezugriffe anderer Anwendungen zu.
Diese Datei ist bei dir aber im Schreibzugriff geöffnet.

Lösung: THandleStream + MSDN-Library durchsuchenCreateFile und dort fremde Schreibrechte erlauben
(ShareMode = FILE_SHARE_READ or FILE_SHARE_WRITE) und dann TStringList+LoadFromStream
(bei TFileStream fehlt das FILE_SHARE_WRITE ... so wird sichergestellt, daß eine Datei nicht wärend des Lesen verändert wird und somit die Daten konsistent bleiben)

PS: TStringStream hättes du nicht benötigt, da TStringList auch ein LoadFromStream kennt und somit die Daten unnötiger Weise umherkopiert werden.
$2B or not $2B
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#3

Re: Datei öffnen, die von einem anderen Prozess benutzt wird

  Alt 18. Mai 2010, 09:27
Hi himitsu,

Dank für den Lösungsansatz und deinen Hinweis. Ich teste das aus und melde mich.

Gruß oki
42
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Datei öffnen, die von einem anderen Prozess benutzt wird

  Alt 18. Mai 2010, 10:15
Das funktioniert aber nur, wenn das andere Programm auch von ihm ist und er den Code entsprechend anpassen kann. Wenn ein anderer Prozess eine Datei exklusiv für sich öffnet, dann ist sie eben exklusiv geöffnet.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Datei öffnen, die von einem anderen Prozess benutzt wird

  Alt 18. Mai 2010, 10:27
Zitat von Luckie:
Wenn ein anderer Prozess eine Datei exklusiv für sich öffnet, dann ist sie eben exklusiv geöffnet.
Dann dürfte Notepad es auch nicht lesen können.

Der andere Prozess scheint also die nötigen Sharing-Rechte (zumindestens zum Lesen) zu geben.
Allerdings hat der andere Prozess die Datei eben schon zum Schreiben geöffnet, welches halt von TFileString nicht erlaubt wird.

Aber im Prinzip hast du Recht.
Wenn der andere Prozess keine Sharing-Rechte freigibt, dann ist das eben so.
Wenn mehrere Prozesse auf die selbe Datei zugeifen wollen/müssen, dann müssen die entsprechenden Sharing-Rechte auch zusammenpassen ... ansonsten: Wer zuerst kommt, der ließt/schreib zuerst und der Ander hat das Nachsehn.
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#6

Re: Datei öffnen, die von einem anderen Prozess benutzt wird

  Alt 18. Mai 2010, 10:30
OK, das mit dem Notepad hatte ich überlesen. Dann liegt es wirklich nur an seinem Code.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#7

Re: Datei öffnen, die von einem anderen Prozess benutzt wird

  Alt 18. Mai 2010, 13:29
Hi Leute,

sorry, dass es so lange gedauert hat. Lag aber nicht an den paar Zeilen, musste noch einige andere Probleme lösen.
Himitsu hat das richtig erkannt. Ich habe meinen Code wie folgt angepasst:
Delphi-Quellcode:
procedure TLTC2440_DataList.LoadData(AFileName: String);
var AHStream : THandleStream;
    AFileHandle : THandle;
begin
  FFileName := AFileName;
  Clear;

  if not FileExists(AFileName) then
    Exit;
  AFileHandle := INVALID_HANDLE_VALUE;
  AFileHandle := CreateFile(PChar(AFileName), GENERIC_READ, FILE_SHARE_READ or FILE_SHARE_WRITE,
    0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);

  if AFileHandle <> INVALID_HANDLE_VALUE then begin
    FFileText := TStringList.Create;
    try
      try
        AHStream := THandleStream.Create(AFileHandle);
        try
          FFileText.LoadFromStream(AHStream);
        finally
          FreeAndNil(AHStream);
        end;
      finally
        CloseHandle(AFileHandle);
      end;
      DecodeHeaderfromFile(FFileText);
      DecodeValues(FFileText);
    finally
      FreeAndNil(FFileText);
    end;
  end;
end;
Damit ist das Problem vom Tisch. Nochmals herzlichen Dank für den Tip.
@Luckie: Ja, meine Bemerkung mit "Exclusive" war etwas vorschnell und nicht unbedingt korrekt. Hatte aus diesem Grund auch den Hinweis mit dem Editor angefügt. Aber im Grunde hat himitsu mich richtig verstanden.

Dank an alle und Gruß

oki
42
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Datei öffnen, die von einem anderen Prozess benutzt wird

  Alt 18. Mai 2010, 13:41
Delphi-Quellcode:
procedure TLTC2440_DataList.LoadData(AFileName: String);
var AHStream : THandleStream;
    AFileHandle : THandle;
begin
  FFileName := AFileName;
  Clear;
  AFileHandle := CreateFile(PChar(AFileName), GENERIC_READ, FILE_SHARE_READ or FILE_SHARE_WRITE,
    0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
  if AFileHandle <> INVALID_HANDLE_VALUE then begin
    FFileText := TStringList.Create;
    try
Im Prinzip kannst'e das noch etwas kürzen.
OPEN_EXISTING beinhaltet ja quasi schon das FileExists.
$2B or not $2B
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#9

Re: Datei öffnen, die von einem anderen Prozess benutzt wird

  Alt 18. Mai 2010, 14:49
Joop, hast Recht. Das sind die bekannten Überbleibsel beim Code ändern. Einfach nicht drauf geachtet.

Dank und Gruß

oki
42
  Mit Zitat antworten Zitat
Antwort Antwort


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 20:47 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