![]() |
Gelockte Datei trotzdem lesen
Hallo,
ich habe folgendes Problem: Ich will Teile einer Datei sperren, so dass nur ein Thread Schreibzugriff hat. Die anderen Threads/Programme sollen aber trotzdem auf diesen Bereich zugreifen können (auch auf die Gefahr hin, dass im entsprechenden Bereich dann Müll steht). Bisheriger Ansatz: Ich öffne die Datei per:
Code:
Wobei ich mit Sharemode und desiredaccess bereits alle Varianten durchgespielt habe.
FileHandle:=Integer(Windows.CreateFile(PChar(editDateinamen.Text),
DesiredAccess, ShareMode, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0) ); Anschließend wird der entsprechende Bereich gesperrt:
Code:
Egal was ich jetzt mache, und wie ich mit den Attributen des zweiten Programms spiele, ich kann nicht mehr auf diesen Bereich zugreifen.
Windows.LockFile(FileHandle,o.Offset,o.OffsetHigh,128,0);
Ansich wäre das soweit ja logisch, allerdings kann ich die Datei problemlos mit notepad öffnen und ansehen. Erst beim Speichern kommt es zum Fehler, dass die Date von einem anderen Prozess verwendet wird. Genau dieses Verhalten möchte ich nachbilden. Ich will aus meine Programm heraus trotz des Locks zugreifen, speichern will ich an dieser Stelle sowieso nicht. Dieser Hexeditor kann das beispielsweise auch: ![]() Das hier habe ich dazu auch noch gefunden, kanns aber irgendwie nicht nachbauen, so dass es funktionieren würde: ![]() Wenn irgendjemand eine Idee für mich hätte wäre ich dankbar :) |
AW: Gelockte Datei trotzdem lesen
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
So, mal kurz installiert: Den Nachweis bzgl. erforderlichen Rechte findest du als angehängtes Bild. Meine Theorie wäre, daß dort die MFT geparst und die Cluster ermittelt werden welche der Datei gehören und diese dann ggf. ungecacht geschrieben werden. |
AW: Gelockte Datei trotzdem lesen
Zitat:
|
AW: Gelockte Datei trotzdem lesen
Zitat:
Jetzt weiß ich wie du diese Menge Beiträge zusammenbekommen hast :lol: |
AW: Gelockte Datei trotzdem lesen
Vielleicht bin ich pedantisch, aber ich habe gehört, dass eine gute, exakte Problembeschreibung manchmal recht hilfreich sein soll beim Helfen. Darauf wollte ich eigentlich hinweisen. Und wenn man sich dann mal hinsetzt und versucht sein Problem mal klar und verständlich zu formulieren, dann kommt man manchmal schon von alleine auf die Lösung oder man stellt fest, dass die Formulierung Mist ist.
|
AW: Gelockte Datei trotzdem lesen
Schon klar, aber verständlich war es schon. Er wollte eine Dateisperre umgehen.
Kritik ist da bei anderen Fragestellungen wo man nichtmal Kontext geboten bekommt und wo der Fragesteller danach die Diskutanten mit jeweils einem Satz in der Antwort (dafür aber x Antworten) abfrühstückt eher angebracht. |
AW: Gelockte Datei trotzdem lesen
Guten Morgen,
danke schonmal soweit für die Antworten. Um das nochmal zu konkretisieren: Ich habe eine Anwendung, in der sehr viele Daten in eine Datei geschrieben werden (eigentlich eine Datenbank). Dabei muss sichergestellt sein, dass immer alle Daten geschrieben werden können, die zu einer Transaktion gehören. Daher wird, wenn ein Datensatz schreibend angefordert wird, der entsprechende Datensatz exklusiv gelockt. Das Ganze wird aber sehr langsam, wenn jemand eine Routine ausführt, die zwischen dem Laden und dem Speichern viele Berechnungen durchführt. In dieser Zeit können andere Nutzer nicht auf diesen Datensatz zugreifen, also auch keine Auswertungen machen, bei denen es nicht so tragisch wäre, wenn ein Datensatz Müll ist, weil gerade in diesem Moment der Schreibzugriff stattfindet. Daher brauche ich einerseits die Möglichkeit den Datensatz zu locken, damit keine zwei Prozesse zeitgleich schreiben können, andererseits kann ich dann (was für die meisten Andwendungen auch Sinn macht, für mich jedoch nicht) nicht mehr lesend auf den Datensatz zugreifen. Ich könnte mich ja damit abfinden, dass das auf diesem Weg nicht geht, allerdings kann ich nicht akzeptieren, dass so ein kleines Programm wie Notepad diese Dateien einfach so öffnen kann :) Kurzgesagt: Ich suche einen Weg, der mir einen Dateizugriff so ermöglicht wie Notepad ihn macht. Assarbad hat das ganz gut zusammen gefasst Zitat:
Ich hoffe, dass es damit etwas klarer geworden ist? |
AW: Gelockte Datei trotzdem lesen
Zitat:
|
AW: Gelockte Datei trotzdem lesen
Wenn man eine Datei "offiziell" für Schreibzugriffe sperren will, dann offnet man sie und gewährt bei ShareMode nur den Lesezugriff.
> über andere Datei-Handle (also auch andere Programme) kann man die Datei auslesen > aber schreiben und löschen kann dann kein Anderer. @Assarbad: ich müßte mal probieren, ob mein XP-Trick noch geht ... jedenfalls konnte ich unter XP eine Datei öffnen (ohne Adminrechte und sonstige Tricks) und andere Programme konnten diese Datei (danach) dennoch exclisiv öffnen. |
AW: Gelockte Datei trotzdem lesen
@TBx: Wir können das Projekt nicht mal eben kurz auf eine Datenbank umstellen, das wäre eine Aufgabe von Jahren :)
Code:
Ja, das Problem ist aber ja, das nur einzelne Bereiche (eben immer genau ein Datensatz) gesperrt werden muss, die anderen Datensätz müssen weiterhin beschreibbar sein. Ich muss also beim ShareMode Read und Write setzen, und dann die Bereiche per Lockfile sperren.
Wenn man eine Datei "offiziell" für Schreibzugriffe sperren will, dann offnet man sie und gewährt bei ShareMode nur den Lesezugriff.
|
AW: Gelockte Datei trotzdem lesen
OK, du könntest es ja auch mal über
![]() Zitat:
|
AW: Gelockte Datei trotzdem lesen
LockFileEx zeigt das selbe Verhalten: Notepad kanns öffnen, über Delphi schaff ichs nicht die Datei zu lesen.
|
AW: Gelockte Datei trotzdem lesen
Zitat:
|
AW: Gelockte Datei trotzdem lesen
Zitat:
|
AW: Gelockte Datei trotzdem lesen
Zitat:
Vielleicht machst du ja was falsch? Und deswegen fragte ich ja auch danach. |
AW: Gelockte Datei trotzdem lesen
Liste der Anhänge anzeigen (Anzahl: 1)
DesiredAcces wird nach folgendem Schema befüllt (die Form hat checkboxen über die ich auswählen kann wie ich die Datei öffnen will):
Code:
Ich hab das ganze Testprojekt mal angehängt, als Delphi 2006 Version. Kann problemlos auf XE überführt werden, nur kam bei mir eine Meldung, dass ein Verweis nicht mehr gültig sei. Den einfach entfernen.
procedure TformLockReadable.buttonOpenClick(Sender: TObject);
var DesiredAccess: Cardinal; ShareMode: Cardinal; begin if FileHandle<>INVALID_HANDLE_VALUE then exit; DesiredAccess:=0; if checkboxAccessRead.Checked then DesiredAccess:=DesiredAccess or GENERIC_READ; if checkboxAccessWrite.Checked then DesiredAccess:=DesiredAccess or GENERIC_WRITE; ShareMode:=0; if checkboxShareRead.Checked then ShareMode:=ShareMode or FILE_SHARE_READ; if checkboxShareWrite.Checked then ShareMode:=ShareMode or FILE_SHARE_WRITE; FileHandle:=Integer(Windows.CreateFile(PChar(editDateinamen.Text), DesiredAccess, ShareMode, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0) ); //FileHandle:=FileOpen(editDateinamen.Text,fmOpenReadWrite or fmShareDenyNone); if FileHandle=INVALID_HANDLE_VALUE then Showmessage(Format('Fehler beim Öffnen: %d',[GetLastError])); EnableButtons; ReadOnlyLocked:=False; end; Edit: Sorry, musste sie nochmal kurz rausnehmen, ist jetzt wieder drin. |
AW: Gelockte Datei trotzdem lesen
Hi,
vielleicht verstehe ich das Problem nicht ganz: Warum verwendest Du denn nicht TFileStream? Da kannst Du doch sehr schön einstellen wer was wann mit der Datei machen darf... Und wenn die anderen Anwendungen auch von dir kommen, dann kannst Du doch ebenfalls darauf reagieren und nur mit einem Lese-Zugriff die Datei holen.... Grüße |
AW: Gelockte Datei trotzdem lesen
Zitat:
Zitat:
Also wie gesagt, erfahrungsgemäß wirst du ohne MFT-Zugriff nicht hinkommen und für diesen brauchste Adminrechte. Fakt. :stupid: |
AW: Gelockte Datei trotzdem lesen
Zitat:
Zitat:
Und ich kann nicht glauben, dass es dafür keine Lösung gibt, weil Notepad mir die entsprechenden Dateien ohne irgendeine Meldung anzeigt. Wenn Windows ein Opensource-Projekt wäre, würde ich ja einfach nachschauen wie Notepad die Dateien öffnet, aber ganz so einfach ist es ja nciht ;) |
AW: Gelockte Datei trotzdem lesen
Zitat:
Nochmals: wenn du es machst wie Filehex, mußt du die MFT parsen und brauchst Adminrechte. Zusätzlich agierst du dabei am Dateisystemtreiber vorbei, womit du ein sehr seeeeehr riskantes Spielchen mit deinen Daten spielst. Und Datenintegrität ist üblicherweise eine der der Grundsäulen des Datenbankdesigns. Abgesehen davon scheinst du zu übersehen, daß ![]() Zitat:
Zitat:
Zuguterletzt kannst du nachgucken wie ![]() |
AW: Gelockte Datei trotzdem lesen
Danke für das Stichwort mit den Mutexen, das könnte wirklich eine Lösung sein. Die Dateisperrenlösung hatte zwar den Charme, dass dann auch Programme die nicht von uns sind nicht darauf zu greifen können, aber das ist verschmerzbar.
Zitat:
Zitat:
Mal sehen wie das mit den Mutexen läuft, wenn das klappt bin ich durchaus erstmal zufrieden ;) Danke soweit schonmal an alle, insbesondere natürlich an dich, Assarbad! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:06 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