![]() |
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:
Gruß sascha
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; |
Re: Datei in Benutzung
Hi,
Du willst, wenn jemand anders diese Datei auch öffnen will, dass er die Meldung bekommt "Datei ist in Benutzung"? |
Re: Datei in Benutzung
Genau kurzgesagt
|
Re: Datei in Benutzung
Nimm einen TFilestream anstatt den TMemoryStream und als Modus nimmst Du fmShareExclusive
|
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; |
Re: Datei in Benutzung
Delphi-Quellcode:
Was ist das o.O
FFileStream1 := TFileStream.Create(FileListbox1.FileName, fmOpenRead, fmShareExclusive);
Delphi-Quellcode:
FFileStream1 := TFileStream.Create(FileListbox1.FileName, fmOpenRead or fmShareExclusive);
|
Re: Datei in Benutzung
Nee geht immernoch selbst wenn ich es so schreibe
Delphi-Quellcode:
FFileStream1 := TFileStream.Create(FileListbox1.FileName,fmShareExclusive);
|
Re: Datei in Benutzung
Zitat:
|
Re: Datei in Benutzung
Könnte es sein, dass "fmShareExclusive" nur solange eine Wirkung hat, bis die Instanz von FileStream wieder freigegeben wird? :zwinker:
|
Re: Datei in Benutzung
Davon ist auszugehen, wäre ja blöde, wenn nicht :mrgreen:
|
Re: Datei in Benutzung
Zitat:
|
Re: Datei in Benutzung
Eben, aber wer dieses
Zitat:
|
Re: Datei in Benutzung
Darfst halt keine lokale Variable nutzen, sondern ein Feld in der Klasse.
|
Re: Datei in Benutzung
Zitat:
Die Sperrung ist doch nur innerhalb der Methode "GridLaden" wirksam |
Re: Datei in Benutzung
Anscheinend will er sie aber so lange offen lassen, bis man eine neue Datei anwählt.
|
Re: Datei in Benutzung
Aha, na, dann muss "GridLaden" aber umgebaut werden...
|
Re: Datei in Benutzung
Zitat:
|
Re: Datei in Benutzung
Mal blöd gefragt
Ich hab FFileStream1 Global deklariert und im ONClick ereigniss von der Filelistbox vorher
Delphi-Quellcode:
geschrieben aber irgendwie wird sie nicht mehr freigegeben
FFileStream1.Free;
|
Re: Datei in Benutzung
Delphi-Quellcode:
Probiers mal so.
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; |
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 |
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.
|
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
|
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.
|
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
|
Re: Datei in Benutzung
Dann zeig mal den Code des zweiten.
|
Re: Datei in Benutzung
Macht es eigentlich was aus, wenn die Datei in einem MemoryStream gespeichert wird
Delphi-Quellcode:
Was meinst du mit Code des Zweiten
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; |
Re: Datei in Benutzung
Beim 2. Programm tritt doch der Fehler auf. Dessen Code hätte ich gern gesehen.
|
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 |
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.
|
Re: Datei in Benutzung
Ersetze im Quelltext von Posting #19
Delphi-Quellcode:
in den Zeilen 6 und 7 durch
if FFileStream1 <> nil then
FFileStream1.Free;
Delphi-Quellcode:
Der Fehler tritt auf, weil beim dritten Versuch, die Datei zu öffnen, FFileStream immer noch ungleich nil ist.
FreeAndNil(FFileStream1);
jkr |
Re: Datei in Benutzung
Folgendes habe ich mal irgendwo gefunden und setze es Erfolgreich ein:
Delphi-Quellcode:
Am sichersten ist es, für ein und dasselbe Programm (be mehrmaligem Start), wenn man eine Datei mit ihren Attributen verriegelt
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; Gruß Fuchtel |
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.
|
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 03:45 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz