Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Gelockte Datei trotzdem lesen (https://www.delphipraxis.net/156846-gelockte-datei-trotzdem-lesen.html)

himitsu 17. Dez 2010 07:38

AW: Gelockte Datei trotzdem lesen
 
OK, du könntest es ja auch mal über MSDN-Library durchsuchenLockFileEx versuchen?

Zitat:

Zitat von MSDN
To specify additional options, for example creating a shared lock or for block-on-fail operation, use the LockFileEx function.


Stefan H 17. Dez 2010 07:54

AW: Gelockte Datei trotzdem lesen
 
LockFileEx zeigt das selbe Verhalten: Notepad kanns öffnen, über Delphi schaff ichs nicht die Datei zu lesen.

himitsu 17. Dez 2010 08:00

AW: Gelockte Datei trotzdem lesen
 
Zitat:

Zitat von Stefan H (Beitrag 1069041)
LockFileEx zeigt das selbe Verhalten: Notepad kanns öffnen, über Delphi schaff ichs nicht die Datei zu lesen.

Und wie genau sieht nun dein DesiredAccess/ShareMode aus?

Stefan H 17. Dez 2010 08:01

AW: Gelockte Datei trotzdem lesen
 
Zitat:

Zitat von himitsu (Beitrag 1069042)
Zitat:

Zitat von Stefan H (Beitrag 1069041)
LockFileEx zeigt das selbe Verhalten: Notepad kanns öffnen, über Delphi schaff ichs nicht die Datei zu lesen.

Und wie genau sieht nun dein DesiredAccess/ShareMode aus?

Ich hab alle Kombinationen durch :)

himitsu 17. Dez 2010 08:03

AW: Gelockte Datei trotzdem lesen
 
Zitat:

Zitat von Stefan H (Beitrag 1069044)
Ich hab alle Kombinationen durch :)

Und Welche?

Vielleicht machst du ja was falsch? Und deswegen fragte ich ja auch danach.

Stefan H 17. Dez 2010 08:21

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:
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;
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.

Edit: Sorry, musste sie nochmal kurz rausnehmen, ist jetzt wieder drin.

Lemmy 17. Dez 2010 09:08

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

Assarbad 17. Dez 2010 10:01

AW: Gelockte Datei trotzdem lesen
 
Zitat:

Zitat von TBx (Beitrag 1069029)
äähm, warum verwendest Du nicht eine solche? Genau für solche Fälle ist doch das Transaktionshandling von Datenbanken da! :gruebel:

Wenn man aber die DB selber implementiert, wird's schon schwieriger, oder? Es sei denn man hat Vista und Dateitransaktionen.

Zitat:

Zitat von himitsu (Beitrag 1069030)
@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.

Das gilt aber für die gesamte Datei. Wenn ich die Aufgabenstellung korrekt verstehe, geht es ihm um eine Differenzierung der Zugriffsmöglichkeiten zwischen einzelnen Threads. Wobei der Sinn mal dahingestellt bleibt (das wäre so wie wenn man einem Treiber verordnete weniger Zugriffsmöglichkeiten zu haben als ein anderer Treiber, da alle in der TCB laufen, ist das aber unsinnig).

Also wie gesagt, erfahrungsgemäß wirst du ohne MFT-Zugriff nicht hinkommen und für diesen brauchste Adminrechte. Fakt. :stupid:

Stefan H 17. Dez 2010 10:51

AW: Gelockte Datei trotzdem lesen
 
Zitat:

Zitat von Lemmy (Beitrag 1069055)
Warum verwendest Du denn nicht TFileStream? Da kannst Du doch sehr schön einstellen wer was wann mit der Datei machen darf...

Ja, aber das gilt ja nur wieder für die ganze Datei, und ich muss einen einzelnen Datensatz innerhalb der Datei für Schreibzugriffe sperren können.

Zitat:

Zitat von Assarbad (Beitrag 1069060)
Wenn ich die Aufgabenstellung korrekt verstehe, geht es ihm um eine Differenzierung der Zugriffsmöglichkeiten zwischen einzelnen Threads. Wobei der Sinn mal dahingestellt bleibt (das wäre so wie wenn man einem Treiber verordnete weniger Zugriffsmöglichkeiten zu haben als ein anderer Treiber, da alle in der TCB laufen, ist das aber unsinnig).
Also wie gesagt, erfahrungsgemäß wirst du ohne MFT-Zugriff nicht hinkommen und für diesen brauchste Adminrechte.

Eigentlich ist mein Wunsch ganz einfach: Ein Prozess soll einen Datensatz zum bearbeiten, also für schreibenden Zugriff, anfordern können. Das muss ich den anderen Prozessen irgendwie mitteilen, damit kein zweiter mehr daherkommt und ebenfalls reinschreibt. Außerdem will ich aber, und das ist das ungewöhnliche an der Sache, den selben Datensatz, während er vom einen Prozess für Schreibzugriffe gesperrt ist, lesen können. Mit allen Risiken die dabei entstehen können, wie dass der eine Prozess einen halb alten und halb neuen Datensatz liest, weil der andere gerade währenddessen reinschreibt.

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 ;)

Assarbad 17. Dez 2010 11:12

AW: Gelockte Datei trotzdem lesen
 
Zitat:

Zitat von Stefan H (Beitrag 1069068)
Eigentlich ist mein Wunsch ganz einfach: Ein Prozess soll einen Datensatz zum bearbeiten, also für schreibenden Zugriff, anfordern können. Das muss ich den anderen Prozessen irgendwie mitteilen, damit kein zweiter mehr daherkommt und ebenfalls reinschreibt. Außerdem will ich aber, und das ist das ungewöhnliche an der Sache, den selben Datensatz, während er vom einen Prozess für Schreibzugriffe gesperrt ist, lesen können. Mit allen Risiken die dabei entstehen können, wie dass der eine Prozess einen halb alten und halb neuen Datensatz liest, weil der andere gerade währenddessen reinschreibt.

Und warum können sich deine Prozesse nicht an eine Konvention halten und bspw. per Mutex oder Semaphore den Zugriff regeln?

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ß MSDN-Library durchsuchenLockfile den Zugriff für andere Prozesse komplett verhindert. Der eigene Prozeß darf aber weiterhin zugreifen. Also selbst bei deiner neuesten Problembeschreibung sehe ich kein Problem. Wenn der einzige Prozeß welcher schreibend zugreift die Datei mit GENERIC_READ öffnet, dürfen alle anderen weiterhin lesen. Und siehe da, es klappt. Wenn die Prozesse welche schreibend zugreifen dürfen wechseln, solltest du entweder dein Design komplett überdenken oder dich ernsthaft mit IPC-Mechanismen auseinandersetzen.

Zitat:

Zitat von Stefan H (Beitrag 1069068)
Und ich kann nicht glauben, dass es dafür keine Lösung gibt, weil Notepad mir die entsprechenden Dateien ohne irgendeine Meldung anzeigt.

Ja und? Du gibst schließlich FILE_SHARE_READ mit. Natürlich können andere Prozesse es dann lesen.

Zitat:

Zitat von Stefan H (Beitrag 1069068)
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 ;)

Dazu braucht's nur einen Disassembler und RCE-Kenntnisse. Wenn ich mich recht entsinne, benutzten die MMFs, da diese eben auch ermöglichen große Dateien halbwegs performant zu öffnen.

Zuguterletzt kannst du nachgucken wie Bei Google suchenSQLite es macht, denn dort funktioniert es auch ohne die Vista-APIs und die Lösung steht damit bereit. Aber die absolut einfachste Methode ist es einfach SQLite zu benutzen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:43 Uhr.
Seite 2 von 3     12 3      

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