Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Datei in Benutzung -> Sperren (https://www.delphipraxis.net/136288-datei-benutzung-sperren.html)

MCXSC 27. Jun 2009 00:39


Datei in Benutzung -> Sperren
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi,

jeder kennt es wahrscheinlich: Man versucht eine Datei zu löschen, und merkt (dank umfangreicher Dialogboxen), dass die Datei bereits aktuell in Benutzung ist und daher (temporär) "gesperrt" wurde.

Ich habe Google schon masakriert, aber die Dame ist heute wohl etwas zickig... Jemand hier eine Idee, wie man so etwas bewerkstelligen kann?

Hafe vun,
MCXSC

Luckie 27. Jun 2009 00:56

Re: Datei in Benutzung -> Sperren
 
Öffne die Datei exklusiv.

Fridolin Walther 27. Jun 2009 00:57

Re: Datei in Benutzung -> Sperren
 
MSDN-Library durchsuchenCreateFile ... die Absätze über die Share Modes sind für Dich interessant. Ebenfalls interessant: MSDN-Library durchsuchenLockFile.

Luckie geht wohl auch niemals schlafen :(.

MCXSC 27. Jun 2009 01:02

Re: Datei in Benutzung -> Sperren
 
Zitat:

Zitat von Fridolin Walther
MSDN-Library durchsuchenCreateFile ... die Absätze über die Share Modes sind für Dich interessant. Ebenfalls interessant: MSDN-Library durchsuchenLockFile.

Super danke! Wenigstens hab ich jetzt was, wonach ich suchen kann. :)

Zitat:

Zitat von Fridolin Walther
Luckie geht wohl auch niemals schlafen :(.

Du doch scheinbar auch nicht.^^

Luckie 27. Jun 2009 01:04

Re: Datei in Benutzung -> Sperren
 
Luckie hat Urlaub und das wird ausgenutzt, da wird die Nacht zum Tag. ;)

MCXSC 27. Jun 2009 01:11

Re: Datei in Benutzung -> Sperren
 
Zitat:

Zitat von Luckie
Luckie hat Urlaub und das wird ausgenutzt, da wird die Nacht zum Tag. ;)

Kenn ich irgendwo her... :D

Ich habe nun zwei Möglichkeiten gefunden: Einmal mit einem gewissen OpenFile und einmal mit LockFileEx/UnlockFileEx. Sollte man eines davon bevorzugen?

//Edit: Okay, habe mir nun mal etwas "zusammengebastelt":

Delphi-Quellcode:
//zum sperren
var
  lf_FileSize: Integer;
  lf_FileHandle: THandle;
begin
  lf_FileHandle := CreateFile(PChar(Datei), GENERIC_WRITE, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
  lf_FileSize:= GetFileSize(lf_FileHandle, nil);
  LockFile(lf_FileHandle, 0, 0, lf_FileSize, 0);
  CloseHandle(lf_FileHandle);
end

//zum entsperren
var
  lf_FileSize: Integer;
  lf_FileHandle: THandle;
begin
  lf_FileHandle := CreateFile(PChar(Datei), GENERIC_WRITE, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
  lf_FileSize:= GetFileSize(lf_FileHandle, nil);
  UnlockFile(lf_FileHandle, 0, 0, lf_FileSize, 0);
  CloseHandle(lf_FileHandle);
end;
Und dabei bekomme ich (zumindest bis zum sperren kommt er :D) die Fehlermeldung "Systemfehler. Code: 6. Das Handle ist ungültig."

JanW 27. Jun 2009 06:38

Re: Datei in Benutzung -> Sperren
 
Also bei mir geht dein Code. Probier doch mal ne andere Datei zu sperren.
Hab zwar fpc/lazarus aber das runft ja auch nur die <winAPI auf

Gruß,
Jan

MCXSC 27. Jun 2009 13:29

Re: Datei in Benutzung -> Sperren
 
Zitat:

Zitat von JanW
Also bei mir geht dein Code. Probier doch mal ne andere Datei zu sperren.
Hab zwar fpc/lazarus aber das runft ja auch nur die <winAPI auf

Ah, okay. War wohl etwas spät die Nacht (vergessen, vorher die Variable Datei zu "füllen"). ^^

himitsu 27. Jun 2009 14:33

Re: Datei in Benutzung -> Sperren
 
Zitat:

Zitat von MCXSC
Und dabei bekomme ich (zumindest bis zum sperren kommt er :D) die Fehlermeldung "Systemfehler. Code: 6. Das Handle ist ungültig."

Vielleicht solltest du es dir nochmal genau durchlesen?
MSDN-Library durchsuchenLockFile

Damit kann man nur, wärend die Datei geöffnet ist, einen "Teil" oder Alles einer Datei sperren.

Delphi-Quellcode:
var
  lf_FileSize: Integer;
  lf_FileHandle: THandle;
begin
  lf_FileHandle := CreateFile(PChar(Datei), GENERIC_WRITE, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
  lf_FileSize:= GetFileSize(lf_FileHandle, nil);
  LockFile(lf_FileHandle, 0, 0, lf_FileSize, 0);
  ...
  UnlockFile(lf_FileHandle, 0, 0, lf_FileSize, 0);
  CloseHandle(lf_FileHandle);
end;

MCXSC 27. Jun 2009 14:43

Re: Datei in Benutzung -> Sperren
 
Zitat:

Zitat von himitsu
Damit kann man nur, wärend die Datei geöffnet ist, einen "Teil" oder Alles einer Datei sperren.

Habe doch schon geschrieben, dass es klappt. Die Variable "Datei" war bei mir nur leer, was zu dem Fehler geführt hat...

kaka77 16. Sep 2010 22:54

AW: Datei in Benutzung -> Sperren
 
hi,


sieht alles ganz schick aus.

nur was mach ICH falsch? wenn ich versuche 'c:\windows\system32\config\SAM' zu unlocken, klappts natürlich nicht. jemand nie idee oder einen alternative lösungsansatz?
also entweder würd ich die datei öffnwen oder kopieren...jedenfalls irgendwie an den inhalt rankommen...

danke!

Luckie 16. Sep 2010 22:58

AW: Datei in Benutzung -> Sperren
 
Du weißt schon, was in da drin steht? Und was würde es für die Sicherheit bedeuten, wenn man die Datei einfach kopieren könnte?

Ich gehe mal davon aus, dass dir die nötigen Rechte fehlen. Und ob man sich die als Administrator holen kann, weiß ich jetzt nicht.

Dezipaitor 17. Sep 2010 09:21

AW: Datei in Benutzung -> Sperren
 
Du kannst es nicht "unlocken".

Es wurde mit CreateFile und dwShareMode = 0 von Windows geöffnet.

Zitat:

Prevents other processes from opening a file or device if they request delete, read, or write access.

Luckie 17. Sep 2010 09:28

AW: Datei in Benutzung -> Sperren
 
Zitat:

Zitat von Dezipaitor (Beitrag 1050240)
Du kannst es nicht "unlocken".

Es wurde mit CreateFile und dwShareMode = 0 von Windows geöffnet.

Das kommt noch hinzu und das ist auch gut so.

kaka77 17. Sep 2010 09:54

AW: Datei in Benutzung -> Sperren
 
danke für die antworten.

aber gerade weil diese datei doch mit dwShareMode = 0 geöffnet wurde, müsste sie doch freigegeben werden um drauf zugreifen zu können ?!

gibt es nicht ne möglich keit die bytes von der festplatte auszulesen? also ohne die datei an sich erst mit reset oder createstream zu öffnen? indem man vielleicht erst im dateisystem nachschaut, wo sie anfängt und aufhört?

schönes wochenende

Luckie 17. Sep 2010 10:05

AW: Datei in Benutzung -> Sperren
 
Zitat:

Zitat von kaka77 (Beitrag 1050246)
danke für die antworten.

aber gerade weil diese datei doch mit dwShareMode = 0 geöffnet wurde, müsste sie doch freigegeben werden um drauf zugreifen zu können ?!

Eben nicht:
Zitat:

Prevents other processes from opening a file or device if they request delete, read, or write access.
Zitat:

gibt es nicht ne möglich keit die bytes von der festplatte auszulesen? also ohne die datei an sich erst mit reset oder createstream zu öffnen? indem man vielleicht erst im dateisystem nachschaut, wo sie anfängt und aufhört?
Klar geht das. Nur glaube ich kaum, dass du das umsetzen können wirst. Ehrlich gesagt kenne ich nur zwei Delphiprogrammierer denen ich das zutrauen würden. Man kann die Festplatte so zu sagen im Raw-Modus mit CreateFile öffnen, um ein Image zu erstellen oder zu schreiben. Wenn du aus dem MFT den Sektor/Cluster hast musst du nur zur entsprechenden Stelle springen.

Was hast du mit der Datei eigentlich vor? Ich kann mir keinen sinnvollen Grund vorstellen wozu man sie öffnen können müsste.

Dezipaitor 17. Sep 2010 10:13

AW: Datei in Benutzung -> Sperren
 
Einfacher geht es, die Datei von einem anderen System aus zu lesen. Sollte eigentlich gehen.

PS.
mit ShareMode = 0 sollte man normalerweise mit Backup Privilegien trotzdem zugreifen können. Aber diese Datei ist die Ausnahme.

Sir Rufo 17. Sep 2010 10:52

AW: Datei in Benutzung -> Sperren
 
Zitat:

Zitat von Luckie (Beitrag 1050248)
Was hast du mit der Datei eigentlich vor? Ich kann mir keinen sinnvollen Grund vorstellen wozu man sie öffnen können müsste.

Kann es sein, dass Hackervolk anwesend ist? :mrgreen:

Luckie 17. Sep 2010 11:01

AW: Datei in Benutzung -> Sperren
 
Zitat:

Zitat von Sir Rufo (Beitrag 1050257)
Kann es sein, dass Hackervolk anwesend ist? :mrgreen:

Jeder nur ein Kreuz.


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