Home Bunny Posted May 12, 2009 Posted May 12, 2009 Hi, Is there an alternative to 'FileFindFirstFile', that can handle only files created after a specified date ? $Search = FileFindFirstFile($SourceFolder & "\*.chp") Running trough 8700 files with 'FileFindFirstFile' takes 4 minutes, and there are only 5 relevant files ... Regards,
Xenobiologist Posted May 12, 2009 Posted May 12, 2009 (edited) Hi, try this expandcollapse popup#include<Array.au3> $sPath = @ScriptDir ; der Ordner, der durchsucht werden soll $sExt = '.au3' ; Dateiendung der gewünschten Dateien (z.B. alle Txt-Dateien) $sDate = '20090505000000' ; Alle Dateien die neuer sind als dieses Datum/Uhrzeit (Format: YYYYMMDDhhmmss) $array = _GetFilesFolder_Rekursiv($sPath, $sExt, 0, $sDate) ;~ $array = _GetFilesFolder_Rekursiv($sPath, $sExt, 0, -1) _ArrayDisplay($array) ;================================================================================================== ; Function Name: _GetFilesFolder_Rekursiv($sPath [, $sExt='*' [, $iDir=-1 [,$sDate=-1 [, $iRetType=0 ,[$sDelim='0']]]]) ; Description: Rekursive Auflistung von Dateien und/oder Ordnern ; Parameter(s): $sPath der Basispfad für die Auflistung ('.' -aktueller Pfad, '..' -Parentpfad) ; optional: $sExt Erweiterung für Dateiauswahl '*' oder -1 für alle (Standard) ; optional: $iDir -1 Dateien+Ordner(Standard), 0 nur Dateien, 1 nur Ordner ; optional: $sDate gibt nur Dateien/Ordner zurück, die neuer sind als das angegebene Datum ; optional: $iRetType 0 gibt Array, 1 gibt String zurück ; optional: $sDelim legt Trennzeichen für Stringrückgabe fest ; 0 -@CRLF (Standard); 1 -@CR; 2 -@LF; oder beliebiges Zeichen ; Return Value(s): Array (Standard) od. String mit den gefundenen Pfaden der Dateien und/oder Ordner ; Array[0] enthält die Anzahl der gefundenen Dateien/Ordner ; Author(s): BugFix (bugfix@autoit.de) ;================================================================================================== Func _GetFilesFolder_Rekursiv($sPath, $sExt = '*', $iDir = -1, $sDate = -1, $iRetType = 0, $sDelim = '0') If StringLen($sDate) <> 14 Then $sDate = @YEAR & @MON & @MDAY & @HOUR & @MIN & @SEC Global $oFSO = ObjCreate('Scripting.FileSystemObject') Global $strFiles = '' Switch $sDelim Case '1' $sDelim = @CR Case '2' $sDelim = @LF Case Else $sDelim = @CRLF EndSwitch If ($iRetType < 0) Or ($iRetType > 1) Then $iRetType = 0 If $sExt = -1 Then $sExt = '*' If ($iDir < -1) Or ($iDir > 1) Then $iDir = -1 _ShowSubFolders($oFSO.GetFolder($sPath), $sExt, $iDir, $sDate, $sDelim) If $iRetType = 0 Then Local $aOut $aOut = StringSplit(StringTrimRight($strFiles, StringLen($sDelim)), $sDelim, 1) If $aOut[1] = '' Then ReDim $aOut[1] $aOut[0] = 0 EndIf Return $aOut Else Return StringTrimRight($strFiles, 1) EndIf EndFunc ;==>_GetFilesFolder_Rekursiv Func _ShowSubFolders($Folder, $Ext = '*', $Dir = -1, $sDate = -1, $Delim = @CRLF) If Not IsDeclared("strFiles") Then Global $strFiles = '' If ($Dir = -1) Or ($Dir = 0) Then For $file In $Folder.Files If $file.DateLastModified > $sDate Then If $Ext <> '*' Then If StringRight($file.Name, StringLen($Ext)) = $Ext Then _ $strFiles &= $file.Path & $Delim Else $strFiles &= $file.Path & $Delim EndIf EndIf Next EndIf For $Subfolder In $Folder.SubFolders If $Subfolder.DateLastModified > $sDate Then If ($Dir = -1) Or ($Dir = 1) Then $strFiles &= $Subfolder.Path & '\' & $Delim EndIf _ShowSubFolders($Subfolder, $Ext, $Dir, $sDate, $Delim) Next EndFunc ;==>_ShowSubFoldersoÝ÷ Úí+ºÚ"µÍÚ[ÛYH Ð^K]LÉÝÂÚ[ÛYH Ñ]K]LÉÝÂÚ[ÛYH Ñ[K]LÉÝÂÔÛÝÛÌÍÜÛÝÙQÛHØÜ [È ÌÎNÉÌLÉÌÎNÂÑØ][È[È[^BÌÍÙ[SÝHÑ[SÝÐ^J ÌÍÜÛÝÙQÛ ][ÝÊ][ÝËJB[H ÌÍÙÝ[ÌWBÓÛÜÝYÚ^BÜ ÌÍÖHHÈ ÌÍÙ[SÝÌBÔ]Y]HÜX][Û[YHÙ[B ÌÍÑ]HH[QÙ][YJ ÌÍÜÛÝÙQÛ [È ][ÝÉÌLÉ][ÝÈ [È ÌÍÙ[SÝÉÌÍÖKK BÑÜX]]HÜÙHÚ]]HQ ÌÍÙ]HHÝ[ÑÜX] ][ÝÉËÉËÉÈ ÎÎÉ][ÝË ÌÍÑ]VÌK ÌÍÑ]VÌWK ÌÍÑ]VÌK ÌÍÑ]VÌ×K ÌÍÑ]VÍK ÌÍÑ]VÍWJBÐØ[Ý[]HYÙK[[ÝH[ÈÛ[Ù][^ÂYÑ]QY ÌÎNÙ ÌÎNË ÌÍÙ]KÓÝÐØ[Ê JH È È[ÈH[YBÑ[Q[]J ÌÍÜÛÝÙQÛ [È ][ÝÉÌLÉ][ÝÈ [È ÌÍÙ[SÝÉÌÍÖJBÐ^PY ÌÍÙÝ[ ÌÍÜÛÝÙQÛ [È ÌÍÙ[SÝÉÌÍÖJBÓÙÐÞ K ][ÝÑ[È[]Y][ÝË ÌÍÙ[SÝÉÌÍÖKJB[Y ÌÍÙÝ[ÌHHPÝ[ ÌÍÙÝ[ B^Ð^QÜ^J ÌÍÙÝ[ Mega Edited May 12, 2009 by Xenobiologist Scripts & functions Organize Includes Let Scite organize the include files Yahtzee The game "Yahtzee" (Kniffel, DiceLion) LoginWrapper Secure scripts by adding a query (authentication) _RunOnlyOnThis UDF Make sure that a script can only be executed on ... (Windows / HD / ...) Internet-Café Server/Client Application Open CD, Start Browser, Lock remote client, etc. MultipleFuncsWithOneHotkey Start different funcs by hitting one hotkey different times
Moderators SmOke_N Posted May 12, 2009 Moderators Posted May 12, 2009 (edited) Weeeeeeeee. I don't know if 300 ms is suffice for you with 9000 files, but I gave it a shot expandcollapse popup#include <array.au3> #include <date.au3> Global $a_less_than = _File_GetByDate(@HomeDrive & "\AU3", "*.au3", "2009/05/01", 0, 1, 0, 1) _ArrayDisplay($a_less_than, "Less than") Global $a_equal_to = _File_GetByDate(@HomeDrive & "\AU3", "*.au3", "2009/05/01", 1, 1, 0, 1) _ArrayDisplay($a_equal_to, "Equal to") Global $a_greater_than = _File_GetByDate(@HomeDrive & "\AU3", "*.au3", "2009/05/01", 2, 1, 0, 1) _ArrayDisplay($a_greater_than, "Greater than") ;~ $s_date: YYYY/MM/DD [HH:MM:SS] format ;~ $i_less_equal_greater: 0=less, 1=equal, 2=greater ;~ $i_last_created_accessed_written: 0=modified, 1= created, 2=accessed ;~ $i_file_type: 0=All file types, 1=Files only, 2=Directories only Func _File_GetByDate($s_dir, $s_mask, $s_date, $i_less_equal_greater = 0, $i_last_created_accessed_written = 1, $i_file_type = 0, $i_descending = 0, $f_fullpath = True) If StringRegExp($s_date, "\d{4}/\d\d/\d\d") = 0 Then Return SetError(1, 0, 0) Local $a_files = _File_ListByTimeArray($s_dir, $s_mask, $i_last_created_accessed_written, $i_file_type, $i_descending, $f_fullpath) If @error Then Return SetError(2, 0, 0) Local $f_zero_time = False If StringRegExp($s_date, "\d{4}/\d\d/\d\d \d+:\d+:\d+") = 0 Then $s_date &= " 00:00:00" $f_zero_time = True EndIf Local $a_ret[$a_files[0] + 1][2] Local $i_diff, $s_format, $f_add = False Local $a_date, $f_found = 0, $i_cc = 0 For $i = 1 To $a_files[0] $a_date = FileGetTime($a_files[$i], $i_last_created_accessed_written) If @error Then ContinueLoop $s_format = StringFormat("%s/%s/%s %s:%s:%s", _ $a_date[0], $a_date[1], $a_date[2], $a_date[3], $a_date[4], $a_date[5]) If $f_zero_time Then $i_diff = Int(_DateDiff("d", _ $a_date[0] & "/" & $a_date[1] & "/" & $a_date[2] & " 00:00:00", $s_date)) Else $i_diff = Int(_DateDiff("d", $s_format, $s_date)) EndIf If $i_less_equal_greater = 2 And $i_diff < 0 Then If $f_found = 0 Then $f_found = 1 $f_add = True ElseIf $i_less_equal_greater = 0 And $i_diff > 0 Then If $f_found = 0 Then $f_found = 1 $f_add = True ElseIf $i_less_equal_greater = 1 And $i_diff = 0 Then If $f_found = 0 Then $f_found = 1 $f_add = True ElseIf $f_found Then ExitLoop EndIf If $f_add Then $i_cc += 1 $a_ret[$i_cc][0] = $a_files[$i] $a_ret[$i_cc][1] = $s_format EndIf $f_add = False Next If $i_cc = 0 Then Return SetError(3, 0, 0) ReDim $a_ret[$i_cc + 1][2] $a_ret[0][0] = $i_cc Return $a_ret EndFunc ;~ $i_last_created_accessed_written: 0=modified, 1= created, 2=accessed ;~ $i_file_type: 0=All file types, 1=Files only, 2=Directories only Func _File_ListByTimeArray($s_dir, $s_mask = "*", $i_last_created_accessed_written = 1, $i_file_type = 0, $i_descending = 0, $f_fullpath = True) $s_dir = StringRegExpReplace($s_dir, "[\\/]+\z", "") & "\" Local $s_switch = "/T:C", $s_full_path = "/s " Switch $i_last_created_accessed_written Case 2 $s_switch = "/T:A" Case 3 $s_switch = "/T:W" EndSwitch If Not $f_fullpath Then $s_full_path = "" Local $s_file_type = "" If $i_file_type = 1 Then $s_file_type = "/a:-d " ElseIf $i_file_type = 2 Then $s_file_type = "/a:d " EndIf Local $s_descending = "/o:d " If $i_descending Then $s_descending = "/o:-d " Local $s_files = "" Local $i_pid = Run(@ComSpec & _ " /c dir /b " & $s_full_path & $s_file_type & $s_descending & $s_switch & _ ' "' & $s_dir & $s_mask & '"', "", @SW_HIDE, 6) While 1 $s_files &= StdoutRead($i_pid) If @error Then ExitLoop WEnd If Not $s_files Then Return SetError(1, 0, 0) $s_files = StringRegExpReplace($s_files, "\r|\n+\z", "") Return StringSplit($s_files, @LF) EndFunc Edited May 12, 2009 by SmOke_N Common sense plays a role in the basics of understanding AutoIt... If you're lacking in that, do us all a favor, and step away from the computer.
Home Bunny Posted May 12, 2009 Author Posted May 12, 2009 Thx SmOke_N & Xenobiologist for your prompt repleys. altough the script off SmOke_N worked faster, i've used the coding off Xenobiologist (top one) as this worked recurs. Timings for 8700 files with 35 files the last 30 days: FileFindFirstFile: 3 min _GetFilesFolder_Rekursiv: 1 min Thanks !!!!!!!
Moderators SmOke_N Posted May 12, 2009 Moderators Posted May 12, 2009 Thx SmOke_N & Xenobiologist for your prompt repleys.altough the script off SmOke_N worked faster, i've used the coding off Xenobiologist (top one) as this worked recurs.Timings for 8700 files with 35 files the last 30 days:FileFindFirstFile: 3 min_GetFilesFolder_Rekursiv: 1 minThanks !!!!!!! Um, mine is recursive Common sense plays a role in the basics of understanding AutoIt... If you're lacking in that, do us all a favor, and step away from the computer.
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