Hen Posted July 17, 2022 Share Posted July 17, 2022 Hi All, Newb to scripting and confused on how to call an array. Based on help section, I saw that there are a way to get certain period by using array value in FileGetTime. $filePath = "\\server\abc\" $fileList = _FileListToArrayRec($filePath, "ABC_*_*", 1, 0, 0, 0) _ArrayDisplay($fileList) $gettime = FileGetTime($fileList, 1, 0) IF ($gettime[3] >= 1 AND $gettime[3] <= 12) THEN MsgBox(0,"", "File created on " & $gettime[3] & $gettime[4] & $gettime[5], 10) ELSE MsgBox(0,"","FAILED", 10) ENDIF But the Msgbox will not return the value I want and only display blank area. Please advise. Thank you in advance. Link to comment Share on other sites More sharing options...
Moderators JLogan3o13 Posted July 17, 2022 Moderators Share Posted July 17, 2022 @Henwelcome to the forum. A couple of things to help you along, without giving away the fish: You have to loop through the array one by one, calling FileGetTime on each file; you cannot just point it at the array as a whole. Something like this: For $a = 1 To $fileList[0] $gettime = FileGetTime($fileList[$a], $FT_CREATED, $FT_ARRAY) ... Next As for taking this info and determining the most recently created file, please search the forum as there are many solutions to this problem. Just one that might be of interest to you is Subz' solution in this (albeit older) thread: Finding the latest file - AutoIt General Help and Support - AutoIt Forums (autoitscript.com) "Profanity is the last vestige of the feeble mind. For the man who cannot express himself forcibly through intellect must do so through shock and awe" - Spencer W. Kimball How to get your question answered on this forum! Link to comment Share on other sites More sharing options...
Hen Posted July 18, 2022 Author Share Posted July 18, 2022 9 hours ago, JLogan3o13 said: @Henwelcome to the forum. A couple of things to help you along, without giving away the fish: You have to loop through the array one by one, calling FileGetTime on each file; you cannot just point it at the array as a whole. Something like this: For $a = 1 To $fileList[0] $gettime = FileGetTime($fileList[$a], $FT_CREATED, $FT_ARRAY) ... Next As for taking this info and determining the most recently created file, please search the forum as there are many solutions to this problem. Just one that might be of interest to you is Subz' solution in this (albeit older) thread: Finding the latest file - AutoIt General Help and Support - AutoIt Forums (autoitscript.com) Hi JLogan3o13, So I tried this with my script but it will return 0 value even though I got the latest modified file stored in the array. The reason is because of "Subscript is a non-accesible varible" when I tried to put the condition IF, is there a way for me to call the array value in FileGetTime? $filePath = "\\server\abc\" $fileList = _FileListToArrayRec($filePath, "ABC_*_*", 1, 0, 0, 0) _ArrayDisplay($fileList) For $i = 1 To $fileList[0] $gettime = FileGetTime($fileList[$i], 1, 0) IF ($gettime[3] >= 1 AND $gettime[3] <= 12) THEN MsgBox(0,"", "File created on " & $gettime[3] & $gettime[4] & $gettime[5], 10) ELSE MsgBox(0,"","FAILED", 10) ENDIF Next Link to comment Share on other sites More sharing options...
Hen Posted July 18, 2022 Author Share Posted July 18, 2022 1 minute ago, Hen said: Hi JLogan3o13, So I tried this with my script but it will return 0 value even though I got the latest modified file stored in the array. The reason is because of "Subscript is a non-accesible varible" when I tried to put the condition IF, is there a way for me to call the array value in FileGetTime? $filePath = "\\server\abc\" $fileList = _FileListToArrayRec($filePath, "ABC_*_*", 1, 0, 0, 0) _ArrayDisplay($fileList) For $i = 1 To $fileList[0] $gettime = FileGetTime($fileList[$i], 1, 0) IF ($gettime[3] >= 1 AND $gettime[3] <= 12) THEN MsgBox(0,"", "File created on " & $gettime[3] & $gettime[4] & $gettime[5], 10) ELSE MsgBox(0,"","FAILED", 10) ENDIF Next The array is a single dimension array containing six elements: $aArray[0] = year (four digits) $aArray[1] = month (range 01 - 12) $aArray[2] = day (range 01 - 31) $aArray[3] = hour (range 00 - 23) $aArray[4] = min (range 00 - 59) $aArray[5] = sec (range 00 - 59) Link to comment Share on other sites More sharing options...
Solution pixelsearch Posted July 18, 2022 Solution Share Posted July 18, 2022 Hey everybody I'm having an issue with OP's question, something strange. I tested his script on a folder named C:\Temp7 containing 4 files : test part2.exe (this 1st file got a creation time = 05:17:01 as shown in Windows Explorer) vtest part1.a3x vtest part1.au3 vtest part1.exe If I run the following script (based on OP's script & JLogan3o13's suggestion), then it works fine for the 1st file... #include <Array.au3> #include <File.au3> #include <MsgBoxConstants.au3> $filePath = "C:\Temp7" ; or "C:\Temp7\" $fileList = _FileListToArrayRec($filePath, "*", $FLTAR_FILES, $FLTAR_NORECUR , $FLTAR_NOSORT , $FLTAR_NOPATH) ; $fileList = _FileListToArrayRec($filePath, "*", $FLTAR_FILES, $FLTAR_NORECUR , $FLTAR_NOSORT , $FLTAR_RELPATH) ; $fileList = _FileListToArrayRec($filePath, "*", $FLTAR_FILES, $FLTAR_NORECUR , $FLTAR_NOSORT , $FLTAR_FULLPATH) ; (+++) ; $fileList = _FileListToArray($filePath, "*", $FLTA_FILES , False) ; False = no fullpath appended ; $fileList = _FileListToArray($filePath, "*", $FLTA_FILES , True) ; True = fullpath appended (+++) _ArrayDisplay($fileList) For $i = 1 To $fileList[0] $aGetTime = FileGetTime($fileList[$i], $FT_CREATED, $FT_ARRAY) ConsoleWrite("@error = " & @error & " " & $fileList[$i] & @crlf) If $aGetTime[3] >= 1 And $aGetTime[3] <= 12 Then MsgBox(0, $fileList[$i], "File created (hhmmss) : " & $aGetTime[3] & $aGetTime[4] & $aGetTime[5]) Else MsgBox(0, $fileList[$i], "Failed") EndIf Next ...then the scripts ends with an error. AutoIt Console : @error = 0 test part2.exe @error = 1 vtest part1.a3x "script path here...294.au3" (24) : ==> Subscript used on non-accessible variable.: If $aGetTime[3] >= 1 And $aGetTime[3] <= 12 Then If $aGetTime^ ERROR >Exit code: 1 Time: 3.944 The error seems easy to solve : the fullpath should be appended as last parameter in _FileListToArrayRec() or _FileListToArray(), but OP didn't append it, this created the issue. This being said, an important question isn't answered : why FileGetTime() didn't throw an error for the 1st file ? Nothing in the array shown in the pic above indicates to FileGetTime() where to find the 1st file, so how FileGetTime() did find the path of the 1st file ? And if it found the 1st file path, why not doing same for the 3 other files ? * Please note that even if the 1st file has been processed by FileGetTime(), without @error, the file creation time shown in the precedent pic isn't accurate, it should be 05h17m01s and not 05h16m53s as shown in the pic above. The accurate creation time would be displayed correctly only if we append the full path in the _FileListToArrayRec() or _FileListToArray() functions (tested). * Could this strange behavior be related to the FindFirstFile windows API, its search handle and the dozen of remarks found on msdn ? FindFirstFile is used in both functions _FileListToArrayRec() and _FileListToArray() It's interesting to note that there's never an issue with FileGetTime() when there's only 1 file to process, even if we make a "mistake" by not appending the full path in _FileListToArrayRec() or _FileListToArray() functions. As soon as there's a loop and several files are retrieved, then the issue always appears for the 2nd file processed by FileGetTime() and also @error = 1 for all the remaining files (when we don't indicate a full path as last parameter) Let's hope I didn't miss something obvious. Maybe it's a bug that should be reported : imho FileGetTime() shouldn't process the 1st file at all in the preceding script... but it does ! Musashi 1 Link to comment Share on other sites More sharing options...
Belini Posted July 18, 2022 Share Posted July 18, 2022 @Hen, i once made a script to backup the latest files and maybe it can help you in some way. Link: https://www.autoitscript.com/forum/topic/196238-application-to-back-up/?do=findComment&comment=1406967 My Codes: Virtual Key Code UDF: http://www.autoitscript.com/forum/topic/138246-virtual-key-code-udf/ GuiSplashTextOn.au3: http://www.autoitscript.com/forum/topic/143542-guisplashtexton-udf/ Menu versions of Autoit: http://www.autoitscript.com/forum/topic/137435-menu-versions-of-autoit/#entry962011 Selects first folder of letters: ]http://www.autoitscript.com/forum/topic/144780-select-folders-by-letter/#entry1021708/spoiler] List files and folders with long addresses.: http://www.autoitscript.com/forum/topic/144910-list-files-and-folders-with-long-addresses/#entry102 2926 Program JUKEBOX made in Autoit:some functions:http://www.youtube.com/watch?v=WJ2tC2fD5Qs Navigation to search:http://www.youtube.com/watch?v=lblwOFIbgtQ Link to comment Share on other sites More sharing options...
Hen Posted July 18, 2022 Author Share Posted July 18, 2022 1 hour ago, pixelsearch said: ...then the scripts ends with an error. AutoIt Console : @error = 0 test part2.exe @error = 1 vtest part1.a3x "script path here...294.au3" (24) : ==> Subscript used on non-accessible variable.: If $aGetTime[3] >= 1 And $aGetTime[3] <= 12 Then If $aGetTime^ ERROR >Exit code: 1 Time: 3.944 The error seems easy to solve : the fullpath should be appended as last parameter in _FileListToArrayRec() or _FileListToArray(), but OP didn't append it, this created the issue. * Please note that even if the 1st file has been processed by FileGetTime(), without @error, the file creation time shown in the precedent pic isn't accurate, it should be 05h17m01s and not 05h16m53s as shown in the pic above. The accurate creation time would be displayed correctly only if we append the full path in the _FileListToArrayRec() or _FileListToArray() functions (tested). Hi pixelsearch, Thank you so much for the point above, it is kinda mindblown for me to struggling (few days) in the array while the issue is on _FileListToArrayRec() .. ; $fileList = _FileListToArrayRec($filePath, "*", $FLTAR_FILES, $FLTAR_NORECUR , $FLTAR_NOSORT , $FLTAR_RELPATH) ; $fileList = _FileListToArrayRec($filePath, "*", $FLTAR_FILES, $FLTAR_NORECUR , $FLTAR_NOSORT , $FLTAR_FULLPATH) ; (+++) ; $fileList = _FileListToArray($filePath, "*", $FLTA_FILES , False) ; False = no fullpath appended ; $fileList = _FileListToArray($filePath, "*", $FLTA_FILES , True) ; True = fullpath appended (+++) Link to comment Share on other sites More sharing options...
Hen Posted July 18, 2022 Author Share Posted July 18, 2022 1 hour ago, Belini said: @Hen, i once made a script to backup the latest files and maybe it can help you in some way. Link: https://www.autoitscript.com/forum/topic/196238-application-to-back-up/?do=findComment&comment=1406967 Thank you for the references to help my scripting hobby😀 Link to comment Share on other sites More sharing options...
mikell Posted July 18, 2022 Share Posted July 18, 2022 9 hours ago, pixelsearch said: why FileGetTime() didn't throw an error for the 1st file ? As the script you posted above works if you put " FileChangeDir($filePath) " just before the For loop I would say that it's workingdir related ... obviously it is not an explanation Link to comment Share on other sites More sharing options...
pixelsearch Posted July 18, 2022 Share Posted July 18, 2022 Hi mikell, Thanks for your input and test. I just found a thread named "FileGetTime problem" where Geosoft talks about a file "really being held in memory" or "it's definitely the Windows cache". Though it's not the same situation, I was thinking too about the possibility of Windows using some infos from its cache (for the 1st file) in the script above. Then googling on this subject show several posts (outside AutoIt too) where people have problems with all this. Anyway, as it works really fine when the fullpath is included, I think we shouldn't spend too much time trying to understand, in this very case, why the 1st file is processed by FileGetTime() when no fullpath is indicated (and it's processed wrongly concerning the creation time) . Checking on @error should be a reflex in many cases. Let Windows play with its cache as looong as it wishes Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now