Jump to content

Recommended Posts

Hello, i want to search several directories for files with the largest numbers behind them (Like "video123") . They dont have a datatype. But there are also files with longer names and datatypes in these folders (Like "video778.mp4"). Is it possible to filter the _FileListToArray Syntax from

Quote

_FileListToArray($filedir & $arr[$i], $arr[$i] & "*", 1)

to smth. like

Quote

_FileListToArray($filedir & $arr[$i], $arr[$i] & " 3 Numbers", 1)

 

Here is my Code

#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <array.au3>
#include <File.au3>

$filedir = @ScriptDir & "\"
_checkfile()

Func _checkfile()
    ConsoleWrite("______________________" & @CRLF)
    Local $arr[3] = ["music", "picture", "video"]

    For $i = 0 To UBound($arr) - 1
        Local $arrayfiles = _FileListToArray($filedir & $arr[$i], $arr[$i] & "*", 1)
        If @error = 1 Then
            ConsoleWrite($arr[$i] & "Error 1")
        EndIf
        If @error = 4 Then
            ConsoleWrite($arr[$i] & "Error 2")
            ;Exit
        EndIf
        $arrayfilter = _ArrayMax($arrayfiles, 0, 1)
        Global $stringfiles = StringReplace($arrayfilter, $arr[$i], "")
        ConsoleWrite($arrayfilter & @CRLF)
    Next
EndFunc   ;==>_checkfile

 

Edited by Blitzkid

Share this post


Link to post
Share on other sites

Yes, you'll just need to loop through your array to strip out the music/picture/video text before getting the max...

; Strip out the current file prefix
For $f = 0 To UBound($arrayFiles) - 1
    $arrayFiles[$f] = StringReplace($arrayFiles[$f], $arr[$i], "")
Next

; Get the max
$arrayfilter = _ArrayMax($arrayFiles, 0, 1)

; Put the prefix back
$arrayfilter = $arr[$i] & $arrayfilter

All my code provided is Public Domain... but it may not work. ;) Use it, change it, break it, whatever you want.

Share this post


Link to post
Share on other sites
1 hour ago, seadoggie01 said:

Yes, you'll just need to loop through your array to strip out the music/picture/video text before getting the max...

; Strip out the current file prefix
For $f = 0 To UBound($arrayFiles) - 1
    $arrayFiles[$f] = StringReplace($arrayFiles[$f], $arr[$i], "")
Next

; Get the max
$arrayfilter = _ArrayMax($arrayFiles, 0, 1)

; Put the prefix back
$arrayfilter = $arr[$i] & $arrayfilter

Thx for the fast reply, but my problem is that i only need the files with the name f.e. video544 (always 3 numbers behind it). There are also files like video737.mp4 included. But i dont need them, but when i search for the maxnumber i'll always get the one with .mp4 in the end, instead of f.e. video544.... I need a solution that replace the "*" filter in _FileListToArray to something like "3 numbers"...

Share this post


Link to post
Share on other sites

> I need a solution that replace the "*" filter in _FileListToArray to something like "3 numbers"...

Maybe  "???" instead of  "*".  I think this will work. Not exactly what you want, but closer ("videoABC" will also be found)

Ajag

 

Edited by ajag

Rule #1: Always do a backup         Rule #2: Always do a backup (backup of rule #1)

Share this post


Link to post
Share on other sites
2 minutes ago, ajag said:

> I need a solution that replace the "*" filter in _FileListToArray to something like "3 numbers"...

Maybe  "???" instead of  "*".  I think this will work. Not exactly what you want, but closer ("videoABC" will also be found)

Ajag

 

Yes ??? is a option, but it includes letters aswell, is there a filter that includes only numbers?

Share this post


Link to post
Share on other sites

To ignore non-numbers, just wrap it in Number(), it returns 0 when the value isn't a number, so it will never be the max :)

; Strip out the current file prefix
For $f = 0 To UBound($arrayFiles) - 1
    $arrayFiles[$f] = Number(StringReplace($arrayFiles[$f], $arr[$i], ""))
Next

; Get the max
$arrayfilter = _ArrayMax($arrayFiles, 1, 1)

; Put the prefix back
$arrayfilter = $arr[$i] & $arrayfilter
Edited by seadoggie01
ArrayMax should get largest integer, not character

All my code provided is Public Domain... but it may not work. ;) Use it, change it, break it, whatever you want.

Share this post


Link to post
Share on other sites
2 minutes ago, seadoggie01 said:

To ignore non-numbers, just wrap it in Number(), it returns 0 when the value isn't a number, so it will never be the max :)

; Strip out the current file prefix
For $f = 0 To UBound($arrayFiles) - 1
    $arrayFiles[$f] = Number(StringReplace($arrayFiles[$f], $arr[$i], ""))
Next

; Get the max
$arrayfilter = _ArrayMax($arrayFiles, 0, 1)

; Put the prefix back
$arrayfilter = $arr[$i] & $arrayfilter

This sounds good, i'll test it out tomorrow and update this post :)

Share this post


Link to post
Share on other sites
16 hours ago, Blitzkid said:

I need a solution that replace the "*" filter in _FileListToArray to something like "3 numbers"...

It is, as far as I know, not possible to use a regular expression as a filter in _FileListToArray(Rec).

Here is a variation with FileFindFirstFile and FileFindNextFile (will also match video001). I moved the array from the function to the global scope too.

In the attachment you will find a Zip with test files (dummies only). Like in your script the subfolders \music , \picture and \video are used.

#include <File.au3>

Global $g_sFileDir
Global $g_aArr[3] = ["music", "picture", "video"]

For $i = 0 To UBound($g_aArr) - 1
    $g_sFileDir = @ScriptDir & "\" & $g_aArr[$i] & "\"
    ConsoleWrite("< "& $g_aArr[$i] & " -> highest number = " & _GetFileHighNum($g_sFileDir, $g_aArr[$i]) & @CRLF)
Next

; ---------------------------------------------------------------------
Func _GetFileHighNum($sFileDir, $sSearchName)
    Local $hSearch, $sCurrentFile, $iMaxNum = 0, $iNum = 0
    $hSearch = FileFindFirstFile($sFileDir & $sSearchName & '*')
    If $hSearch = -1 Then Return 0
    While 1
        $sCurrentFile = FileFindNextFile($hSearch)
        If @error Then
            FileClose($hSearch)
            Return $iMaxNum
        EndIf
        If StringRegExp($sCurrentFile, '(?i)^' & $sSearchName & '\d{3}$') Then
            $iNum = Number(StringRegExpReplace($sCurrentFile, '\D', ''))
            If (Not @error) And ($iNum >= $iMaxNum) Then $iMaxNum = $iNum
        EndIf
    WEnd
EndFunc   ;==>_GetFileHighNum

TestFolders.zip

Edited by Musashi
moved FileClose($hSearch) to if @error

Musashi-C64.png

"In the beginning the Universe was created. This has made a lot of people very angry and been widely regarded as a bad move."

Share this post


Link to post
Share on other sites
8 hours ago, Musashi said:

It is, as far as I know, not possible to use a regular expression as a filter in _FileListToArray(Rec).

Here is a variation with FileFindFirstFile and FileFindNextFile (will also match video001). I moved the array from the function to the global scope too.

In the attachment you will find a Zip with test files (dummies only). Like in your script the subfolders \music , \picture and \video are used.

#include <File.au3>

Global $g_sFileDir
Global $g_aArr[3] = ["music", "picture", "video"]

For $i = 0 To UBound($g_aArr) - 1
    $g_sFileDir = @ScriptDir & "\" & $g_aArr[$i] & "\"
    ConsoleWrite("< "& $g_aArr[$i] & " -> highest number = " & _GetFileHighNum($g_sFileDir, $g_aArr[$i]) & @CRLF)
Next

; ---------------------------------------------------------------------
Func _GetFileHighNum($sFileDir, $sSearchName)
    Local $hSearch, $sCurrentFile, $iMaxNum = 0, $iNum = 0
    $hSearch = FileFindFirstFile($sFileDir & $sSearchName & '*')
    If $hSearch = -1 Then Return 0
    While 1
        $sCurrentFile = FileFindNextFile($hSearch)
        If @error Then Return $iMaxNum
        If StringRegExp($sCurrentFile, '(?i)^' & $sSearchName & '\d{3}$') Then
            $iNum = Number(StringRegExpReplace($sCurrentFile, '\D', ''))
            If (Not @error) And ($iNum >= $iMaxNum) Then $iMaxNum = $iNum
        EndIf
    WEnd
    FileClose($hSearch)
EndFunc   ;==>_GetFileHighNum

TestFolders.zip 3.19 kB · 0 downloads

Thats exactly what i needed, thank you very much ♥

Also big thank you to @seadoggie01 and @ajag

Edited by Blitzkid

Share this post


Link to post
Share on other sites
5 minutes ago, Blitzkid said:

Thats exactly what i needed, thank you very much ♥

You are welcome 🙂.

I have made one minor change : FileClose($hSearch) was moved from the end of the function behind if @error... (view my code sample above), because I leave the while loop with Return, not with ExitLoop.


Musashi-C64.png

"In the beginning the Universe was created. This has made a lot of people very angry and been widely regarded as a bad move."

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

  • Similar Content

    • By VinMe
      HELLO All,
      is there any function in Auto it to Remove the repeating  strings separated by ","  which is present in the array.
      ex.
      Available state
      a[0]= D97,D96,,D85,D86,D85,D86,D85,D86,D85,,D86,D85,D86,D85,D86
      a[1]=D85,D24,,,,,D85
      Required state
      a[0]= D97,D96,D85,D86,
      a[1]=D85,D24
      thank  you in advance!
      vin!
    • By D2thunder
      Hi all, I wasnt active in this Forum forum for Years. 😅
      Since I need something with Json in AutoIt i write a little UDF to save a variable to file to read it with another language - and back. After a while until my other script grows i thought - lets integrate all variables wich is possible, because i want have arrays to.
      This is my first public UDF in Autoit - normaly my AutoIt scripts are quick an dirty.... - like the examples for this udf. - someone want to write nice examples?
      I tried to write this UDF properly, cared for processing speed, low mem consumption as possible, a short code, and a high usability without beeing very familiar with arrays.
      What is it for? - convert nearly all types of variables to a json string for saving it in a file or to an ini. Read it back in to a same formated variable and preserv variable types. All array types are supported with nested arrays, the only restriction is ram and array/stringsize - and time if the array is very big. You can use Filters for variable types and some other options.
      If anyone found a bug or any suggestions, please post it.
       
      get Json.au3 from here Json.au3
       
       
      JsonVar 2019.01.25.1.zip
    • By Ho3ein
      Hi, i have a source code of "Danny35d" and i have 2 main question that are:
       How to extract this function's results (Datas are as Array) to combo-box without set number of datas?  When i type 1, 2 in _SystemUsers($AccountType = 0) to get only Local or Domain users, it just give me both of them, it's old problem of this function, please share us debugged code :)❤ #include <Array.au3> $Users = _ArrayToString(_SystemUsers(), "|", 1) ConsoleWrite($Users & @CRLF) #cs =============================================================================== Function: _SystemUsers($AccountType = 0) Description: Return an array with the local or domain username Parameter(s): $AccountType: Local, domain or both username 0 = Local and Domain usernames 1 = Local usernames only 2 = Domain usernames only Returns: An array with the list of usernames - Succeeded @error 1 - Didn't query any username @error 2 - Failed to create Win32_SystemUsers object @error 3 - Invalid $AccountType Author(s): Danny35d #ce =============================================================================== Func _SystemUsers($AccountType = 0) Local $aSystemUsers Local $wbemFlagReturnImmediately = 0x10, $wbemFlagForwardOnly = 0x20 Local $colItems = "", $strComputer = "localhost" If Not StringRegExp($AccountType, '[012]') Then Return SetError(3, 3, '') $objWMIService = ObjGet("winmgmts:\\" & $strComputer & "\root\CIMV2") $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_SystemUsers", "WQL", _ $wbemFlagReturnImmediately + $wbemFlagForwardOnly) If IsObj($colItems) Then For $objItem In $colItems $Output = StringSplit($objItem.PartComponent, ',') If IsArray($Output) Then $Temp = StringReplace(StringTrimLeft($Output[2], StringInStr($Output[2], '=', 0, -1)), '"', '') If $AccountType = 0 Or ($AccountType = 1 And @ComputerName = $Temp) Then $aSystemUsers &= StringReplace(StringTrimLeft($Output[1], StringInStr($Output[1], '=', 0, -1)), '"', '') & '|' ElseIf $AccountType = 2 And @ComputerName <> $Temp Then $aSystemUsers &= StringReplace(StringTrimLeft($Output[1], StringInStr($Output[1], '=', 0, -1)), '"', '') & '|' EndIf EndIf Next $aSystemUsers = StringTrimRight($aSystemUsers, 1) If $aSystemUsers = '' Then Return(SetError(1, 1, $aSystemUsers)) Return(SetError(0, 0, StringSplit($aSystemUsers, '|'))) Else $aSystemUsers = '' Return(SetError(2, 2, $aSystemUsers)) EndIf EndFunc ;==>_SystemUsers Thanks to your best Team.
    • By sksbir
      Hi
      Trying this from autoit v3.3.14.5 and SCITE 3.19.102.1901.0 :
      help file , page "Language Reference - Variables" , sample autoit script about maps:

      Maps must be declared before use by defining their scope using the 'Global/Local/Static' keywords. Local $mControls[]
      So is my test script : only with this local declation.
      -check syntax is OK
      - running script : 

      test.au3" (13) : ==> Variable subscript badly formatted.: Local $mControls[] Local $mControls[^ ERROR ->14:51:49 AutoIt3.exe ended.rc:1
      any clue ?
    • By jmp
      Script running good but error in line 7.
      When i run this script :
      #include <IE.au3> #include <Array.au3> $oIE = _IEAttach ("Shop") $oTable = _IETableGetCollection ($oIE, 1) $aTableData = _IETableWriteToArray ($oTable) For $inumber = 1 To UBound($aTableData) -1 $table = $aTableData[4][$inumber] MsgBox(0, "", $table) Next I got Error: array variable has incorrect number of subscripts or subscript dimension range exceeded
×
×
  • Create New...