All pastes #810320 Raw Edit

Someone

public text v1 · immutable
·published 2007-12-09 21:01 UTC
rendered paste body
'The array's index used ([x]) to get the free blocks and the block size was obtained by studying the ouput of the commands used below
IF sFilesystem = "Ext2" OR sFilesystem = "Ext3" THEN
   SHELL "dumpe2fs -h " & sDevice TO sTemp
   sTemp = Trim$(sTemp)
   arrTemp = Split(sTemp, Chr$(10))
   sFreeBlocks = Trim$(Mid$(arrTemp[13], RInStr(arrTemp[13], Space$(1))))
   sBlockSize = Trim$(Mid$(arrTemp[16], RInStr(arrTemp[16], Space$(1))))
   iFreeBytes = CLng(sFreeBlocks) * CLng(sBlockSize)
ELSE IF sFilesystem = "XFS" THEN 
   SHELL "xfs_db -c 'sb 0' -c 'print blocksize' -c 'print fdblocks' -r " & sDevice TO sTemp
   sTemp = Trim$(sTemp)
   arrTemp = Split(sTemp, Chr$(10))
   sFreeBlocks = Trim$(Mid$(arrTemp[1], RInStr(arrTemp[1], Space$(1))))
   sBlockSize = Trim$(Mid$(arrTemp[0], RInStr(arrTemp[0], Space$(1))))
   iFreeBytes = CLng(sFreeBlocks) * CLng(sBlockSize)
ELSE IF sFilesystem = "ReiserFS" THEN 
   SHELL "debugreiserfs " & sDevice TO sTemp
   sTemp = Trim$(sTemp)
   arrTemp = Split(sTemp, Chr$(10))
   sFreeBlocks = Trim$(Mid$(arrTemp[6], RInStr(arrTemp[6], Space$(1))))
   sBlockSize = Trim$(Mid$(arrTemp[5], RInStr(arrTemp[5], Space$(1))))
   iFreeBytes = CLng(sFreeBlocks) * CLng(sBlockSize)
ELSE IF sFilesystem = "JFS" THEN 
   SHELL "echo dm | jfs_debugfs " & sDevice TO sTemp
   sTemp = Trim$(sTemp)
   arrTemp = Split(sTemp, Chr$(10))
   sFreeBlocks = Trim$(Mid$(Left$(arrTemp[8], RInStr(arrTemp[8], "[") - 1), InStr(arrTemp[8], ":") + 1))
   sBlockSize = Trim$(Mid$(arrTemp[2], RInStr(arrTemp[2], Space$(1))))
   iFreeBytes = HexToLong(sFreeBlocks) * CLng(sBlockSize)
ELSE IF sFilesystem = "FAT12" OR sFilesystem = "FAT16" OR sFilesystem = "FAT32" THEN 'Who even uses FAT12 on today's hard-drives anyway?!
   SHELL "dosfsck -v " & sDevice TO sTemp 'The "-a" switch should also be used to automaticaly repair a FAT partition, but that can take ages...lets see how well it works without it.
   sTemp = Trim$(sTemp)
   arrTemp = Split(sTemp, Chr$(10))
   'Debug
   ' FOR i = 0 TO arrTemp.Length - 1
   '    PRINT arrTemp[i]
   ' NEXT 
   'Reuse sTemp, can't get sFreeBlocks in one go
   sTemp = Trim$(Mid$(Left$(arrTemp[arrTemp.Length - 1], RInStr(arrTemp[arrTemp.Length - 1], "/") - 1), InStr(arrTemp[arrTemp.Length - 1], ",") + 1))
   'PRINT sTemp
   sTemp2 = Trim$(Mid$(Left$(arrTemp[arrTemp.Length - 1], RInStr(arrTemp[arrTemp.Length - 1], Space$(1))), RInStr(arrTemp[arrTemp.Length - 1], "/") + 1))
   'PRINT sTemp2
   sFreeBlocks = Str(CLng(Val(sTemp2) - CLng(Val(sTemp))))
   sBlockSize = Trim$(Left$(Trim$(arrTemp[7]), InStr(Trim$(arrTemp[7]), Space$(1))))
   iFreeBytes = CLng(sFreeBlocks) * CLng(sBlockSize)
ELSE IF sFilesystem = "NTFS" THEN 
   SHELL "ntfsresize --info --force --no-progress-bar " & sDevice TO sTemp
   sTemp = Trim$(sTemp)
   arrTemp = Split(sTemp, Chr$(10))
   'It would be a lot easier to use an expression in the output of ntfsresize to identify the number of free bytes, but that is not i18n ready!
   'So "chomp" away portions of the string until the first integer is found (this will be the free space value)
   'PRINT arrTemp[10]
   sTemp = arrTemp[10]
   WHILE Len(sTemp) > 0
      sTemp2 = Trim$(Left$(sTemp, InStr(sTemp, Space$(1))))
      IF IsInteger(Val(sTemp2)) OR IsLong(Val(sTemp2)) THEN 
         sUsedBlocks = CLng(Val(sTemp2))
         BREAK
      ELSE 
         sTemp = Trim$(Mid$(sTemp, InStr(sTemp, Space$(1))))
      ENDIF
   WEND      
   'sBlockSize = Trim$(Mid$(Left$(arrTemp[3], RInStr(arrTemp[3], Space$(1))), InStr(arrTemp[3], ":") + 1))
   sTemp = Trim$(Mid$(arrTemp[5], InStr(arrTemp[5], ":") + 1)) 'Get total partition size
   sTemp2 = Trim$(Left(sTemp, InStr(sTemp, Space$(1))))
   iFreeBytes = CLng(sTemp2) - CLng(sUsedBlocks)
ELSE 
   iFreeBytes = 0
ENDIF 

RETURN iFreeBytes
   
  
END