Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Datei in Benutzung (https://www.delphipraxis.net/119875-datei-benutzung.html)

SaFu 2. Sep 2008 15:09


Datei in Benutzung
 
Hi

Ich weis das Thema wurde oft genug behandelt nd hab hier im Forum auc schon geguckt. Hab aber immer nur sachen gefunden, wie man abfragt ob eine Datei in Benutzung ist.

Ich wollte meiner LadeProcedure irgenwie klarmachen, das sie die Datei als "In Benutzung" kennzeinen soll.

Was gibt es da so

hab das hier um meine Datei ins Grid zu Laden beim Speichern soll das Flag wieder zurückgesetzt werden

Delphi-Quellcode:
procedure TForm7.GridLaden;
var x, y, row, col,len :Word;
    Grid :TFileName;
    FileStream :TMemoryStream;
    buff :string;
begin
  FileStream:= TMemoryStream.Create; //MemoryStream erzeugen

  Grid:= FileListbox1.FileName;
  FileStream.LoadFromFile(Grid);

  FileStream.Read(row, SizeOf(Word));
  FileStream.Read(col, SizeOf(Word));

  for x:= 0 to row do
   for y:= 0 to col do
    begin
     FileStream.Read(len, SizeOf(Word));
     SetLength(buff, len);
     FileStream.Read(buff[1], len);
     StringGrid1.Cells[y,x]:= buff;
    end;
   FileStream.Free;
end;
Gruß sascha

Die Muhkuh 2. Sep 2008 15:12

Re: Datei in Benutzung
 
Hi,

Du willst, wenn jemand anders diese Datei auch öffnen will, dass er die Meldung bekommt "Datei ist in Benutzung"?

SaFu 2. Sep 2008 15:13

Re: Datei in Benutzung
 
Genau kurzgesagt

Die Muhkuh 2. Sep 2008 15:13

Re: Datei in Benutzung
 
Nimm einen TFilestream anstatt den TMemoryStream und als Modus nimmst Du fmShareExclusive

SaFu 2. Sep 2008 15:46

Re: Datei in Benutzung
 
So hab es mal umgebaut aber ich kann es Trotzdem noch mit einer neuen Instanz meines Programmes ein Zweites mal Öffnen

Delphi-Quellcode:
procedure TForm7.GridLaden;
var x, y, row, col,len :Word;
    Grid :TFileName;
    FFileStream1: TFileStream;
    buff :string;
begin
  FFileStream1 := TFileStream.Create(FileListbox1.FileName, fmOpenRead, fmShareExclusive);

  FFileStream1.Read(row, SizeOf(Word));
  FFileStream1.Read(col, SizeOf(Word));

  for x:= 0 to row do
   for y:= 0 to col do
    begin
     FFileStream1.Read(len, SizeOf(Word));
     SetLength(buff, len);
     FFileStream1.Read(buff[1], len);
     StringGrid1.Cells[y,x]:= buff;
    end;
   FFileStream1.Free;
end;

Die Muhkuh 2. Sep 2008 15:47

Re: Datei in Benutzung
 
Delphi-Quellcode:
FFileStream1 := TFileStream.Create(FileListbox1.FileName, fmOpenRead, fmShareExclusive);
Was ist das o.O

Delphi-Quellcode:
FFileStream1 := TFileStream.Create(FileListbox1.FileName, fmOpenRead or fmShareExclusive);

SaFu 2. Sep 2008 15:50

Re: Datei in Benutzung
 
Nee geht immernoch selbst wenn ich es so schreibe


Delphi-Quellcode:
FFileStream1 := TFileStream.Create(FileListbox1.FileName,fmShareExclusive);

DeddyH 2. Sep 2008 15:57

Re: Datei in Benutzung
 
Zitat:

Zitat von Delphi-Hilfe
Die Methode erzeugt eine Instanz von TFileStream.

Delphi-Quellcode:
constructor Create(const FileName: string; Mode: Word);
Beschreibung

Mit Create wird ein Datei-Stream zum Lesen aus oder Schreiben in die benannte Datei instantiiert. In den Parametern wird der Name und der Öffnungsmodus der Datei übergeben.

Der Parameter Mode steuert, auf welche Art die Datei geöffnet wird. Der Parameter besteht aus zwei Elementen: Eines beschreibt das Öffnen, und eines legt den Modus für gemeinsamen Zugriff fest. Beide Elemente werden durch ein logisches ODER verknüpft. Der Öffnen-Modus kann folgende Konstantenwerte annehmen:

Wert Bedeutung

fmCreate Es wird eine Datei mit dem angegebenen Namen angelegt. Ist eine Datei mit diesem Namen bereits vorhanden, wird die Datei zum Schreiben geöffnet.
fmOpenRead Die Datei wird ausschließlich zum Lesen geöffnet.
fmOpenWrite Die Datei wird ausschließlich zum Schreiben geöffnet. Beim Schreiben in die Datei wird der aktuelle Inhalt vollständig ersetzt.
fmOpenReadWrite Die Datei wird so geöffnet, daß der aktuelle Inhalt geändert werden kann, ohne daß er ersetzt wird.

Für den Zugriffsmodus sind folgende Konstantenwerte verfügbar:

Wert Bedeutung

fmShareCompat Der Zugriffsmodus ist kompatibel zu dem Verfahren, mit dem Dateisteuerblöcke (FCBs) geöffnet werden.
fmShareExclusive Andere Anwendungen können die Datei nicht öffnen.
fmShareDenyWrite Andere Anwendungen können die Datei ausschließlich zum Lesen öffnen.
fmShareDenyRead Andere Anwendungen können die Datei ausschließlich zum Schreiben öffnen.
fmShareDenyNone Andere Anwendungen können die Datei ohne Einschränkungen zum Lesen oder Schreiben öffnen.

Wenn die Datei nicht geöffnet werden kann, löst Create eine Exception aus.


taaktaak 2. Sep 2008 15:58

Re: Datei in Benutzung
 
Könnte es sein, dass "fmShareExclusive" nur solange eine Wirkung hat, bis die Instanz von FileStream wieder freigegeben wird? :zwinker:

DeddyH 2. Sep 2008 16:00

Re: Datei in Benutzung
 
Davon ist auszugehen, wäre ja blöde, wenn nicht :mrgreen:

SaFu 2. Sep 2008 16:02

Re: Datei in Benutzung
 
Zitat:

Zitat von taaktaak
Könnte es sein, dass "fmShareExclusive" nur solange eine Wirkung hat, bis die Instanz von FileStream wieder freigegeben wird? :zwinker:

Na das wars glaube ich jetzt muss ich nur noch gucken wie ich die wieder frei bekomme wenn ich in der FileListbox die datei wechsel

taaktaak 2. Sep 2008 16:03

Re: Datei in Benutzung
 
Eben, aber wer dieses
Zitat:

aber ich kann es Trotzdem noch mit einer neuen Instanz meines Programmes ein Zweites mal Öffnen
schreibt, hat offenbar anders gedacht :roll:

Die Muhkuh 2. Sep 2008 16:03

Re: Datei in Benutzung
 
Darfst halt keine lokale Variable nutzen, sondern ein Feld in der Klasse.

taaktaak 2. Sep 2008 16:06

Re: Datei in Benutzung
 
Zitat:

wie ich die wieder frei bekomme wenn ich in der FileListbox die datei wechsel
Wieso ist das ein Problem?
Die Sperrung ist doch nur innerhalb der Methode "GridLaden" wirksam

Die Muhkuh 2. Sep 2008 16:07

Re: Datei in Benutzung
 
Anscheinend will er sie aber so lange offen lassen, bis man eine neue Datei anwählt.

taaktaak 2. Sep 2008 16:08

Re: Datei in Benutzung
 
Aha, na, dann muss "GridLaden" aber umgebaut werden...

Die Muhkuh 2. Sep 2008 16:08

Re: Datei in Benutzung
 
Zitat:

Zitat von Die Muhkuh
Darfst halt keine lokale Variable nutzen, sondern ein Feld in der Klasse.

:zwinker:

SaFu 2. Sep 2008 16:10

Re: Datei in Benutzung
 
Mal blöd gefragt

Ich hab FFileStream1 Global deklariert und im ONClick ereigniss von der Filelistbox vorher

Delphi-Quellcode:
FFileStream1.Free;
geschrieben aber irgendwie wird sie nicht mehr freigegeben

Die Muhkuh 2. Sep 2008 16:11

Re: Datei in Benutzung
 
Delphi-Quellcode:
procedure TForm7.GridLaden;
var x, y, row, col,len :Word;
    Grid :TFileName;
    buff :string;
begin
  if FFileSteam1 <> nil then
    FFileStream1.Free;

  FFileStream1 := TFileStream.Create(FileListbox1.FileName, fmShareExclusive);

  FFileStream1.Read(row, SizeOf(Word));
  FFileStream1.Read(col, SizeOf(Word));

  for x:= 0 to row do
   for y:= 0 to col do
    begin
     FFileStream1.Read(len, SizeOf(Word));
     SetLength(buff, len);
     FFileStream1.Read(buff[1], len);
     StringGrid1.Cells[y,x]:= buff;
    end;
end;
Probiers mal so.

SaFu 2. Sep 2008 16:59

Re: Datei in Benutzung
 
Liste der Anhänge anzeigen (Anzahl: 1)
Irgendwie scheint sie trotzdem nicht richtig Freigegeben zu werden.

Wenn ich mit einer anderen Instanz versuche die Datei nochmal zu öffenen Kommt der Dialog das die Datei in Benutzung ist. soweit so gut.

Nur nach diesem Dialog kann ich garkeine Datei mehr öffnen und ich bekomm folgenden Fehler

DeddyH 2. Sep 2008 17:14

Re: Datei in Benutzung
 
Und in welcher Instanz? Wäre evtl. besser, eine kleine Text-Exe zu schreiben, die einfach nur versucht, die Datei nach dem Exklusiven Öffnen durch das Hauptprogramm zu laden.

SaFu 2. Sep 2008 17:20

Re: Datei in Benutzung
 
Mit instanz meine ich wenn ich die exe das 2 mal starte, hab mir gerade mal zuhause ein kleines Netzwek aufgebaut und das mal mit eionem 2 rechner ausprobiert ist aber der gleiche fehler

DeddyH 2. Sep 2008 17:21

Re: Datei in Benutzung
 
Und ich meine, welche Instanz löst den Fehler aus? Die erste, die die Datei offen hält, oder die zweite, die es auch versucht? Das dürfte schwierig sein, das herauszufinden, deshalb mein Vorschlag mit dem Testprogramm.

SaFu 2. Sep 2008 17:25

Re: Datei in Benutzung
 
die Zweite löst es aus wie gesagt beim erstenmal geht es aber ich darf die gesperrte Datei kein zweites mal versuchen zu öffnen

DeddyH 2. Sep 2008 17:33

Re: Datei in Benutzung
 
Dann zeig mal den Code des zweiten.

SaFu 2. Sep 2008 17:36

Re: Datei in Benutzung
 
Macht es eigentlich was aus, wenn die Datei in einem MemoryStream gespeichert wird

Delphi-Quellcode:
procedure TForm7.GridSpeichern;
var FileStream: TMemoryStream;
    Grid :TFileName;
    x, y, row, col,leng :Word;
    st :string;
begin
 Label3.Caption:= ComboBox1.Text;
  begin
   FileStream:= TMemoryStream.Create; //MemoryStream erzeugen

    col:= StringGrid1.ColCount -1; //Ab Spalte 0
    row:= StringGrid1.RowCount -1; //Ab Zeile 0

    FileStream.Write(row, SizeOf(Word)); // Zeilen zum Schreiben öffnen
    FileStream.Write(col, SizeOf(Word)); // Spalten zum schreiben öffnen

    for x:= 0 to row do //Alle Spalten in die Variable übergeben
      for y:= 0 to col do //Alle Zeilen in die Variable übergeben
       begin
        st:= StringGrid1.Cells[y,x];
        leng:= length(st);

        FileStream.Write(leng, SizeOf(Word));
        FileStream.Write(st[1], leng);
       end;
   Grid:= ShellTreeView1.SelectedFolder.PathName+'\'+ ComboBox4.Text +'.pla';

   FileStream.SaveToFile(Grid);
   FileStream.Free;
  end;
end;
Was meinst du mit Code des Zweiten

DeddyH 2. Sep 2008 17:39

Re: Datei in Benutzung
 
Beim 2. Programm tritt doch der Fehler auf. Dessen Code hätte ich gern gesehen.

SaFu 2. Sep 2008 17:51

Re: Datei in Benutzung
 
Hab ich mich wieder einmal so blöd ausgedrückt??

ich habe nur ein Programm das über das Netzwerk auf die Dateien zugreift und das über die FileListbox

Ich habe das Programm (Das gleiche Programm) auf 2 verschiedennen rechnern im Netz installiert

Und die Procedure zum Laden

steht in Post #19

mehr hab ich net

DeddyH 2. Sep 2008 17:59

Re: Datei in Benutzung
 
Dann wird der Fehler wohl beim Erzeugen des Streams auftreten (2 mal exklusiv geht eben nicht, das heißt ja exklusiv). Das müsste man abfangen.

jottkaerr 3. Sep 2008 06:08

Re: Datei in Benutzung
 
Ersetze im Quelltext von Posting #19
Delphi-Quellcode:
if FFileStream1 <> nil then
  FFileStream1.Free;
in den Zeilen 6 und 7 durch
Delphi-Quellcode:
FreeAndNil(FFileStream1);
Der Fehler tritt auf, weil beim dritten Versuch, die Datei zu öffnen, FFileStream immer noch ungleich nil ist.

jkr

Fuchtel 3. Sep 2008 06:16

Re: Datei in Benutzung
 
Folgendes habe ich mal irgendwo gefunden und setze es Erfolgreich ein:

Delphi-Quellcode:
function IsFileUsed(const FileName:String): Boolean;
const
  AccessMode: array[0..2] of LongWord = (
    GENERIC_READ,
    GENERIC_WRITE,
    GENERIC_READ or GENERIC_WRITE);
  ShareMode: array[0..4] of LongWord = (
    0,
    0,
    FILE_SHARE_READ,
    FILE_SHARE_WRITE,
    FILE_SHARE_READ or FILE_SHARE_WRITE);
var
  Mode : LongWord;
  iRes : INTEGER;
begin
  Mode := fmOpenRead or fmShareDenyWrite;
  iRes := -1;
  if ((Mode and 3)         <= fmOpenReadWrite) and
    (((Mode and $F0) shr 4) <= fmShareDenyNone) then
    iRes := Integer(CreateFile(PChar(FileName),
                      AccessMode[Mode and 3],
                      ShareMode[(Mode and $F0) shr 4],
                      nil,
                      OPEN_EXISTING,
                      FILE_ATTRIBUTE_NORMAL,
                      0));
    If iRes < 0 then
        Result := True
      else
        Result := False;
  If Not Result then CloseHandle(THandle(iRes));
end;
Am sichersten ist es, für ein und dasselbe Programm (be mehrmaligem Start), wenn man eine Datei mit ihren Attributen verriegelt

Gruß Fuchtel

DeddyH 3. Sep 2008 07:01

Re: Datei in Benutzung
 
Es würde doch genügen, nach dem Versuch, die Datei zu öffnen, zu prüfen, ob das auch funktioniert hat, bevor man damit arbeitet.

Die Muhkuh 3. Sep 2008 08:19

Re: Datei in Benutzung
 
Hallo,

nach einer kurzem Session im Teamviewer haben wir das mit FreeAndNil auch rausgefunden. Trotzdem danke :)


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