Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Zugriffsproblem bei Dateien (Lesezugriff) (https://www.delphipraxis.net/99134-zugriffsproblem-bei-dateien-lesezugriff.html)

DoktorD 7. Sep 2007 10:26


Zugriffsproblem bei Dateien (Lesezugriff)
 
Servus.

Also erstmal vorweg. Ich habe ein Programm geschrieben welches Textdateien auf einen bestimmten Text durchsucht und dann ausgibt. Funktioniert auch alles.

Nur auf dem Rechner wo dieses Programm eingesetzt werden soll, hat eine andere Software (keine Selbstgeschriebene) den Zugriff auf diese Datei (Text Datei).

In meinem Programm rufe ich die Datei mit

Delphi-Quellcode:
Stringlist.LoadFromFile(Pfad);
auf. Dann kommt die Fehlermeldung,

"Der Prozess kann nicht auf die Datei zugreifen, da sie von einem anderen Prozess verwendet wird"

Da ich aber zur gleichen Zeit mit dem TotalCommander die Datei öffnen kann, muss das doch irgendwie gehen?
Hat einer eine Idee?

Danke für Eure Mühe.

Klaus01 7. Sep 2007 10:41

Re: Zugriffsproblem bei Dateien (Lesezugriff)
 
Hallo,

ich denke das die Stringlist das Öffnen von Dateien exclusive macht und man daran auch nichts ändern kann
(ich wüßte zumindest nicht wie).
Alternativ kannst Du TFileStream verwenden, dort kannst Du die Modi übergeben wie die Datei geöffnet werden soll.

[edit]
Oder versuche einmal die Variable FileMode entsprechend zu setzen.
Die Variable ist in der system.pas global definiert.
[/edit]
Delphi-Quellcode:
FileMode := fmOpenRead;
Zitat:

Zitat von DelphiHilfe
Category

file management routines

const

fmOpenRead = $0000;
fmOpenWrite = $0001;
fmOpenReadWrite = $0002;

fmShareCompat = $0000;
fmShareExclusive = $0010;
fmShareDenyWrite = $0020;
fmShareDenyRead = $0030;
fmShareDenyNone = $0040;

Description

The file open mode constants are used when a file or stream is opened to control how it can be shared.

The TFileStream constructor has a Mode parameter that you can set to one of these constants:
Constant Definition

fmCreate If the file exists, open for write access, otherwise, create a new file. Unlike the other constants, which are declared in the SysUtils unit, this constant is declared in classes.pas.
fmOpenRead Open for read access only.
fmOpenWrite Open for write access only.
fmOpenReadWrite Open for read and write access.
fmShareCompat Compatible with the way FCBs are opened.
fmShareExclusive Read and write access is denied.
fmShareDenyWrite Write access is denied.

fmShareDenyRead Read access is denied.
fmShareDenyNone Allows full access for others.

Grüße
Klaus

DoktorD 7. Sep 2007 10:52

Re: Zugriffsproblem bei Dateien (Lesezugriff)
 
Ok. Das hab ich mal probiert.

Also um den Fehler zu erzeugen rufe ich mit einer Applikation die Datei auf. Und zwar so ...

Delphi-Quellcode:
Unit Unit4;

Interface
  Uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls;

  Type TForm1 = class(TForm)
      Procedure FormCreate(Sender: TObject);
      Procedure FormDestroy(Sender: TObject);
    Private
      FH: THandle;
    End;

  Var Form1: TForm1;

Implementation
  {$R *.dfm}

  Procedure TForm1.FormCreate(Sender: TObject);
    Begin

      FH := CreateFile(PChar(ExtractFilePath(ParamStr(0)) + 'Project3.txt'), GENERIC_READ or GENERIC_WRITE,
        FILE_SHARE_READ, nil, OPEN_ALWAYS, 0, 0);

      If FH = INVALID_HANDLE_VALUE Then Raise Exception.Create('Can''t open the file.');
      SetFilePointer(FH, 4, nil, FILE_BEGIN);
      SetEndOfFile(FH);
    End;

Und mit meiner anderen Applikation versuche ich dann das hier:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  sl: TStringList;
  Pfad: String;
  Stream : TFileStream;
begin
  Pfad := 'c:\Dokumente und Einstellungen\bottd\Desktop\Datei bereits verwendet\Datei bereits verwendet\Project3.txt';
  if FileExists(Pfad) then
  begin
    //sl:= TStringList.Create;
    try
      //sl.LoadFromFile(Pfad);
      Stream := TFileStream.Create(Pfad,fmOpenRead);
      ShowMessage('Öffnen hat geklappt');
    finally

    end;
  end;
end;

Die Fehlermeldung kommt aber immernoch. Also, es hat sich somit nichts geändert. Woran liegt das?

Klaus01 7. Sep 2007 11:02

Re: Zugriffsproblem bei Dateien (Lesezugriff)
 
Hast Du es schon einmal mit fmShareDenyNone
probiert?

Grüße
Klaus

DoktorD 7. Sep 2007 11:05

Re: Zugriffsproblem bei Dateien (Lesezugriff)
 
Super!!! Damit klappt es.

Aber was genau ist jetzt der Unterschied zwischen fmShareDenyNone und fmOpenRead ?

Klaus01 7. Sep 2007 11:06

Re: Zugriffsproblem bei Dateien (Lesezugriff)
 
fmOpenRead Open -> for read access only.
fmShareDenyNone -> Allows full access for others.

Grüße
Klaus

DoktorD 7. Sep 2007 11:07

Re: Zugriffsproblem bei Dateien (Lesezugriff)
 
Achsoo. Wie bekomme ich denn nun aber den Inhalt der Datei in meine StrinList?
Die StringList muss genauso aussehen wie mit LoadFromFile.

Oder geht das nicht?

Klaus01 7. Sep 2007 11:09

Re: Zugriffsproblem bei Dateien (Lesezugriff)
 
Nun, ich hatte meinen ersten Beitrag editiert.

Dann kannst Du mal versuchen mit der Stringlist zu arbeiten
und vorher die Variabla FileMode := fmShareDenyNone setzen.

FileMode ist in der system.pas global definiert, du brauchst diese
Variable also nicht in Deinem Quellcode declarieren.

Grüße
Klaus

DoktorD 7. Sep 2007 11:17

Re: Zugriffsproblem bei Dateien (Lesezugriff)
 
Puhhh, also irgendwie verstehe ich nur Bahnhof.

Kannst du mir mal ein Beispiel geben?
Ich verstehe jetzt nicht den Zusammenhang zwischen TFileStream und TStringList.

C.Schoch 7. Sep 2007 11:27

Re: Zugriffsproblem bei Dateien (Lesezugriff)
 
Hi,
z.B. so
Delphi-Quellcode:
sl:= TStringList.Create;
try
  FileMode := fmShareDenyNone;
  sl.LoadFromFile(Dateiname);
finally

end;
oder so:
Delphi-Quellcode:
sl:= TStringList.Create;
try
  Stream := TFileStream.Create(Pfad,fmOpenRead);
  sl.LoadFromStream(Stream);  
finally

end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:38 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