Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.053 Beiträge
 
Delphi 12 Athens
 
#27

Re: Dateigröße auf Netzlaufwerk ermitteln

  Alt 2. Dez 2007, 11:41
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 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
du könntest da auch höchstens versuchen Set8087ControlWord vorm Aufruf dieser Funktion zurück und nachher dann wiederauf $133F zu setzen.


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;
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat