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 Dateigröße auf Netzlaufwerk ermitteln (https://www.delphipraxis.net/104333-dateigroesse-auf-netzlaufwerk-ermitteln.html)

haentschman 1. Dez 2007 21:47


Dateigröße auf Netzlaufwerk ermitteln
 
Hallo alle...

es ist ja bald Weihnachten und ich gebe Euch mal eine Nuß zu knacken... :-D

Vorraussetzungen:

-Firebird Datenbank auf Netzlaufwerk
-vorhanden: Hostname
-vorhanden: Pfad und Dateiname der Datenbank (lokaler Pfad)

Ergebnis soll sein:

-Dateigröße der Datenbank zu Infozwecken...

versucht habe ich...
Delphi-Quellcode:
function GetFileSizeA(const FileName: String): Integer;
var SR: TSearchRec;
begin
  Result := -1;

  if FindFirst(FileName, faAnyFile and not faDirectory, SR) = 0 then
  try
    Result := SR.Size;
  finally SysUtils.FindClose(SR) end;
end;
...funktioniert aber nur mit lokalen Pfadangaben. Das gleiche gilt für FileSize. :gruebel:

...alle Beispiele und Lösungen, welche ich gefunden habe, beziehen sich alle auf FileSize oder GetFileSize.


Welche Richtung würdet Ihr vorschlagen ?

thkerkmann 1. Dez 2007 22:11

Re: Dateigröße auf Netzlaufwerk ermitteln
 
Hi,

wie kommst Du denn darauf, dass das nur mit lokalen Pfadangaben geht ?
Allerdings hat Delphi 5 nur ein 32bit Cardinal im tSearchrecord für die Size.
Könnte das für deine Datenbank zu klein sein ?
Dann wirst Du auf die darin enthaltene Win32FindData zugreifen müssen, wo 64 bit zur Verfügung stehen.

Schau dir mal den tSearchRecord und das darin enthaltene Win32FindData an.

Gruss

himitsu 1. Dez 2007 22:16

Re: Dateigröße auf Netzlaufwerk ermitteln
 
Wie hast du denn den Dateipfad angegeben?

\\Hostname\Drive:\Path\Filename.ext
oder
\\?\UNC\Hostname\Drive:\Path\Filename.ext

haentschman 1. Dez 2007 22:33

Re: Dateigröße auf Netzlaufwerk ermitteln
 
...ich glaubs ja nicht... :wall:

ich hatte den Dateinamen mit \\Host\Freigabe\Pfad\Datei angegeben... Ergebnis 0

...jetzt habe ich mal \\Hostname\Drive:\Path\Filename.ext ausprobiert... funktioniert :shock:

...warum geht das mit dem Freigabenamen nicht ? :gruebel:

Danke an alle... :thumb:

[edit]
... nehme alles zurück ! ...ich hatte im Quelltext zu Testzwecken noch statisch einen lokalen Pfad eingetragen.
---> auch \\Hostname\Drive:\Path\Filename.ext...Ergebnis 0

PS: ich habe gelesen, das FileSize nur lokal funktioniert.
[/edit]

haentschman 1. Dez 2007 22:52

Re: Dateigröße auf Netzlaufwerk ermitteln
 
... ich habe noch einmal verschiedene Beispiele ausprobiert... gleiches Ergebnis.

bei lokaler Pfadangabe wie c:\tmp\daten\test.fdb --> richtiges Ergebnis
bei Padangabe wie \\server\system\tmp\daten\test.fdb oder \\server\c:\tmp\daten\test.fdb --> Ergebnis 0

Fazit: die Pfadangabe ist falsch :gruebel: :gruebel: aber ich seh´s nicht :roll:

[edit]
Zitat:

...und da filesize() nur auf locale Dateien anwendbar ist, klappt es leider nicht.
[/edit]

Luckie 1. Dez 2007 22:59

Re: Dateigröße auf Netzlaufwerk ermitteln
 
Was sagt denn GetLastError?

haentschman 1. Dez 2007 23:22

Re: Dateigröße auf Netzlaufwerk ermitteln
 
also...

bei der Funktion ...mit \\localhost\c:\tmp\avdb.fdb
Delphi-Quellcode:
function GetFileSizeA(const FileName: String): Integer;
var SR: TSearchRec;
begin
  Result := -1;

  if FindFirst(FileName, faAnyFile and not faDirectory, SR) = 0 then
  try
    Result := SR.Size;
  finally SysUtils.FindClose(SR) end;
end;
... nach if direkt zu finaly ---> also Datei nicht gefunden. :wall:


bei der Funktion ...mit \\localhost\c:\tmp\avdb.fdb
Delphi-Quellcode:
function GetFileSize1(const szFile: String): Int64;
var
  fFile: THandle;
  wfd: TWIN32FINDDATA;
begin
  result := 0;
  if not FileExists(szFile) then exit;
  fFile := FindFirstfile(pchar(szFile),wfd);
  if fFile = INVALID_HANDLE_VALUE then exit;
  result := (wfd.nFileSizeHigh*(MAXDWORD))+wfd.nFileSizeLow;
  windows.FindClose(fFile);
end;
... nach if not FileExists direkt exit ---> also Datei nicht gefunden. :wall:


... mit c:\tmp\avdb.fdb ... bekomme ich den richtigen Wert. :wall:


:?: ich weiß nicht weiter... :gruebel:

[edit]
GetLastError = 0
[/edit]

himitsu 1. Dez 2007 23:59

Re: Dateigröße auf Netzlaufwerk ermitteln
 
GetLastError bringt bei FindFirst nichts, da diese Funktion bei Mißerfolg selbst intern GetLastError aufruft und dieses somit zurücksetzt.

Das ergebnis von GetLastError wird als Result zurückgeliefert,
also was sagt denn FindFirst?

Luckie 2. Dez 2007 00:03

Re: Dateigröße auf Netzlaufwerk ermitteln
 
Egal, jeden falls sollte der Rückgabewert mal ausgewertet werden.

haentschman 2. Dez 2007 00:08

Re: Dateigröße auf Netzlaufwerk ermitteln
 
...53 ---> Datei nicht gefunden.

...die Funktion kann mit dem Netzlaufwerkpfad nichts anfangen oder ? :gruebel:

Luckie 2. Dez 2007 00:17

Re: Dateigröße auf Netzlaufwerk ermitteln
 
Also das sagt das DK dazu:
Zitat:

On network shares, you can use an lpFileName in the form of the following: "\\server\service\*" but you cannot use an lpFileName that points to the share itself, for example, "\\server\service".

haentschman 2. Dez 2007 00:24

Re: Dateigröße auf Netzlaufwerk ermitteln
 
...was ist DK ? :oops:

..vieleicht ist es ja schon zu spät.. :wink: ich verstehe das Zitat nicht wirklich... :roll:

Danke für Eure Hilfe...

himitsu 2. Dez 2007 00:26

Re: Dateigröße auf Netzlaufwerk ermitteln
 
SDK / PSDK
> MSDN-Library durchsuchenFindFirstFile

Nja, das Zitat sagt daß es eigentlich gehn sollte.


Du könntest es nochmal mit der Unicode-Version der WinAPI-Funktion FindFistFile (FindFistFileW) versuchen. Vorallem bei den UNC-Namen arbeitet diese etwas anders als die ANSI-Version (FindFistFile/FindFistFileA).

haentschman 2. Dez 2007 00:33

Re: Dateigröße auf Netzlaufwerk ermitteln
 
...nun ja ich sehe das genauso...

100 mal schon mit Netzlaufwerken, VPN via IP gearbeitet...keine Probleme. :???:

...darum :wiejetzt:

...aus Spaß habe ich mal eine FileListBox auf die Form gesetzt. Mit der Directory Angabe \\localhost\c:\tmp bekomme ich auch Fehler 53...

:mrgreen: ...ist schon so traurig, daß es wieder zum Lachen ist...

himitsu 2. Dez 2007 00:39

Re: Dateigröße auf Netzlaufwerk ermitteln
 
hatte grad nochwas in Beitrag #13 nachgetragen,
wie gesagt, du könntest es nochmals mit Unicode versuchen (direkt über die WinAPI oder eine UnicodeCodesammlung)

Oder hast du mal vesucht andere/alle Dateien auf dem Zielrechner zu finden?
z.B. \\host\c:\tmp\*.*

haentschman 2. Dez 2007 00:56

Re: Dateigröße auf Netzlaufwerk ermitteln
 
...alles das gleiche in grün. :roll:

egal wie ich den File String zusammensetze. :(

FindFirstFileW... damit muß ich mich erst etwas näher beschäftigen... :roll:

himitsu 2. Dez 2007 01:06

Re: Dateigröße auf Netzlaufwerk ermitteln
 
Kurzfassung/Test:
Delphi-Quellcode:
Var FileName: WideString;
  H: THandle;
  D: TWIN32FindDataW;

Begin
  FileName := 'deine Datei oder ein Suchmuster';

  H := FindFirstFileW(PWideChar(FileName), D);
  If H = INVALID_HANDLE_VALUE Then GetLastError_auswerten;
  {sonst alles ok}
  CloseHandle(H);

haentschman 2. Dez 2007 01:07

Re: Dateigröße auf Netzlaufwerk ermitteln
 
... habe mir noch eimal die Namenskonvention angeschaut.

http://msdn2.microsoft.com/en-us/library/aa365247.aspx

...eigentlich ist das richtig, was ich getrieben hab... :mrgreen:

:wiejetzt:

himitsu 2. Dez 2007 01:17

Re: Dateigröße auf Netzlaufwerk ermitteln
 
Ja wie gesagt: die ANSI-Dateifunktionen sind halt in einigen Dingen etwas eingeschränkt
und wenn du Glück hast, dann liegt es nur an soeiner Beschränkung.
Wenn nicht, dann sieht es schon schwerer aus, da dieses ja eigentlich funktionieren sollte.

haentschman 2. Dez 2007 01:18

Re: Dateigröße auf Netzlaufwerk ermitteln
 
...erst einmal Danke,Danke,Danke... :-D

Habe Deinen Tipp wie folgt angepaßt.
Delphi-Quellcode:
function GetFileSize2(const FileName: String): Int64;
var
  H: THandle;
  D: TWIN32FindDataW;

begin
  H := FindFirstFileW(PWideChar(FileName), D);
  If H <> INVALID_HANDLE_VALUE then exit; //GetLastError_auswerten;
  result := (d.nFileSizeHigh*(MAXDWORD))+d.nFileSizeLow;
  CloseHandle(H);
end;
...Datei wird gefunden...aber die Größe stimmt nicht. :gruebel:

himitsu 2. Dez 2007 01:28

Re: Dateigröße auf Netzlaufwerk ermitteln
 
wie groß ist denn die Datei?
Delphi-Quellcode:
function GetFileSize2(const FileName: String): Int64;
var
  H: THandle;
  D: TWIN32FindDataW;

begin
  H := FindFirstFileW(PWideChar(FileName), D);
  If H = INVALID_HANDLE_VALUE then exit; //GetLastError_auswerten;
  result := (Int64(d.nFileSizeHigh)*(MAXDWORD + 1))+d.nFileSizeLow;
  CloseHandle(H);
end;
PS: * und + sind etwas langsam/unoptimal
und bevor du versuchst einen Integer/Cardinal [d.nFileSizeHigh] (also 4 Byte) auf einen Int64 (8 Byte) zu erweitern, mußt die dessen Größe erstmal ändern (Int64)
Delphi-Quellcode:
Function GetFileSizeA(Const FileName: String): Int64;
  Var FileNameW: WideString;
    H: THandle;
    D: TWIN32FindDataW;

  Begin
    Result := -1;
    FileName := FileNameW;
    H := FindFirstFileW(PWideChar(FileName), D);
    If H = INVALID_HANDLE_VALUE Then Exit;
    If D.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY = 0 Then
      Result := (Int64(D.nFileSizeHigh) shl 32) or D.nFileSizeLow;
    CloseHandle(H);
  End;
oder
Delphi-Quellcode:
Function GetFileSizeA(Const FileName: String): Integer;
  Var FileNameW: WideString;
    H: THandle;
    D: TWIN32FindDataW;

Begin
    Result := -1;
    FileName := FileNameW;
    H := FindFirstFileW(PWideChar(FileName), D);
    If H = INVALID_HANDLE_VALUE Then Exit;
    If (D.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY = 0)
      and (D.nFileSizeHigh = 0) and (D.nFileSizeLow < $80000000) Then
      Result := D.nFileSizeLow;
    CloseHandle(H);
  End;
PSS: was micht wundert ist, daß bei PWideChar(FileName) nicht gemeckert wird, vonwegen AnsiString-PWideChar-Konvertierung :shock:

haentschman 2. Dez 2007 01:30

Re: Dateigröße auf Netzlaufwerk ermitteln
 
... 1.07 MB oder 1.122.304 Byte

himitsu 2. Dez 2007 01:32

Re: Dateigröße auf Netzlaufwerk ermitteln
 
hmmm, 1 MB paßt ja locker in einen Integer :gruebel: ,
was kommt denn raus?

Zitat:

PSS: was micht wundert ist, daß bei PWideChar(FileName) nicht gemeckert wird, vonwegen AnsiString-PWideChar-Konvertierung Shocked

haentschman 2. Dez 2007 01:35

Re: Dateigröße auf Netzlaufwerk ermitteln
 
... 3.04 MB

PS: alles was du so als Lösungen hast mögen funktionieren...wenn ich die Details verstehen würde wäre es besser... :oops:

haentschman 2. Dez 2007 06:45

Re: Dateigröße auf Netzlaufwerk ermitteln
 
...Guten Morgen alle... :hi:

...das hat mir alle keine Ruhe gelassen.

...inzwischen habe ich durch Zufall herausgefunden das mit folgendem Code
Delphi-Quellcode:
function GetFileSize2(const FileName: String): Integer;
var
  H: THandle;
  D: TWIN32FindDataW;

begin
  H := FindFirstFileW(PWideChar(FileName),D);
  If H <> INVALID_HANDLE_VALUE then exit; //GetLastError_auswerten;
  result := (d.nFileSizeHigh*(MAXDWORD))- d.nFileSizeLow;
  CloseHandle(H);
end;
das Ergebnis immer gleich ist...(unterschiedliche Dateien/FileName) ! -5.41 MB... obwohl die kpl. Prozedur durchlaufen wird.

Warnung: Rückgabewert der Funktion könnte undefiniert sein... damit hat Delphi Recht !? :???:

[edit]
ich habe mit Set8087ControlWord($133F) den Gleitkommaüberlauf während der Ausführung meines Programmes ausgeschaltet.
...hat das in diesem Zusammenhang eine Relevanz ? ... Suche nach Strohhalm... :roll:
[/edit]

haentschman 2. Dez 2007 09:20

Re: Dateigröße auf Netzlaufwerk ermitteln
 
...mich wundert gar nichts mehr. :roll:

...die gleichen Probleme mit:

DeleteFile('\\localhost\system\tmp\avdb.fdb');

FileExists('\\localhost\system\tmp\avdb.fdb');

:wall:

...Kann es wirklich sein, das diese Funktionen nicht mit Netzwerk umgehen können ? :gruebel:

himitsu 2. Dez 2007 10:41

Re: Dateigröße auf Netzlaufwerk ermitteln
 
Zitat:

Zitat von haentschman
...inzwischen habe ich durch Zufall herausgefunden das mit folgendem Code
Delphi-Quellcode:
function GetFileSize2(const FileName: String): Integer;
var
  H: THandle;
  D: TWIN32FindDataW;

begin
  H := FindFirstFileW(PWideChar(FileName),D);
  If H = INVALID_HANDLE_VALUE then exit; //GetLastError_auswerten;
  result := (d.nFileSizeHigh*(MAXDWORD))- d.nFileSizeLow;
  CloseHandle(H);
end;
das Ergebnis immer gleich ist...(unterschiedliche Dateien/FileName) ! -5.41 MB... obwohl die kpl. Prozedur durchlaufen wird.



Warnung: Rückgabewert der Funktion könnte undefiniert sein... damit hat Delphi Recht !? :???:

Zur Warnug: da mit dem Aifruf von Exit die Funktion verlassen wird, muß vorher in Rückgabewert gesetzt werden.

Also entweder am Anfang mit initialisieren:
Delphi-Quellcode:
H := FindFirstFileW(PWideChar(FileName),D);
If H = INVALID_HANDLE_VALUE then exit; //GetLastError_auswerten;
result := ...
Oder beim Verlassen der Funktion setzen:
Delphi-Quellcode:
Result := Standard-/Fehlerwert;
H := FindFirstFileW(PWideChar(FileName),D);
If H = INVALID_HANDLE_VALUE then begin
  Result := Standard-/Fehlerwert;
  exit;
end;
result := ...
Zitat:

Zitat von haentschman
ich habe mit Set8087ControlWord($133F) den Gleitkommaüberlauf während der Ausführung meines Programmes ausgeschaltet.
...hat das in diesem Zusammenhang eine Relevanz ?

Da hier ja keine Gleitkommafunktion benötigt werden, sollte es eigentlich egal sein :gruebel:
du könntest da auch höchstens versuchen Set8087ControlWord vorm Aufruf dieser Funktion zurück und nachher dann wiederauf $133F zu setzen.


Delphi-Quellcode:
result := (Int64(d.nFileSizeHigh)*(MAXDWORD + 1))+d.nFileSizeLow;
Int64(d.nFileSizeHigh) > in einen Int64 konvertieren, damit auch Platz für das Vergrößern des Wertes vorhanden ist.
*(MAXDWORD+1) > MAXDWORD ist nur $FFFFFFFF, aber damit der Wert in das Höherwertige LongWord verschoben wird, muß mit $0000000100000000 multiplizert werden,
oder einfach die Bits des Wertes um 32 Bit (LongWord) nach oben verschieben
> Int64(d.nFileSizeHigh) shl 32

Delphi-Quellcode:
Function GetFileSizeA(Const FileName: String): Int64;
  Var FileNameW: WideString;
    H: THandle;
    D: TWIN32FindDataW;

  Begin
    Result := -1; // Fehlerwert setzen (damit bei EXIT ein Wert gesetzt wurde)
    FileName := FileNameW; // Dateiname von String/Ansitring nach WideString übersetzen
    H := FindFirstFileW(PWideChar(FileName), D); // Datei suchen
    If H = INVALID_HANDLE_VALUE Then Exit; // im Fehlerfalls Funktion verlassen
    If D.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY = 0 Then // prüfen ob kein Verzeichnis
      Result := (Int64(D.nFileSizeHigh) shl 32) or D.nFileSizeLow; // wenn Datei, dann Result neu setzen
      // Int64(D.nFileSizeHigh) shl 32 > wandelt nFileSizeHigh in einen Int64 um
      //    und verschiebt dessen Wert in das HiLongWord
      // or D.nFileSizeLow > fügt nFileSizeLow in das Regebnis als LoLongWord ein
    CloseHandle(H); // Suche schließen (wenn H = INVALID_HANDLE_VALUE, dann wurde sie nicht geöffnet)
  End;
oder
Delphi-Quellcode:
Function GetFileSizeA(Const FileName: String): Integer;
  Var FileNameW: WideString;
    H: THandle;
    D: TWIN32FindDataW;

Begin
    Result := -1; // Fehlerwert setzen (damit bei EXIT ein Wert gesetzt wurde)
    FileName := FileNameW; // Dateiname von String/Ansitring nach WideString übersetzen
    H := FindFirstFileW(PWideChar(FileName), D); // Datei suchen
    If H = INVALID_HANDLE_VALUE Then Exit; // im Fehlerfalls Funktion verlassen
    If (D.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY = 0) // prüfen ob kein Verzeichnis
      and (D.nFileSizeHigh = 0) and (D.nFileSizeLow < $80000000) Then // prüfen ob die Größe in einen Integer reinpaßt
      Result := D.nFileSizeLow; // Ergebnis setzen (nur als Integer)
    CloseHandle(H); // Suche schließen (wenn H = INVALID_HANDLE_VALUE, dann wurde sie nicht geöffnet)
  End;
PWideChar(FileName) > die Funktion FindFirstFileW braucht eine Referenz auf einen UnicodeString
und dafür muß FileName auch schon in Unicode, also als WideString vorliegen.


und wenn du den String direkt übergiebst? (ohne Variable)
Delphi-Quellcode:
if not DeleteFileW('\\localhost\system\tmp\avdb.fdb') then
  irgendwas := GetLastError;

himitsu 2. Dez 2007 11:01

Re: Dateigröße auf Netzlaufwerk ermitteln
 
hab hier eben mal ein Laufwerk freigegeben und

bei DeleteFileW('\\localhost\D:\test.dat');
kommt das raus 83 = Der Netzwerkpfad wurde nicht gefunden.

bei DeleteFileW('\\localhost\Daten\test.dat');
kommt 82 = Verbindung wurde nicht hergestellt, weil ein identischer Name bereits im Netzwerk vorhanden ist. Wählen Sie "System" in der Systemsteuerung, um den Computernamen zu ändern, und versuchen Sie es erneut. raus

schon komisch, vorallem letzere Meldung versteh ich da irgendwie nicht ... ist doch schön, wenn es
vorhanden ist :gruebel:

[add]
DeleteFileW('\\myPC\Daten\test.dat'); hat die Datei übrigend erfolgreich gelöscht :-D

thkerkmann 2. Dez 2007 11:15

Re: Dateigröße auf Netzlaufwerk ermitteln
 
Hi,

also deine Probleme kann ich überhaupt nicht nachvollziehen

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
  TForm1 = class(TForm)
    edFilename: TEdit;
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var
  sr: tSearchrec;
  ierr: integer;
begin
  Memo1.Clear;
  ierr := FindFirst(edFilename.text, faAnyfile - faDirectory, sr);
  while ierr = 0 do
  begin
    if (sr.name <> '.') and (sr.name <> '..') then
    begin
      Memo1.Lines.Add(sr.name + ': sr.size=' + IntToStr(sr.size)
        + ', w32finddata.size='
        + IntToStr(int64(sr.FindData.nFileSizeHigh) shl 32
        + sr.FindData.nFileSizeLow));
    end;
    ierr := FindNext(sr);
  end;
  FindClose(sr);
end;

end.
Werf mal ein TEdit ein TMemo und einen TButton auf ein Form.
Nenn das TEdit edFilename (warum ich das umbenannt hab, keine Ahnung) :-D

Dann kannst du im Editfeld deinen Pfad eingeben, und auf den Button klicken, das Memo zeigt das Inhaltsverzeichnis mit den Dateigrößen aus dem Searchrecord und aus den Finddata.

Ich hab das bei mir getestet und das funktioniert einwandfrei.

Endweder ist deine Freigabe keine Freigabe, oder du hast keine Rechte auf dieser Freigabe. Das würde ich dann mal mit einem einfachen Dir in der Dos-Box testen.
Mit \\localhost\ geht das nicht, das ist aber auch klar, da dein Rechner ja nicht localhost heist. Gib den lokalen Rechnernamen an, dann geht das wieder. Und nebenbei: der Laufwerksbuchstabe hat in einem UNC Pfad gar nix zu suchen.

Gruss

Christian Seehase 2. Dez 2007 11:38

Re: Dateigröße auf Netzlaufwerk ermitteln
 
Moin Himitsu,

[quote)="himitsu"]bei DeleteFileW('\\localhost\D:\test.dat');
kommt das raus 83 = Der Netzwerkpfad wurde nicht gefunden. [/quote]

Logisch, denn in dem Beispiel müsste die Freigabe D: lauten.
Wenn Du eine UNC-Angabe machst, musst Du den Freigabenamen angeben, was im Falle von Laufwerk D: standardmässig D$ wäre (falls nicht jemand die administrativen Freigaben abgeschaltet hat.


Noch was allgemeines:
Ich stosse hier immer wieder auf die Zeile:

Delphi-Quellcode:
if H <> INVALID_HANDLE_VALUE then exit;
Das sollte wohl besser
Delphi-Quellcode:
if H = INVALID_HANDLE_VALUE then exit;
heissen ;-)
Sonst wird die Funktion immer verlassen, wenn ein gültiges Handle ermittelt wurde, und das Handle wird nicht wieder freigegeben.

haentschman 2. Dez 2007 13:03

Re: Dateigröße auf Netzlaufwerk ermitteln
 
Hallo alle... :hi:

...und siehe da...es bewegt sich doch :-D
Delphi-Quellcode:
function GetFileSize2(const FileName: String): Integer;       { TODO : Dateigröße ermitteln }
var
  SR: TSearchRec;
  ierr: integer;
begin
  ierr := FindFirst(FileName, faAnyfile - faDirectory, sr);
  while ierr = 0 do
  begin
    if (sr.name <> '.') and (sr.name <> '..') then
    begin
      DGrosse:= SR.Size / 1048576;
    end;
  ierr := FindNext(sr);
  end;
  FindClose(sr);
end;
...den Vorschlag von Christian angepaßt --> Ergebnis richtig :firejump:

... FileName Syntax: \\firma-server\system\tmp\avdb.fdb

PS: diese Syntax habe ich auch mit den anderen Beispielen probiert... :gruebel:

Danke erst einmal... jetzt muß ich mir überlegen, wie ich an den Freigabenamen des lokalen Ordners komme, da der User nur den lokalen DatenbankPfad eingibt.

bis bald...Danke :hi:


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