Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Liste aller geöffneten Dateien (https://www.delphipraxis.net/8687-liste-aller-geoeffneten-dateien.html)

APP 10. Sep 2003 10:55


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.

Christian Seehase 10. Sep 2003 10:59

Re: Liste aller geöffneten Dateien
 
Moin Armin,

schau Dir mal im PSDK die APIs NetFileEnum und NetFileGetInfo an.
Hilft vielleicht weiter.

orion3000 10. Sep 2003 11:44

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

Christian Seehase 10. Sep 2003 11:49

Re: Liste aller geöffneten Dateien
 
Moin Orion,

das funktioniert allerdings nur, wenn die Datei exklusiv geöffnet wurde.

APP 10. Sep 2003 12:07

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.

Christian Seehase 10. Sep 2003 13:07

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:
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;
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.
Deshalb passen Deine und meine Deklarationen nicht zusammen.

APP 10. Sep 2003 17:52

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!

APP 11. Sep 2003 06:46

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:

Christian Seehase 11. Sep 2003 11:26

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

APP 12. Sep 2003 06:20

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 http://www.wilsonc.demon.co.uk/delphi.htm -> "File Handle Analyzer"

Ich suche aber eine aber Methode ohne Adminrechte... :mrgreen:


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:09 Uhr.
Seite 1 von 2  1 2      

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