hi,
mir ist es vorher noch nicht aufgefallen aber wie der Thread
"Function directory() not getting right file size"
public.xbase++.generic
22. Oktober 2011
Arnaldo
zeigt macht Xbase++ zwischen 9 GB und 15 GB "Mist"
also dachte ich nimm die WIN32_FIND_DATA() Structure von Pablo aber auch das geht nicht.
hat jemand ein Workaround für das Problem ?
Filesize > 9GB ? [erledigt]
Moderator: Moderatoren
- AUGE_OHR
- Marvin
- Beiträge: 12906
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 45 Mal
Re: Filesize > 9GB ?
nun hat sich Pablo nochmal mit dem Thema beschäftigt und die Lösung heisst : ot4xb Version ( 1.5.17.52)AUGE_OHR hat geschrieben:hat jemand ein Workaround für das Problem ?
mit Hilfe der WIN32_FIND_DATA() Structure kann diese Function verwenden
Code: Alles auswählen
Transform( VAL( cPrintf("%f",NIL,fd:nFileSize )), "999,999,999.99" )
gruss by OHR
Jimmy
Jimmy
- AUGE_OHR
- Marvin
- Beiträge: 12906
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 45 Mal
Re: Filesize > 9GB ? [erledigt]
hi,
nun doch noch eine Frage : Directory( [<cDirectory>], [<cAttribute>] )
cDirectory ist "muss" aber für cAttribute muss ich ja nichts angeben es sei den ich will explizit auch "DHS" ( V hier nicht betrachtet )der Code scheint soweit zu funktionieren ... aber er sieht "blöde" aus ... geht das nicht eleganter ?
nun doch noch eine Frage : Directory( [<cDirectory>], [<cAttribute>] )
cDirectory ist "muss" aber für cAttribute muss ich ja nichts angeben es sei den ich will explizit auch "DHS" ( V hier nicht betrachtet )
Code: Alles auswählen
FUNCTION My_Directory(cFullPathName,cAttribute)
...
while bLoop
lTakeIt := .F.
dwFileAttributes := iif(fd:lDirectory ,"D","")+;
iif(fd:lHidden ,"H","")+;
iif(fd:lSystem ,"S","")+;
iif(fd:lReadonly ,"R","")+;
iif(fd:lArchive ,"A","")+;
iif(fd:lCompressed,"C","")+;
iif(fd:lEncrypted ,"E","")
IF EMPTY(cAttribute) // no Attribut set, take it
lTakeIt := .T.
ELSE
// like in Xbase++
IF "D" $ cAttribute .AND. "D" $ dwFileAttributes // lDirectory
lTakeIt := .T.
ENDIF
IF "H" $ cAttribute .AND. "H" $ dwFileAttributes // lHidden
lTakeIt := .T.
ENDIF
IF "S" $ cAttribute .AND. "S" $ dwFileAttributes // lSystem
lTakeIt := .T.
ENDIF
// more Option
IF "R" $ dwFileAttributes // lReadonly
lTakeIt := .T.
ENDIF
IF "A" $ dwFileAttributes // lArchive
lTakeIt := .T.
ENDIF
IF "C" $ dwFileAttributes // lCompressed
lTakeIt := .T.
ENDIF
IF "E" $ dwFileAttributes // lEncrypted
lTakeIt := .T.
ENDIF
ENDIF
// if fail
IF lTakeIt = .F.
bLoop := fd:FindNext()
LOOP
ENDIF
...
ENDDO
gruss by OHR
Jimmy
Jimmy
- AUGE_OHR
- Marvin
- Beiträge: 12906
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 45 Mal
Re: Filesize > 9GB ? [erledigt]
hi,
falls man nur die Grösse von einem File benötigtp.s. arbeitet auch mit Files > 15 GB
falls man nur die Grösse von einem File benötigt
Code: Alles auswählen
//
// need ot4xb
//
FUNCTION FileSize(cFile)
LOCAL hFile := 0
LOCAL lpFileSize := 0
LOCAL nHighPart := 0
LOCAL nLowPart := 0
IF FILE(cFile)
//
// get File Handle
//
hFile := FOpen(cFile)
//
// call API Function GetFileSizeEx
// http://msdn.microsoft.com/en-us/library/windows/desktop/aa364957%28v=VS.85%29.aspx
//
@Kernel32:GetFileSizeEx( hFile, @lpFileSize )
//
// get HI / LOW Part
//
nHighPart := hi_dword(lpFileSize)
nLowPart := lo_dword(lpFileSize)
//
// make QuadPart
//
MAKE_QWORD(nLowPart,nHighPart,@lpFileSize)
//
// round without Decimal
//
lpFileSize := INT(Round(lpFileSize,0))
//
// Close File Handle
//
FClose(hFile)
ENDIF
RETURN lpFileSize
gruss by OHR
Jimmy
Jimmy