AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Liste aller geöffneten Dateien

Ein Thema von APP · begonnen am 10. Sep 2003 · letzter Beitrag vom 12. Sep 2003
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von APP
APP

Registriert seit: 24. Feb 2003
Ort: Graz (A)
705 Beiträge
 
Delphi 7 Enterprise
 
#1

Liste aller geöffneten Dateien

  Alt 10. Sep 2003, 11:55
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.
Armin P. Pressler

BEGIN
...real programmers are using C/C++ - smart developers Delphi;
END;
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.117 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Liste aller geöffneten Dateien

  Alt 10. Sep 2003, 11:59
Moin Armin,

schau Dir mal im PSDK die APIs NetFileEnum und NetFileGetInfo an.
Hilft vielleicht weiter.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
orion3000

Registriert seit: 28. Aug 2003
Ort: Betzdorf
63 Beiträge
 
Delphi 4 Standard
 
#3

Re: Liste aller geöffneten Dateien

  Alt 10. Sep 2003, 12:44
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
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.117 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: Liste aller geöffneten Dateien

  Alt 10. Sep 2003, 12:49
Moin Orion,

das funktioniert allerdings nur, wenn die Datei exklusiv geöffnet wurde.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von APP
APP

Registriert seit: 24. Feb 2003
Ort: Graz (A)
705 Beiträge
 
Delphi 7 Enterprise
 
#5

Re: Liste aller geöffneten Dateien

  Alt 10. Sep 2003, 13:07
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.
Armin P. Pressler

BEGIN
...real programmers are using C/C++ - smart developers Delphi;
END;
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.117 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: Liste aller geöffneten Dateien

  Alt 10. Sep 2003, 14:07
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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von APP
APP

Registriert seit: 24. Feb 2003
Ort: Graz (A)
705 Beiträge
 
Delphi 7 Enterprise
 
#7

Re: Liste aller geöffneten Dateien

  Alt 10. Sep 2003, 18:52
Hallo Christian,

ein langes Woooooooow für den "kurzen" Senf von Dir!

Ich habe heute leider kein Delphi mehr zur Verfügung,
ich werde es mir morgen in der Früh sofort ansehen,

vielen Dank!
Armin P. Pressler

BEGIN
...real programmers are using C/C++ - smart developers Delphi;
END;
  Mit Zitat antworten Zitat
Benutzerbild von APP
APP

Registriert seit: 24. Feb 2003
Ort: Graz (A)
705 Beiträge
 
Delphi 7 Enterprise
 
#8

Re: Liste aller geöffneten Dateien

  Alt 11. Sep 2003, 07:46
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...
Armin P. Pressler

BEGIN
...real programmers are using C/C++ - smart developers Delphi;
END;
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.117 Beiträge
 
Delphi 11 Alexandria
 
#9

Re: Liste aller geöffneten Dateien

  Alt 11. Sep 2003, 12:26
Moin Armin,



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...
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von APP
APP

Registriert seit: 24. Feb 2003
Ort: Graz (A)
705 Beiträge
 
Delphi 7 Enterprise
 
#10

Re: Liste aller geöffneten Dateien

  Alt 12. Sep 2003, 07:20
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...
Armin P. Pressler

BEGIN
...real programmers are using C/C++ - smart developers Delphi;
END;
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 13:59 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