AutoIT Controllo ricorsivo delle azioni su file e cartelle in userspace

Stato
Discussione chiusa ad ulteriori risposte.

S&A

Utente Bronze
28 Maggio 2015
24
3
2
38
Ho creato questo piccolo codicino e non so perché non funzia, se lo uso per una sola cartella restituisce l'output in console giusto, ma messo così non mi dà niente!
Nemmeno errori in realtà, secondo voi cosa sbaglio?
Cioè è chiaro quello che deve fare, deve restituire dell'output specifico ad ogni azione eseguita su un file all'interno di qualsiasi cartella/subcartella a partire dall'@HomePath, però non so forse ho combinato un casino con gli array.
Chiedo umilmente il parere dei più esperti!

Codice:
Local $Search = _FileListToArrayRec (@HomePath, "*.*", 2, 1, 0, 2)
Local $num = $Search[0]
Local $i
Local $e
Local $f
Local $pBuffer[$num]
Local $aData[$num]
Local $hDirectory[$num]
Local $Datas
   If IsArray ($Search) Then
   For $i = 1 To $Search[0]
    ;ConsoleWrite ($Search[$i] & @CRLF)
    $hDirectory[$i] = _WinAPI_CreateFileEx($Search[$i], $OPEN_EXISTING, $FILE_LIST_DIRECTORY, BitOR($FILE_SHARE_READ, $FILE_SHARE_WRITE), $FILE_FLAG_BACKUP_SEMANTICS)
    If @error Then
    _WinAPI_ShowLastError('', 1)
    EndIf
    $pBuffer[$i] = _WinAPI_CreateBuffer(8388608)
    $Datas = $aData[$i]
    $Datas = _WinAPI_ReadDirectoryChanges($hDirectory[$i], BitOR($FILE_NOTIFY_CHANGE_FILE_NAME, $FILE_NOTIFY_CHANGE_DIR_NAME), $pBuffer[$i], 8388608, 1)
    Check ()
   Next
   EndIf

Func Check ()
;While 1
   If IsArray ($Datas) Then
   For $e = 1 To $Datas[0][0]
      ;ConsoleWrite ($aData[$i][0] & @CRLF)
      If $Datas[$e][1] = 1 Then
      ConsoleWrite ($Search[$i] & "\" & $Datas[$i][0] & " has been created" & @CRLF)
      ElseIf $Datas[$e][1] = 2 Then
      ConsoleWrite ($Search[$i] & "\" & $Datas[$i][0] & " has been removed" & @CRLF)
      ElseIf $Datas[$e][1] = 3 Then
      ConsoleWrite ($Search[$i] & "\" & $Datas[$i][0] & " has been modified" & @CRLF)
      ElseIf $Datas[$e][1] = 4 Then
      ;ConsoleWrite ($g_sPath & "\" & $aData[$i][0] & " has been renamed" & @CRLF)
      Local $OldName = $Datas[$e][0]
      ElseIf $Datas[$e][1] = 5 Then
      ConsoleWrite ($Search[$i] & "\" & $OldName & " has been renamed to " & $Search[$i] & "\" & $Datas[$e][0] & @CRLF)
      Else
      ConsoleWrite ($Datas[$e][0] & @CRLF)
      ConsoleWrite ($Datas[$e][1] & @CRLF)
      EndIf
   Next
   EndIf
;WEnd
EndFunc
 
Eh niente, a quanto pare c'ha il flag recursive, in pratica tutti quegli array sono tempo perso :/
Ecco la versione corretta D:


Codice:
#include <Beta\APIFilesConstants.au3>
#include <Beta\Array.au3>
#include <Beta\MsgBoxConstants.au3>
#include <Beta\WinAPIDiag.au3>
#include <Beta\WinAPIFiles.au3>
#include <Beta\WinAPISys.au3>

Global $g_sPath = @HomePath
Global $aData
Global $OldName
Global $e
Global $pBuffer

Local $hDirectory = _WinAPI_CreateFileEx($g_sPath, $OPEN_EXISTING, $FILE_LIST_DIRECTORY, BitOR($FILE_SHARE_READ, $FILE_SHARE_WRITE), $FILE_FLAG_BACKUP_SEMANTICS)
If @error Then
    _WinAPI_ShowLastError('', 1)
EndIf

Local $pBuffer = _WinAPI_CreateBuffer(8388608)

Local $aData
While 1
    $aData = _WinAPI_ReadDirectoryChanges($hDirectory, BitOR($FILE_NOTIFY_CHANGE_FILE_NAME, $FILE_NOTIFY_CHANGE_DIR_NAME), $pBuffer, 8388608, 1)
    If Not @error Then
      ;_ArrayDisplay($aData, '_WinAPI_ReadDirectoryChanges')
      If IsArray ($aData) Then
      For $e = 1 To $aData[0][0]
      ;ConsoleWrite ($aData[$e][0] & @CRLF)
      If $aData[$e][1] = 1 Then
      ConsoleWrite ($g_sPath & "\" & $aData[$e][0] & " has been created" & @CRLF)
      ElseIf $aData[$e][1] = 2 Then
      ConsoleWrite ($g_sPath & "\" & $aData[$e][0] & " has been removed" & @CRLF)
      ElseIf $aData[$e][1] = 3 Then
      ConsoleWrite ($g_sPath & "\" & $aData[$e][0] & " has been modified" & @CRLF)
      ElseIf $aData[$e][1] = 4 Then
      ;ConsoleWrite ($g_sPath & "\" & $aData[$e][0] & " has been renamed" & @CRLF)
      Local $OldName = $aData[$e][0]
      ElseIf $aData[$e][1] = 5 Then
      ConsoleWrite ($g_sPath & "\" & $OldName & " has been renamed to " & $g_sPath & "\" & $aData[$e][0] & @CRLF)
      Else
      ConsoleWrite ($aData[$e][0] & @CRLF)
      ConsoleWrite ($aData[$e][1] & @CRLF)
      EndIf
   Next
   EndIf
    Else
        _WinAPI_ShowLastError('', 1)
    EndIf
WEnd
 
Stato
Discussione chiusa ad ulteriori risposte.