AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Textdatei auf Verwendung prüfen
Thema durchsuchen
Ansicht
Themen-Optionen

Textdatei auf Verwendung prüfen

Ein Thema von alfred · begonnen am 1. Nov 2004 · letzter Beitrag vom 1. Nov 2004
Antwort Antwort
alfred

Registriert seit: 17. Mai 2004
31 Beiträge
 
#1

Textdatei auf Verwendung prüfen

  Alt 1. Nov 2004, 13:00
Hallo Leute,

gibt es eine Möglichkeit zu prüfen, ob eine Textdatei bereits von einem anderen Programm benutzt wird. Ich habe bereits folgenden Code probiert :

Delphi-Quellcode:
implementation

{$R *.dfm}

function TForm1.IsFileInUse(FileName: string): boolean;
var HFileRes: HFILE;
begin
  HFileRes:=CreateFile(PChar(FileName), GENERIC_READ or GENERIC_WRITE, 0, nil,
    OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
  result:=HFileRes=INVALID_HANDLE_VALUE;
  if not result then CloseHandle(HFileRes);
end;

procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
  if IsFileInUse('C:\Temp\Test.txt') then showmessage('Hallo Welt.');
end;
Dazu habe ich meine Testdatei mit dem Editor geöffnet und anschließend ein Programm mit dem Quellauszug laufen lassen. Leider tut sich da nichts.

Habt Ihr eine Ahnung wo mein Gedankenfehler ist ?

Besten Dank im voraus !

Gruß alfred
  Mit Zitat antworten Zitat
Benutzerbild von fiasko
fiasko

Registriert seit: 10. Dez 2002
Ort: Dresden
506 Beiträge
 
#2

Re: Textdatei auf Verwendung prüfen

  Alt 1. Nov 2004, 13:14
Hallo,

wenn du mit Editor die notepad.exe meinst wirst du wenig Erfolg haben, da imho dieser die Datei einmal komplett einließt und dann wieder schließt.
Thomas Liske
Posts comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
  Mit Zitat antworten Zitat
w3seek
(Gast)

n/a Beiträge
 
#3

Re: Textdatei auf Verwendung prüfen

  Alt 1. Nov 2004, 13:15
Zitat von alfred:
Habt Ihr eine Ahnung wo mein Gedankenfehler ist ?
Der Fehler ist, dass diese Methode lediglich prueft ob eine Datei geoeffnet werden kann. Diese Methode funktioniert nur, wenn ein Programm das gleichzeitige Schreiben oder Lesen der Datei fuer andere verbietet (share access) - NUR in diesem Fall wuerde dein Oeffnen-Versuch in der Funktion fehlschlagen (einmal von den anderen Fehlerquellen abgesehen). Die einzige mir bekannte Moeglichkeit herauszufinden ob die Datei von anderen Programmen geoffnet wird ist ueber den object manager der ntoskrnl, allerdings benoetigt man dazu einen (kleinen) Treiber
  Mit Zitat antworten Zitat
w3seek
(Gast)

n/a Beiträge
 
#4

Re: Textdatei auf Verwendung prüfen

  Alt 1. Nov 2004, 13:25
Ich muss mich korrigieren, man benoetigt keinen kernel mode code dazu, es gibt eine Funktion mit der man das auch direkt ermitteln kann, ich werde spaeter einen Code dazu hier posten, allerdings laeuft der nur auf NT/2k/XP-Systemen
  Mit Zitat antworten Zitat
alfred

Registriert seit: 17. Mai 2004
31 Beiträge
 
#5

Re: Textdatei auf Verwendung prüfen

  Alt 1. Nov 2004, 13:29
Hi w3seek,

das wäre eine feine Sache, wenn Du mir da einen Tipp geben könntest.
Schon mal vielen Dank im voraus.

Gruß alfred
  Mit Zitat antworten Zitat
w3seek
(Gast)

n/a Beiträge
 
#6

Re: Textdatei auf Verwendung prüfen

  Alt 1. Nov 2004, 14:03
Leider funktionierts nicht ganz so wie ich mir das vorgestellt hatte, ich bekomme immer 1 als Anzahl der Handles auf das Objekt, das Problem ist dass es sich bei normalen Datei-Objekten nicht um die Dateien selbst (FCBs) sondern um die Datei-Streams (CCBs) handelt. Man braeuchte daher erst einen handle auf so ein file object selbst (FCB) - das geht wohl nur im kernel mode und ist vom file system driver abhaengig. Die Datei-Handles die man bei der Programmierung sieht sind lediglich Handles auf Datei-Streams (CCB) und somit variiert die Anzahl der Handles auf diese Objekte nur dann wenn man sie z.b. mit DuplicateHandle() dupliziert. CreateFile() erstellt dagegen nur neue Datei-Streams (CCB) die mit einem einzigen file object (FCB) verknuepft sind. Somit ergibt der nachfolgende Code leider grundsaetzlich nur HandleCount=1 weil man ja lediglich den Stream Handle pruefen kann. An den FCB kommt man wohl nur mittels eines Treibers im Kernel Mode.

Ansonsten hier ist der Code mit dem man die Anzahl der geoeffneten Handles auf einen system-handle (z.b. File Stream (CCB)) herausfinden kann:

Delphi-Quellcode:
const
  ObjectBasicInformation = 0;

type
  NTSTATUS = Integer;
  TOBJECT_BASIC_INFORMATION = record
    Attributes: ULONG;
    GrantedAccess: Cardinal;
    HandleCount: ULONG;
    PointerCount: ULONG;
    PagedPoolUsage: ULONG;
    NonPagedPoolUsage: ULONG;
    Reserved: array[0..2] of ULONG;
    NameInformationLength: ULONG;
    TypeInformationLength: ULONG;
    SecurityDescriptorLength: ULONG;
    CreateTime: TLargeInteger;
  end;
  POBJECT_BASIC_INFORMATION = ^TOBJECT_BASIC_INFORMATION;

function NtQueryObject(Handle: THandle;
                       ObjectInformationClass: Cardinal;
                       ObjectInformation: Pointer;
                       ObjectInformationLength: ULONG;
                       ReturnLenth: PULONG): NTSTATUS; stdcall; external 'ntdll.dll';

function GetObjectHandleCount(Handle: THandle; var HandleCount: Cardinal): Boolean;
var
  obi: TOBJECT_BASIC_INFORMATION;
begin
  Result := NtQueryObject(Handle, ObjectBasicInformation, @obi, SizeOf(TOBJECT_BASIC_INFORMATION), nil) >= 0;
  if Result then
  begin
    HandleCount := obi.HandleCount;
  end;
end;
Ein Beispiel zur Benutzung der Funktion GetObjectHandleCount():
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  hFile: THandle;
  HandleCount: Cardinal;
begin
  hFile := CreateFile('c:\test.txt', GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE or FILE_SHARE_DELETE, nil,
                      OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
  if hFile <> INVALID_HANDLE_VALUE then
  begin
    if GetObjectHandleCount(hFile, HandleCount) then
    begin
      ShowMessage(inttostr(HandleCount));
    end;
    CloseHandle(hFile);
  end;
end;
Wie gesagt, bei Datei-Handles gibt die Funktion i.d.r. 1 zurueck (ausser man dupliziert das Handle mittels DuplicateHandle()). Die Funktion ist auch auf andere Handle-Typen anwendbar, z.b. Desktops (HDESK), Window Stations (HWINSTA), Jobs (HJOB), Mutexes, Semaphores, ... - nicht jedoch user handles wie HWNDs und gdi handles!
  Mit Zitat antworten Zitat
alfred

Registriert seit: 17. Mai 2004
31 Beiträge
 
#7

Re: Textdatei auf Verwendung prüfen

  Alt 1. Nov 2004, 14:27
Hi w3seek,

danke für den Ansatz. Ich werde mal sehen, was ich daraus machen kann. Das ist auf jeden Fall eine Richtung, in die ich mich nicht allein bewegt hätte.

Gruß alfred
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:58 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