Sign in to follow this  
Followers 0
tezhihi

File Get Size

5 posts in this topic

#1 ·  Posted (edited)

Hi All,

I have many files inside folder with ID Number. The problem here is I want to get ID Number,  file name inside folder and Get Size of its. However when I use loop "For" the result appeared with duplicate data. Please check the example in attached file and help me make the code below better for this case.

#include <File.au3>
#include <Array.au3>
Global $a, $b
$a = _FileListToArrayEx(@ScriptDir, '*.visf')
For $i = 1 to $a[0]
   $b = StringSplit($a[$i], "\")
;~    _ArrayDisplay($b)
   For $j = 1 to $b[0]
;~    ConsoleWrite($b[$b[0] - 1] & '_' & $b[$b[0]] & '    ' & FileGetSize($a[$i])   & @CRLF)
      FileWrite(@ScriptDir & '\result.txt', $b[$b[0] - 1] & '_' & $b[$b[0]] & '    ' & FileGetSize($a[$i])  & @CRLF)
   Next
Next



Func _FileListToArrayEx($s_path, $s_mask = "*.*", $i_flag = 0, $s_exclude = -1, $f_recurse = True, $f_full_path = True)

    If FileExists($s_path) = 0 Then Return SetError(1, 1, 0)

    ; Strip trailing backslash, and add one after to make sure there's only one
    $s_path = StringRegExpReplace($s_path, "[\\/]+\z", "") & "\"

    ; Set all defaults
    If $s_mask = -1 Or $s_mask = Default Then $s_mask = "*.*"
    If $i_flag = -1 Or $i_flag = Default Then $i_flag = 0
    If $s_exclude = -1 Or $s_exclude = Default Then $s_exclude = ""

    ; Look for bad chars
    If StringRegExp($s_mask, "[/:><\|]") Or StringRegExp($s_exclude, "[/:><\|]") Then
        Return SetError(2, 2, 0)
    EndIf

    ; Strip leading spaces between semi colon delimiter
    $s_mask = StringRegExpReplace($s_mask, "\s*;\s*", ";")
    If $s_exclude Then $s_exclude = StringRegExpReplace($s_exclude, "\s*;\s*", ";")

    ; Confirm mask has something in it
    If StringStripWS($s_mask, 8) = "" Then Return SetError(2, 2, 0)
    If $i_flag < 0 Or $i_flag > 2 Then Return SetError(3, 3, 0)

    ; Validate and create path + mask params
    Local $a_split = StringSplit($s_mask, ";"), $s_hold_split = ""
    For $i = 1 To $a_split[0]
        If StringStripWS($a_split[$i], 8) = "" Then ContinueLoop
        If StringRegExp($a_split[$i], "^\..*?\..*?\z") Then
            $a_split[$i] &= "*" & $a_split[$i]
        EndIf
        $s_hold_split &= '"' & $s_path & $a_split[$i] & '" '
    Next
    $s_hold_split = StringTrimRight($s_hold_split, 1)
    If $s_hold_split = "" Then $s_hold_split = '"' & $s_path & '*.*"'

    Local $i_pid, $s_stdout, $s_hold_out, $s_dir_file_only = "", $s_recurse = "/s "
    If $i_flag = 1 Then $s_dir_file_only = ":-d"
    If $i_flag = 2 Then $s_dir_file_only = ":D"
    If Not $f_recurse Then $s_recurse = ""

    $i_pid = Run(@ComSpec & " /c dir /b " & $s_recurse & "/a" & $s_dir_file_only & " " & $s_hold_split, "", @SW_HIDE, 4 + 2)

    While 1
        $s_stdout = StdoutRead($i_pid)
        If @error Then ExitLoop
        $s_hold_out &= $s_stdout
    WEnd

    $s_hold_out = StringRegExpReplace($s_hold_out, "\v+\z", "")
    If Not $s_hold_out Then Return SetError(4, 4, 0)

    ; Parse data and find matches based on flags
    Local $a_fsplit = StringSplit(StringStripCR($s_hold_out), @LF), $s_hold_ret
    $s_hold_out = ""

    If $s_exclude Then $s_exclude = StringReplace(StringReplace($s_exclude, "*", ".*?"), ";", "|")

    For $i = 1 To $a_fsplit[0]
        If $s_exclude And StringRegExp(StringRegExpReplace( _
            $a_fsplit[$i], "(.*?[\\/]+)*(.*?\z)", "\2"), "(?i)\Q" & $s_exclude & "\E") Then ContinueLoop
        If StringRegExp($a_fsplit[$i], "^\w:[\\/]+") = 0 Then $a_fsplit[$i] = $s_path & $a_fsplit[$i]
        If $f_full_path Then
            $s_hold_ret &= $a_fsplit[$i] & Chr(1)
        Else
            $s_hold_ret &= StringRegExpReplace($a_fsplit[$i], "((?:.*?[\\/]+)*)(.*?\z)", "$2") & Chr(1)
        EndIf
    Next

    $s_hold_ret = StringTrimRight($s_hold_ret, 1)
    If $s_hold_ret = "" Then Return SetError(5, 5, 0)

    Return StringSplit($s_hold_ret, Chr(1))
EndFunc

 

Example.zip

Edited by tezhihi

Share this post


Link to post
Share on other sites



#3 ·  Posted

The 2nd For/Next loop is useless 

#include <File.au3>
#include <Array.au3>
Global $a, $b
$a = _FileListToArrayEx(@ScriptDir, '*.visf')
;  _ArrayDisplay($a)
For $i = 1 to $a[0]
      $b = StringSplit($a[$i], "\")
;~    ConsoleWrite($b[$b[0] - 1] & '_' & $b[$b[0]] & '    ' & FileGetSize($a[$i])   & @CRLF)
      FileWrite(@ScriptDir & '\result.txt', $b[$b[0] - 1] & '_' & $b[$b[0]] & '    ' & FileGetSize($a[$i])  & @CRLF)
Next

 

 

1 person likes this

Share this post


Link to post
Share on other sites

#4 ·  Posted

4 hours ago, mikell said:

The 2nd For/Next loop is useless 

#include <File.au3>
#include <Array.au3>
Global $a, $b
$a = _FileListToArrayEx(@ScriptDir, '*.visf')
;  _ArrayDisplay($a)
For $i = 1 to $a[0]
      $b = StringSplit($a[$i], "\")
;~    ConsoleWrite($b[$b[0] - 1] & '_' & $b[$b[0]] & '    ' & FileGetSize($a[$i])   & @CRLF)
      FileWrite(@ScriptDir & '\result.txt', $b[$b[0] - 1] & '_' & $b[$b[0]] & '    ' & FileGetSize($a[$i])  & @CRLF)
Next

 

 

Thank you so muchhhhhhhhhh @mikell

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now
Sign in to follow this  
Followers 0

  • Similar Content

    • ur
      By ur
      I have an ini file which has structure as below.

      And I want to use this value and change only the file name in below path of another ini file.
       
      Can you suggest any approach.


    • 31290
      By 31290
      Hi everyone
      Hope you're doing great today.
      Well, I have a little question about extracting a certain string from a file name to make comparison after treatment.
      Let's get into the details:
      First of all, I gather and store a machine BIOS Version by running this:
      RunWait(@ComSpec & " /c " & "wmic bios get SMBIOSBIOSVERSION >> C:\Drivers\Tag.txt" & @CRLF, "", @SW_HIDE, "$STDOUT_CHILD") _FileWriteToLine("c:\Drivers\BIOS_Version.txt", 1, "", 1) $sContent = FileRead ("C:\Drivers\BIOS_Version.txt") $sContent = StringRegExpReplace($sContent, " ", "") Result is, for example, A10
      Then, I download the latest available BIOS version from the Dell related model website and the filename of the latest BIOS is stored in a $sBIOSName variable.
      Result is for example, E5440A14.exe
      What i can't figure out is how to extract the Bios name stored in the $sBIOSName knowing that each model this app would run won't have the same number of chars.
      Indeed, I have some OPL790AXX.exe / OPL7010AXX.exe / E5470AXX.exe etc...
      I imagine something like getting the whole string, left trimming it to the first A found count 2 chars on the right and store them to have the possibility to make the check between A10 and A14 (as the number of char of filenames is never the same)
      Hope this is clear  If not, don't hesitate to ask for more.
      Thanks in advance for the help
       
    • Scottswan
      By Scottswan
      Basically I'm looking to make a snapshot of a whole HD's folders and files in one text file. Just the names. Preferably in alphabetical order.
      Folder 1
          File 1
          File 2
          File 3
      Folder 2
         Etc

      Is there a function that can copy just the names without opening the files? An alternative would be to put each into rename mode and then copy the text, but that is going to be painfully slow.
      Thanks.
    • triodz
      By triodz
      Hi Everyone! Been away from scripting for a bit and am a bit rusty. 
      I was trying to get downloaded image filenames to increment by one. I was hoping to be able to check the last filename and continue from there if the program was closed and reopened again.
      #include <ButtonConstants.au3> #include <GUIConstantsEx.au3> #include <StaticConstants.au3> #include <WindowsConstants.au3> #Region ### START Koda GUI section ### Form= $biolister = GUICreate("Form1", 125, 97, 192, 124) GUISetBkColor(0x99B4D1) $start = GUICtrlCreateButton("Start", 8, 40, 41, 33) GUICtrlSetBkColor(-1, 0x00FFFF) $stop = GUICtrlCreateButton("Stop", 72, 40, 41, 33) GUICtrlSetBkColor(-1, 0xFF0000) $Bio = GUICtrlCreateLabel("Bio Lister", 24, 8, 80, 28) GUICtrlSetFont(-1, 14, 400, 0, "MS Sans Serif") GUISetState(@SW_SHOW) #EndRegion ### END Koda GUI section ### While 1 $filename = 0 $sImgDir = "C:\filepathname\"&$filename&".jpg" $sImgUrl = "http://lorempixel.com/400/200" $nMsg = GUIGetMsg() Switch $nMsg Case $GUI_EVENT_CLOSE Exit Case $stop Exit case $start InetGet($sImgUrl, $simgdir, 1, 0) if fileexists( $simgdir & $filename) then $filename + 1 EndSwitch WEnd
    • Cybergon
      By Cybergon
      Hey guys!

      I tried looking for something like this in the web but could only find broken/impractical scripts or bogus download pages, so I made it and decided to share for future generations. The way it works is it takes all the files in the folder you run the script on, and given a choice it either turns the filename into "randomxx - filename.ext", "randomxx.ext" or you could use it to remove the "randomxx - " tag to undo what you did.

      Well at least I hope that's the way it works, so be careful and use at your own discretion!


      #include <File.au3> #include <Array.au3> $farray=_FileListToArray(@ScriptDir) Global $temp[UBound($farray)],$error=1,$count=0,$random[UBound($farray)+1],$ok=0 Do $flag=InputBox("Filename Randomizer","Hello, this script works in the folder you run it on, so be careful!"&@CRLF&@CRLF&"1 to randomize keeping name"&@CRLF&"2 to randomize ditching name"&@CRLF&"3 to remove randomized tag") If @error=1 Then Exit Switch $flag Case $flag = 1 $ok =1 Case $flag = 2 $ok =1 Case $flag = 3 $ok =1 Case Else $exit=MsgBox(5,"error","You must input a valid option") If $exit = 2 Then Exit EndSwitch Until $ok =1 If $flag=1 Or $flag=2 Then ProgressOn("Filename Randomizer","Organizing files...","0%") For $i=1 To UBound($farray)-1 ProgressSet(($i*100)/(UBound($farray)-1),Int(($i*100)/(UBound($farray)-1))&"%") If $farray[$i]=@ScriptName Then Sleep(1) Else $temp[$i]=$farray[$i] Local $crumps[UBound($farray)+1] If $farray[$i]=$i Then $error=1 Else $error=FileMove(@ScriptDir&""&$farray[$i],@ScriptDir&""&$i) EndIf $j=1 $k=$i If $error=0 Then Do $error=0 While $error=0 $crumps[$j]=$k For $index=1 to UBound($farray)-1 If $farray[$index] = $k Then ExitLoop Else If $k = UBound($farray)-1 Then MsgBox(0,"FATAL ERROR","One of the files is in use or something weird happened, sorry but I'm too lazy to work around this one, be more careful next time!") Exit EndIf EndIf Next $k=$index $error=FileMove(@ScriptDir&""&$farray[$k],@ScriptDir&""&$k) If $error=0 Then $j+=1 Else $farray[$k]=$k $j-=1 $k=$crumps[$j] If $j=0 Then FileMove(@ScriptDir&""&$farray[$i],@ScriptDir&""&$i) $farray[$i]=$i ExitLoop EndIf EndIf WEnd Until $j=0 Else $farray[$i]=$i EndIf EndIf Next EndIf $random=_RandomUnique($farray[0],0,$farray[0]-1,1) If $flag=3 Then ProgressOn("Filename Randomizer","Checking and renaming...","0%") For $i=1 To UBound($farray)-1 If $farray[$i]=@ScriptName Then Sleep(1) Else If $flag = 1 Then ProgressSet(($i*100)/(UBound($farray)-1),Int(($i*100)/(UBound($farray)-1))&"%","Renaming") FileMove(@ScriptDir&""&$farray[$i],@ScriptDir&""&"random"&$random[$i]&" - "&$temp[$i]) ElseIf $flag = 2 Then ProgressSet(($i*100)/(UBound($farray)-1),Int(($i*100)/(UBound($farray)-1))&"%","Renaming") $artempex=StringSplit($temp[$i],".") If @error=1 Then FileMove(@ScriptDir&""&$farray[$i],@ScriptDir&""&"random"&$random[$i]) Else $tempext=$artempex[UBound($artempex)-1] FileMove(@ScriptDir&""&$farray[$i],@ScriptDir&""&"random"&$random[$i]&"."&$tempext) EndIf ElseIf $flag = 3 Then ProgressSet(($i*100)/(UBound($farray)-1),Int(($i*100)/(UBound($farray)-1))&"%") $artempex=StringSplit($farray[$i]," - ",1) If Not @error=1 Then $rerror=StringInStr($artempex[1],"random",1) If Not $rerror=0 Then FileMove(@ScriptDir&""&$farray[$i],@ScriptDir&""&StringTrimLeft($farray[$i],3+StringLen($artempex[1]))) $count+=1 EndIf EndIf EndIf Next ProgressOff() If $count=0 And $flag=3 Then MsgBox (0,"","No files had that") Else MsgBox (0,"","Done! Press F5 on your folder") EndIf ; #FUNCTION# ==================================================================================================================== ; Version........: 1.1 - 2011/11/24 ; Name...........: _RandomUnique ; Description ...: Returns an array of unique random numbers ; Syntax.........: _RandomUnique($iCount, $nMin, $nMax, [$iInt = 0, [$nSeed = Default]]) ; Parameters ....: $iCount - The amount of numbers to generate Number between 1 and 10^6-1 ; $nMin - The smallest number to be generated. Number between -2^31 and 2^31-1 ; $nMax - The largest number to be generated. Number between -2^31 and 2^31-1 ; $iInt - [optional] If this is set to 1 then an integer result will be returned. Default is a floating point number. ; $nSeed - [optional] Seed value for random number generation. Number between -2^31 and 2^31-1 ; Return values .: Success - Returns a 1-dimensional array containing only unique numbers ; $Array[0] = count of generated numbers ; $Array[1] = first number ; $Array[2] = second number, etc ; Failure - Returns 0 and sets @error: ; | 1 - $iCount is too small ; | 2 - $iCount is too large ; | 3 - $nMin and $nMax are equal ; | 4 - $nMin is larger than $nMax ; | 5 - $nMin or $nMax exceeds limit ; | 6 - $nSeed exceeds limit ; Author ........: money ; Modified.......: ; Remarks .......: If $iInt is 1 and $iCount exceeds total unique numbers than @extend is set to 1 and item count is adjusted to the ; + maximum numbers that can be returned ; Related .......: ; Link ..........: ; Example .......: Yes ; =============================================================================================================================== Func _RandomUnique($iCount, $nMin, $nMax, $iInt = 0, $nSeed = Default) ; error checking Select ; $iCount is too small Case ($iCount < 1) Return SetError(1, 0, 0) ; $iCount is too large Case ($iCount > 10^6-1) Return SetError(2, 0, 0) ; $nMin and $nMax cannot be equal Case ($nMin = $nMax) Return SetError(3, 0, 0) ; $nMin cannot be larger than $nMax Case ($nMin > $nMax) Return SetError(4, 0, 0) ; $nMin or $nMax exceeds limit Case ( ($nMin < -2^31) Or ($nMax > 2^31-1) ) Return SetError(5, 0, 0) EndSelect ; user specific seed If IsNumber($nSeed) Then ; $nSeed exceeds limit If (($nSeed < -2^31) Or ($nSeed > 2^31-1) ) Then Return SetError(6, 0, 0) SRandom($nSeed) EndIf ; $iCount is equal too or exceeds maximum possible unique values Local $iCountInval = 0 If ($iInt) Then ; positive If ($nMin >= 0) Then If ($iCount > ($nMax-$nMin)+1) Then $iCountInval = 1 ElseIf ($iCount = ($nMax-$nMin)+1) Then $iCountInval = 3 EndIf ; negative to positive Else If ($iCount > ($nMax + Abs($nMin)+1)) Then $iCountInval = 2 ElseIf ($iCount = ($nMax + Abs($nMin)+1)) Then $iCountInval = 3 EndIf EndIf EndIf ; courtesy If ($iInt And $iCount = 1) Then Local $aArray[2] = [1, Random($nMin, $nMax, $iInt)] ; $iCount is too large so we will generate as much we can from $nMin to $nMax values ElseIf $iCountInval Then If $iCountInval = 1 Then $iCount = Int($nMax - $nMin)+1 ElseIf $iCountInval = 2 Then $iCount = Int($nMax + Abs($nMin))+1 EndIf ; $iCount is equal to total unique numbers If $iCountInval = 3 Then $iCountInval = 0 Local $aTmp, $iA, $iNumber = $nMin, $aArray[$iCount + 1] = [$iCount] ; add our numbers sequentially (from $iMin to $iMax) For $i = 1 To $aArray[0] $aArray[$i] = $iNumber $iNumber += 1 Next ; swap every x index value with a random index value For $i = 1 To $aArray[0] $iA = Random($i, $aArray[0], 1) If $i = $iA Then ContinueLoop If $iA = 0 Then $iA = $aArray[0] $aTmp = $aArray[$i] $aArray[$i] = $aArray[$iA] $aArray[$iA] = $aTmp Next Else ; everything else is ok, generate unique numbers Local $nRnd, $iStep = 0, $aArray[$iCount + 1] = [$iCount] While ($iStep <= $iCount-1) $nRnd = Random($nMin, $nMax, $iInt) ; check if the number already exist If IsDeclared($nRnd) <> -1 Then $iStep += 1 $aArray[$iStep] = $nRnd ; store our numbers in a local variable Assign($nRnd, '', 1) EndIf WEnd EndIf Return SetError(0, Number($iCountInval > 0), $aArray) EndFunc
      Thanks to money for such an efficient snippet!