![]() |
Liste aller geöffneten Dateien
Hallo,
Ich bin mir nicht sicher ob wir das schon einmal hatten, ich finde leider nichts dazu. Ich möchte gerne eine Liste aller geöffneten Dateien erstellen (WinNT) oder 2. Lösung wenn ich einen Dateinamen angebe, möchte ich feststellen ob diese Datei geöffnet ist. Wer kann mir helfen? p.s. Ich meine alle geöffneten Dateien, nicht nur die exklusiv geöffneten. |
Re: Liste aller geöffneten Dateien
Moin Armin,
schau Dir mal im PSDK die APIs NetFileEnum und NetFileGetInfo an. Hilft vielleicht weiter. |
Re: Liste aller geöffneten Dateien
Hallo,
ich nutze für dein Problem folgende Functio, vieleicht Hilft diese dir weiter . function IsFileInUse(FileName: string): boolean; var TestFile: HFILE; begin TestFile:=CreateFile(PChar(FileName), GENERIC_READ or GENERIC_WRITE, 0, nil,OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); result:=TestFile=INVALID_HANDLE_VALUE; if not result then CloseHandle(TestFile); end; Gruß Orion3000 |
Re: Liste aller geöffneten Dateien
Moin Orion,
das funktioniert allerdings nur, wenn die Datei exklusiv geöffnet wurde. |
Re: Liste aller geöffneten Dateien
Hallo Christian,
ich habe mir im PSDK die APIs NetFileEnum und NetFileGetInfo angesehen und im Usenet Codesnippets zusammenkopiert (ich weiß, ich weiß, -Pfui, aber wie soll ich es sonst lernen?), allerdings gelingt es mir nicht eine Liste zu erstellen (der Pointer auf "buffer" bleibt leer). Lt. PSDK ist der lokale Computer gemeint, wenn user und server NUL sind.
Delphi-Quellcode:
UNIT Unit1;
INTERFACE USES Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; TYPE TForm1 = CLASS(TForm) Button1: TButton; ListBox1: TListBox; PROCEDURE Button1Click(Sender: TObject); PRIVATE { Private declarations } PUBLIC { Public declarations } END; TYPE NetAPIStatus = Integer; FILE_INFO_3 = RECORD fi3_id: Integer; fi3_permissions: Integer; fi3_num_locks: Integer; fi3_pathname: PWideChar; fi3_username: PWideChar END; PFILE_INFO_3 = ^FILE_INFO_3; FUNCTION NetFileEnum( serverName, basePath, userName: PWideChar; level: Integer; VAR bufPtr: PWideChar; prefmaxlen: Integer; VAR entriesread, totalentries, resumeHandle: Integer ): NetAPIStatus; stdcall; FUNCTION NetApiBufferFree(buffer: Pointer): NetAPIStatus; stdcall; VAR Form1 : TForm1; CONST MAX_PREFERRED_LENGTH = -1; NERR_Success = 0; IMPLEMENTATION FUNCTION NetFileEnum; EXTERNAL 'NETAPI32.DLL'; FUNCTION NetApiBufferFree; EXTERNAL 'NETAPI32.dLL'; {$R *.dfm} PROCEDURE ListFiles(CONST server, user: STRING; list: TStrings); VAR wUser : WideString; wServer : WideString; err : Integer; i, NIL_HANDLE, entriesRead, totalEntries: INTEGER; buffer : pointer; info : PFILE_INFO_3; BEGIN wUser := user; wServer := server; err := NetFileEnum( NIL, // PWideChar(wServer), NIL, NIL, // PWideChar(wUser), 3, PWideChar(buffer), MAX_PREFERRED_LENGTH, entriesRead, totalEntries, NIL_HANDLE); IF err = NERR_Success THEN TRY info := PFILE_INFO_3(buffer); FOR i := 0 TO entriesRead - 1 DO BEGIN list.Add(info^.fi3_pathname); Inc(info) END FINALLY NetAPIBufferFree(buffer) END ELSE RAISE Exception.CreateFmt('Error %d enumerating files', [err]) END; PROCEDURE TForm1.Button1Click(Sender: TObject); BEGIN ListFiles('', '', ListBox1.Items); END; END. |
Re: Liste aller geöffneten Dateien
Moin Armin,
dann will ich mal "kurz" meinen Senf dazu geben ;-) Allerdings: Auf meinem lokalen Rechner geht's, ohne Fehlermeldung, auch nicht, nur auf anderen Rechnern, wenn ich die entsprechenden Berechtigungen habe. Die Ursache dafür ist mir auch noch nicht klar.
Delphi-Quellcode:
Was übrigens immer besonders wichtig ist bei diesen ganzen NetXXXX Funktionen: Als Buffer muss immer die Adresse eines Pointers angegeben werden. Damit ich bei so etwas nicht die Übersicht verliere, hab' ich mir angewöhnt meine Funktionsdeklarationen für API Aufrufe C und nicht borlandtypisch zu erstellen, also immer ohne var Parameter. Dann ist es auch leichter Beispiele zu übersetzen.
const
NERR_Success = 0; // Success MAX_PREFERRED_LENGTH = DWORD(-1); type NET_API_STATUS = DWORD; PFILE_INFO_2 = ^FILE_INFO_2; FILE_INFO_2 = packed record fi2_id : DWord; end; PFILE_INFO_3 = ^FILE_INFO_3; FILE_INFO_3 = packed record fi3_id : DWord; fi3_permissions : DWord; fi3_num_locks : DWord; fi3_pathname : PWChar; fi3_username : PWChar; end; TcsNetFileEnum = function( const servername : PWChar; const basepath : PWChar; const username : PWChar; const level : DWord; const bufptr : Pointer; const prefmaxlen : DWord; const entriesread : PDWord; const totalentries : PDWord; const resume_handle : PDWord ) : NET_API_STATUS; stdcall; TcsNetApiBufferFree = function( const Buffer : Pointer ) : NET_API_STATUS; stdcall; implementation var hDLL : DWORD; NetFileEnum : TcsNetFileEnum = nil; NetApiBufferFree : TcsNetApiBufferFree = nil; {$R *.DFM} procedure TForm1.Button1Click(Sender: TObject); var pfi3Work : PFILE_INFO_3; pfi3Save : PFILE_INFO_3; dwEntriesRead : DWORD; dwTotalEntries : DWORD; dwResult : DWORD; i : integer; begin if (hDLL = 0) or (@NetFileEnum = nil) or (@NetApiBufferFree = nil) then begin MessageBox(0,'Fehler beim Laden der Funktionen','FEHLER',MB_ICONERROR); exit; end; Memo1.Lines.Clear; dwResult := NetFileEnum(nil,nil ,nil,3,@pfi3Work,MAX_PREFERRED_LENGTH,@dwEntriesRead,@dwTotalEntries,nil); if dwResult <> NERR_Success then begin MessageBox(0,PChar(SysErrorMessage(dwResult)),'FEHLER',MB_ICONERROR); exit; end; try pfi3Save := pfi3Work; for i := 1 to dwEntriesRead do begin Memo1.Lines.Add(pfi3Save.fi3_pathname + WideString('/') + pfi3Save.fi3_username); inc(pfi3Save); end; finally NetApiBufferFree(pfi3Work); end; end; initialization begin hDLL := LoadLibrary('NETAPI32.DLL'); if hDLL = 0 then exit; @NetFileEnum := GetProcAddress(hDLL,'NetFileEnum'); @NetApiBufferFree := GetProcAddress(hDLL,'NetApiBufferFree'); end; finalization begin if hDLL <> 0 then FreeLibrary(hDLL); end; Deshalb passen Deine und meine Deklarationen nicht zusammen. |
Re: Liste aller geöffneten Dateien
Hallo Christian,
ein langes Woooooooow für den "kurzen" Senf von Dir! :D :D Ich habe heute leider kein Delphi mehr zur Verfügung, ich werde es mir morgen in der Früh sofort ansehen, vielen Dank! |
Re: Liste aller geöffneten Dateien
Hallo Christian,
leider geht Deine Version auch nicht bei mir, ich bekomme keine Liste, dwEntriesRead bleibt 0. Auf einem anderen Rechner, wo ich offensichtlich mehr Rechte besitze, bekomme ich den Pfad der Exe + /Administrator zurück, die anderen offenen Dateipfade werden nicht angezeigt (und das nur einmal, auch nach einem Neustart wird nun nichts mehr angezeigt). Mir scheint, das ist ein extrem komplexes Problem... :cry: |
Re: Liste aller geöffneten Dateien
Moin Armin,
:oops: :wall: :wall: :wall: :wall: mit der Funktion werden alle geöffneten Dateien (auch Pipes) die remote geöffnet wurden, und nur diese. Lokal geöffnete zählen nicht mit. Ich hab's gerade noch einmal ausprobiert... |
Re: Liste aller geöffneten Dateien
Hallo,
ich habe im Web ein Demo gefunden, das leider nur funktioniert, wenn man Adminrechte besitzt: Colin Wilson's Webseite ![]() Ich suche aber eine aber Methode ohne Adminrechte... :mrgreen: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:10 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