Problem with script

Posted on 2006-11-29
Last Modified: 2010-04-30
I initially wrote a script that returns # of files, folders and folder size in a specific folder based on an input directory.  I am trying to modify the script to read from a source file, and it is not working.  Additionally, on directories with less than 100KB, it is not returning size.  Can someone help me de-bug it please?  Code is below.




Option Explicit
On Error Resume Next

Dim objfso, boolExcel, objXL, cellcount, nTotal, FolderCount, drive, fso, fl, folder, fsize, TotalSize, openfile, fstring_err

set objfso = createobject("scripting.filesystemobject")

if objfso.FileExists("C:\Program Files\Microsoft Office\Office11\excel.exe") then
      boolExcel = true
      Set objXL = WScript.CreateObject("Excel.Application")
end if

if boolExcel then
      objXL.Visible = TRUE

      objXL.Columns(1).ColumnWidth = 30
      objXL.Columns(2).ColumnWidth = 30
      objXL.Columns(3).ColumnWidth = 30
      objXL.Columns(4).ColumnWidth = 30
      objXL.Cells(1, 1).Value = "Folder Name"
      objXL.Cells(1, 2).Value = "Number of Files"
      objXL.Cells(1, 3).Value = "Number of Folders"
      objXL.Cells(1, 4).Value = "Size of Root Folder"

      cellcount = 4
      set output = objfso.CreateTextFile("filecheck.txt",true)
      output.writeline "Folder Name,File Count,Size"
end if

Set fso = CreateObject("Scripting.FileSystemObject")
Set fstring_err = fso.CreateTextFile("c:\errorlog.txt", True)
Set getfilepath = fso.GetFile("c:\checkfilesize.txt")
Set openfile = getfilepath.OpenAsTextStream(1, -2)
        Do While Not openfile.AtEndOfStream
                  strfilepath = ""
                  strfilepath = openfile.ReadLine
                              For Each strfilepath in getfilepath
                                    Set fl = fso.GetFolder(strfilepath)                        
                                          GetFileCount fl
                                          objXL.Cells(cellcount,1) = fl.path
                                          objXL.Cells(cellcount,2) = nTotal
                                          objXL.Cells(cellcount,3) = FolderCount
                                          objXL.Cells(cellcount,4) = fsize
                                          cellcount = cellcount + 1
            msgbox "Process completed!"
Set fso = Nothing
Set wsh = Nothing

Function GetFileCount(fl)
Dim nextFolder, folders, Files, SubFolders, SubFolder, firstpass, nextf
nextFolder = fl.Path
Set Files = fl.Files
Set folders = fl.subfolders
nTotal = nTotal + Files.Count
FolderCount = FolderCount + folders.Count
Set SubFolders = fl.SubFolders
For Each SubFolder In SubFolders
      nextf = nextf & folders.Count
    nextFolder = nextFolder & GetFileCount(SubFolder)
            fsize = round(fl.size /1024)
            if len(fsize) >= 4 then
                  fsize = Round(fsize /1024) & " MB"
                  fsize = Round(fsize) & " KB"
            end if      
      if err.number <> 0 then
            msgBox SubFolder & " - " & err.description
      end if            
End Function
Question by:iptrader
LVL 12

Accepted Solution

jkaios earned 500 total points
ID: 18041436
Try the new function below (SizeToString) to convert the filesize.

For Each SubFolder In SubFolders
    nextf = nextf & folders.Count
    nextFolder = nextFolder & GetFileCount(SubFolder)
          fsize = SizeToString(fl.size)                                 '<---- TRY IT HERE
     if err.number <> 0 then
          msgBox SubFolder & " - " & err.description
     end if          

Function SizeToString(dBytes)

 Dim sWork  'String
 Dim vWork  'Variant
 Dim lWork   'Long
 Dim dTemp 'Double
 sWork = FormatNumber(dBytes)
 vWork = Split(sWork, ",")
 lWork = UBound(vWork)
 Select Case lWork
   Case 0      '// Hundred
     sWork = " bytes"
     vWork = dBytes
   Case 1      '// Thousand
     dTemp = dBytes / 1024
     sWork = " KB"
     vWork = Round(dTemp, 2)
   Case 2      '// Million
     dTemp = dBytes / (1024 ^ 2)
     sWork = " MB"
     vWork = Round(dTemp, 2)
   Case 3      '// Billion
     dTemp = dBytes / (1024 ^ 3)
     sWork = " GB"
     vWork = Round(dTemp, 2)
   Case 4      '// Trillion
     dTemp = dBytes / (1024 ^ 4)
     sWork = " TB"
     vWork = Round(dTemp, 2)
 End Select
 If InStr(vWork, ".") Then
   SizeToString = FormatNumber(vWork, 1) & sWork
   SizeToString = vWork & sWork
 End If
End Function

Author Comment

ID: 18041520
jkaios, it is still not returning size for anything under 100 KB.  Sorry.


Featured Post

Maximize Your Threat Intelligence Reporting

Reporting is one of the most important and least talked about aspects of a world-class threat intelligence program. Here’s how to do it right.

Join & Write a Comment

Suggested Solutions

There are many ways to remove duplicate entries in an SQL or Access database. Most make you temporarily insert an ID field, make a temp table and copy data back and forth, and/or are slow. Here is an easy way in VB6 using ADO to remove duplicate row…
If you have ever used Microsoft Word then you know that it has a good spell checker and it may have occurred to you that the ability to check spelling might be a nice piece of functionality to add to certain applications of yours. Well the code that…
Get people started with the process of using Access VBA to control Excel using automation, Microsoft Access can control other applications. An example is the ability to programmatically talk to Excel. Using automation, an Access application can laun…
Show developers how to use a criteria form to limit the data that appears on an Access report. It is a common requirement that users can specify the criteria for a report at runtime. The easiest way to accomplish this is using a criteria form that a…

705 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

19 Experts available now in Live!

Get 1:1 Help Now