Что нового

Копирование файлов с заданным текстом внутри

Moonsin

Новичок
Сообщения
17
Репутация
2
Версия AutoIt: 3.3.6.1

Описание:
Необходимо найти и скопировать текстовые файлы, имеющие внутри заранее определенный текст.

Примечания: Имена файлов неизвестны, необходима проверка всех файлов в директории. Файлы состоят из 1 строки.
 
Автор
M

Moonsin

Новичок
Сообщения
17
Репутация
2
Возможно есть поддиректории, но в них проверка не требуется.


Добавлено:
Сообщение автоматически объединено:

Еще пожелание. Реализовать это в виде ничего-не-выводящей-на-экран функции, которая принимает параметром строку для поиска.
 

Zaramot

I ♥ AutoIt
Сообщения
1,160
Репутация
660
1) А какой текст должен быть в файле ?
2) А куда нужно скопировать найденные файлы ?
 
Автор
M

Moonsin

Новичок
Сообщения
17
Репутация
2
В смысле? Есть набор файлов с случайными_именами.txt. Необходимо скопировать в директорию со скриптом все файлы, внутри которых есть последовательность символов "привет".


Добавлено:
Сообщение автоматически объединено:

@ScriptDir для простоты.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Moonsin,
Попробуйте так:
Код:
#include <File.au3>

$sSource_Dir = @ScriptDir & '\Source'
$sDest_Dir = @ScriptDir & '\Dest'
$sSearch_Text = 'привет'
$sExtension = 'log'
$iCopy = _Search_Copy($sSource_Dir, $sDest_Dir, $sSearch_Text, $sExtension)
Switch @error
	Case 0
		MsgBox(64, 'Info', _
				StringFormat('Найдено: %d\r\nСкопировано: %d\r\nНе обработано: %d', _
				$iCopy + @extended, $iCopy, @extended))
	Case 1
		MsgBox(16, 'Error', 'Отсутствует папка поиска')
	Case 2
		MsgBox(16, 'Error', 'Для поиска указана не папка')
EndSwitch

Func _Search_Copy($s_Source_Dir, $s_Dest_Dir, $s_Search_Text, $s_Extension = 'txt')
	Local $a_Files_List, $h_File, $s_Read_Text, $i_Copy, $i_No_Copy

	If Not FileExists($s_Source_Dir) Then Return SetError(1, 0, -1)
	If Not StringInStr(FileGetAttrib($s_Source_Dir), 'D') Then Return SetError(2, 0, -1)
	If $s_Extension Then
		If StringLeft($s_Extension, 1) <> '.' Then $s_Extension = '.' & $s_Extension
	EndIf
	$a_Files_List = _FileListToArray($s_Source_Dir, '*' & $s_Extension, 1)
	If @error = 4 Then Return SetError(0, 0, 0)
	For $i = 1 To $a_Files_List[0]
		If Not $s_Extension Then
			If StringInStr($a_Files_List[$i], '.') Then ContinueLoop
		EndIf
		$h_File = FileOpen($s_Source_Dir & '\' & $a_Files_List[$i])
		If $h_File = -1 Then
			$i_No_Copy += 1
			ContinueLoop
		EndIf
		$s_Read_Text = FileRead($h_File)
		If @error Then
			FileClose($h_File)
			$i_No_Copy += 1
			ContinueLoop
		EndIf
		FileClose($h_File)
		If StringInStr($s_Read_Text, $sSearch_Text) Then
			If FileCopy($s_Source_Dir & '\' & $a_Files_List[$i], $s_Dest_Dir & '\' & $a_Files_List[$i], 9) Then
				$i_Copy += 1
			Else
				$i_No_Copy += 1
			EndIf
		EndIf
	Next
	Return SetError(0, $i_No_Copy, $i_Copy)
EndFunc   ;==>_Search_Copy

Если все нормально, то приделаю параметры, а можно еще, например, рядом со скриптом ini-файл подкладывать с параметрами.
 

Zaramot

I ♥ AutoIt
Сообщения
1,160
Репутация
660
Есть более лёгкий вариант:
Код:
$Find = _FindText('привет', 'C:\', @ScriptDir, 'txt')

If $Find = 0 Then
    MsgBox(48, 'Ошибка', 'В заданной директории не найденно файлов !')
Else
    MsgBox(64, 'Поиск', 'Все найденные файлы скопированны !')
EndIf

;=========================================================================
; Параметры:    $Text           - Текст каторый нужно найти в файле.
;               $SearchPath     - Папка где ввести поиск.
;               $CopyPath       - Папка куда копировать найденные файлы.
;               $Extension      - Разширение файла.
;
; Возвращает:   0   - Если ошибка.
;               1   - Если всё прошло успешно.
;=========================================================================
Func _FindText($Text, $SearchPath, $CopyPath, $Extension)
    $Search = FileFindFirstFile($SearchPath & "\*." & $Extension)
    If $Search = -1 Then
        Return 0
    EndIf

    While 1
        $File = FileFindNextFile($Search)
        If @error Then ExitLoop
        If FileRead($SearchPath & '\' & $File) = $Text Then FileCopy($SearchPath & '\' & $File, $CopyPath, 1)
    WEnd
    Return 1
EndFunc   ;==> _FindText
 
Автор
M

Moonsin

Новичок
Сообщения
17
Репутация
2
Спасибо огромное, вариант madmasles работает лучше, т.к. ищет не только целые слова, но и просто буквосочетания.
 
Верх