Filesize > 9GB ? [erledigt]

Eigentlich ist mir die Frage peinlich, aber es kann sonst niemand helfen ... :)

Moderator: Moderatoren

Antworten
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Filesize > 9GB ? [erledigt]

Beitrag von AUGE_OHR »

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 ?
Zuletzt geändert von AUGE_OHR am Mo, 24. Okt 2011 0:49, insgesamt 1-mal geändert.
gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Marvin
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 ?

Beitrag von AUGE_OHR »

AUGE_OHR hat geschrieben:hat jemand ein Workaround für das Problem ?
nun hat sich Pablo nochmal mit dem Thema beschäftigt und die Lösung heisst : ot4xb Version ( 1.5.17.52)

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" )
welche auch bei > 15 GB arbeitet ;)
gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Marvin
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]

Beitrag von AUGE_OHR »

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 )

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
der Code scheint soweit zu funktionieren ... aber er sieht "blöde" aus ... geht das nicht eleganter ?
gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Marvin
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]

Beitrag von AUGE_OHR »

hi,

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
p.s. arbeitet auch mit Files > 15 GB
gruss by OHR
Jimmy
Antworten