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;