Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] Поиск файлов в подпапках и их последующее копирование (http://forum.oszone.net/showthread.php?t=131478)

D_Master 09-02-2009 21:34 1033923

Поиск файлов в подпапках и их последующее копирование
 
Подскажите, пожалуйста, как можно найти все txt-файлы в определенной папке (желательно бы по маске имени, дабы не задеть ненужные - файлы имеют названия типа log.%DATE%.txt)[/off] и её подпапках, скопировать в стороннюю папку и добавить в начало всех исходных файлов слово "Скопировано"?

Буду рад любым безумным идеям :)

Creat0R 09-02-2009 22:52 1033995

Например так:

Код:

;8 это чтобы создать папку если не существует, 1 это перезапись файлов
$iRet = _FilesCopy_Proc("C:\Source", "C:\Dest", "log.*.txt", "Скопировано_", 8+1)
$iExtended = @extended
$iError = @error

MsgBox(64, "Results", StringFormat("ERROR:\t\t%i\nReturn:\t\t%i\nFiles Copied:\t%i", $iError, $iRet, $iExtended))

Func _FilesCopy_Proc($sSrc_Dir, $sDst_Dir, $sFile_Filter, $sFile_Prefix="", $iReplace=0)
    If Not StringInStr(FileGetAttrib($sSrc_Dir), "D") Then Return SetError(1, 0, 0)

    Local $iRet_Extended = 0, $sRegExp_Filter, $hSearch, $sFile_Path, $sFile_Name

    $sSrc_Dir
= StringRegExpReplace($sSrc_Dir, "\\+$", "")
    $sDst_Dir = StringRegExpReplace($sDst_Dir, "\\+$", "")

    $sRegExp_Filter = $sFile_Filter
    $sRegExp_Filter
= StringReplace($sRegExp_Filter, ".", "\.")
    $sRegExp_Filter = "(?i)\A" & StringReplace($sRegExp_Filter, "*", ".*") & "\z"

    $hSearch = FileFindFirstFile($sSrc_Dir & "\*")

    While 1
        $sFile_Name = FileFindNextFile($hSearch)
        If @error Then ExitLoop

        $sFile_Path = $sSrc_Dir & "\" & $sFile_Name

        If StringInStr(FileGetAttrib($sFile_Path), "D") > 0 Then
            _FilesCopy_Proc($sFile_Path, $sDst_Dir, $sFile_Filter, $sFile_Prefix, $iReplace)
            $iRet_Extended += @extended
        Else
            If
StringRegExp($sFile_Name, $sRegExp_Filter) Then _
                $iRet_Extended += FileCopy($sFile_Path, $sDst_Dir & "\" & $sFile_Prefix & $sFile_Name, $iReplace)
        EndIf
    WEnd

    Return
SetExtended($iRet_Extended, FileClose($hSearch))
EndFunc


D_Master 10-02-2009 04:22 1034166

Creat0R, супер, спасибо!!
Я чуть-чуть не так выразился - слово "Скопировано" надо было добавить в содержимое файла, т.е., открыть его для записи и написать туда :) В принципе, с переименованием даже лучше, но был бы признателен, если бы показали пример такого действия ;)

Creat0R 10-02-2009 04:48 1034169

Цитата:

Цитата D_Master
слово "Скопировано" надо было добавить в содержимое файла »

Как новую строку?

Вот так примерно:

Код:

;8 это чтобы создать папку если не существует, 1 это перезапись файлов
$iRet = _FilesCopy_Proc("C:\Source", "C:\Dest", "log.*.txt", "Скопировано", 8 + 1)
$iExtended = @extended
$iError = @error

MsgBox(64, "Results", StringFormat("ERROR:\t\t%i\nReturn:\t\t%i\nFiles Copied:\t%i", $iError, $iRet, $iExtended))

Func _FilesCopy_Proc($sSrc_Dir, $sDst_Dir, $sFile_Filter, $sFile_Prefix = "", $iReplace = 0)
    If Not StringInStr(FileGetAttrib($sSrc_Dir), "D") Then Return SetError(1, 0, 0)

    Local $iRet_Extended = 0, $sRegExp_Filter, $hSearch, $sFile_Path, $sFile_Name, $iFile_Copied, $sFile_Read, $hFile_Open

    $sSrc_Dir
= StringRegExpReplace($sSrc_Dir, "\\+$", "")
    $sDst_Dir = StringRegExpReplace($sDst_Dir, "\\+$", "")

    $sRegExp_Filter = $sFile_Filter
    $sRegExp_Filter
= StringReplace($sRegExp_Filter, ".", "\.")
    $sRegExp_Filter = "(?i)\A" & StringReplace($sRegExp_Filter, "*", ".*") & "\z"

    $hSearch = FileFindFirstFile($sSrc_Dir & "\*")

    While 1
        $sFile_Name = FileFindNextFile($hSearch)
        If @error Then ExitLoop

        $sFile_Path = $sSrc_Dir & "\" & $sFile_Name

        If StringInStr(FileGetAttrib($sFile_Path), "D") > 0 Then
            _FilesCopy_Proc($sFile_Path, $sDst_Dir, $sFile_Filter, $sFile_Prefix, $iReplace)
            $iRet_Extended += @extended
        Else
            If
StringRegExp($sFile_Name, $sRegExp_Filter) Then
                $iFile_Copied = FileCopy($sFile_Path, $sDst_Dir & "\" & $sFile_Name, $iReplace)
                $iRet_Extended += $iFile_Copied

                If $iFile_Copied Then
                    $sFile_Read = FileRead($sDst_Dir & "\" & $sFile_Name)

                    $hFile_Open = FileOpen($sDst_Dir & "\" & $sFile_Name, 2)
                    FileWrite($hFile_Open, $sFile_Prefix & @CRLF & $sFile_Read)
                    FileClose($hFile_Open)
                EndIf
            EndIf
        EndIf
    WEnd

    Return SetExtended($iRet_Extended, FileClose($hSearch))
EndFunc


D_Master 10-02-2009 07:32 1034188

Creat0R, самое оно!! :clapping: :clapping: Спасибо большое, не в первый раз выручаете!


Время: 18:19.

Время: 18:19.
© OSzone.net 2001-