Code:
'Is a quad value needed to do this calculation? ' MyString$ = FORMAT$(WFD.nFileSizeHigh * (%MAXDWORD + 1) + WFD.nFileSizeLow) #COMPILE EXE #INCLUDE "WIN32API.INC" DECLARE FUNCTION GetFileSizeAndAttributes (sFileName AS STRING) AS STRING FUNCTION PBMAIN AS LONG LOCAL sFileName AS STRING LOCAL sDefault AS STRING LOCAL sResult AS STRING sDefault = "c:\windows\winnt.bmp" DO sFileName = INPUTBOX$ ("File name?","Title",sDefault,0,0) IF LEN(sFileName) = 0 THEN EXIT DO sResult = GetFileSizeAndAttributes (sFileName) IF LEN(sResult) THEN MSGBOX sResult ELSE MSGBOX sFileName + " not found" LOOP END FUNCTION FUNCTION GetFileSizeAndAttributes (sFileName AS STRING) AS STRING LOCAL s AS STRING LOCAL hfile AS DWORD LOCAL wfd AS WIN32_FIND_DATA LOCAL a AS DWORD s = sFileName IF RIGHT$(s,1) = "\" THEN s = LEFT$(s,LEN(s)-1) 'trim trailing / hfile = FindFirstFile(s + $NUL, WFD) 'search for file IF hfile = %INVALID_HANDLE_VALUE THEN 'file not found EXIT FUNCTION 'exit END IF FindClose(hfile) 'close handle a = wfd.dwFileAttributes 'file attributes s = FORMAT$(WFD.nFileSizeHigh * (%MAXDWORD + 1) + WFD.nFileSizeLow) + "," IF (a AND 32) = 32 THEN s = s + "A" 'Archive IF (a AND 16) = 16 THEN s = s + "D" 'Directory IF (a AND 8) = 8 THEN s = s + "V" 'Volume label IF (a AND 4) = 4 THEN s = s + "S" 'System IF (a AND 2) = 2 THEN s = s + "H" 'Hidden IF (a AND 1) = 1 THEN s = s + "R" 'Readonly FUNCTION = s END FUNCTION #IF 0 'None of this is needed, just curious if the right calculation is used for large file sizes ' ' [URL]http://www.powerbasic.com/support/pbforums/showthread.php?t=18703&highlight=maxdword[/URL] ' ' What is the correct calculation determining the file size from a WIN32_FIND_DATA structure? ' I've read that many programs have calculated this incorrectly because of an error at a Microsoft site. ' [URL]http://www.freevbcode.com/ShowCode.asp?ID=6836[/URL] ' [URL]http://support.microsoft.com/default.aspx?scid=kb;EN-US;185476[/URL] ' Read program and the calculation is: (WFD.nFileSizeHigh * MAXDWORD) + WFD.nFileSizeLow ' where MAXDWORD is defined as &HFFFF should be &HFFFFFFFF like in win32api.inc ' quadvalue = WFD.nFileSizeHigh * (%MAXDWORD + 1) + WFD.nFileSizeLow 'Correct calculating file size 'http://www.freevbcode.com/ShowCode.asp?ID=6836 MAX_PATH = 260 ' max. length of full pathname %INVALID_HANDLE_VALUE = &HFFFFFFFF??? %MAXDWORD = &HFFFFFFFF??? 'correct in win32api.inc DECLARE FUNCTION FindFirstFile LIB "KERNEL32.DLL" ALIAS "FindFirstFileA" (lpFileName AS ASCIIZ, lpFindFileData AS WIN32_FIND_DATA) AS DWORD DECLARE FUNCTION FindClose LIB "KERNEL32.DLL" ALIAS "FindClose" (BYVAL hFindFile AS DWORD) AS LONG TYPE FILETIME dwLowDateTime AS DWORD dwHighDateTime AS DWORD END TYPE TYPE WIN32_FIND_DATA dwFileAttributes AS DWORD ftCreationTime AS FILETIME ftLastAccessTime AS FILETIME ftLastWriteTime AS FILETIME nFileSizeHigh AS DWORD nFileSizeLow AS DWORD dwReserved0 AS DWORD dwReserved1 AS DWORD cFileName AS ASCIIZ * %MAX_PATH cAlternateFileName AS ASCIIZ * 14 END TYPE #ENDIF 'MAK 'Purpose Create an integer class value of a specified data type.' 'Syntax resultvar = MAK(datatype, loworderval, highorderval)' 'Remarks Create an integer class value of a specified data type (WORD, DWORD, PTR, INTEGER, LONG, QUAD) from a low-order and a high-order part.
Comment