Что нового

Поиск и копирование файлов

Ed_Vard

Новичок
Сообщения
19
Репутация
0
Доброго времени суток, уважаемые форумчане! Прошу помощи в решении следующей задачи!
Читал подрбные ситуации на форуме - но не смог разобраться :(
Ситуация следующая: есть сетевой диск - допустим Q:\ на котором есть папка arhiv т.е. вот так Q:\Arhiv\ в ней есть файлы имеющие вот такое название PFR-700-Y-2010-ORG-022-033-001234-DCK-12000-DPT-000000-DCK-00000.XML и еще подпапки в которых находяться такие же файлы. Этих файлов великое множество - и скаждым разом все увеличиваеться - искать вручную и копировать становиться утомительным занятием. Отмеченные красным - это код организации - может быть одинаковым у множества файлов, отмеченный синим - по одному коду организации не может быть одинаковым, но у другой организации может совпадать!
Идея такова - есть файл Excel - в котором по столбцу допустим A1 внесены наименования файлов списком вот такого вида PFR-700-Y-2010-ORG-022-033-001234-DCK-12000-DPT-000000-DCK-00000.XML - которые нужно найти по соответствию красному и синему полю в папке Q:\Arhiv\ и скопировать на локальный диск допустим сюда C:\zagruz\ - а если такой файл отсутствует - отметить в excel к примеру красным цветом!
Вопрос в том - как это можно реализовать! Заранее спасибо за ответ!
 

aleratorio

Осваивающий
Сообщения
85
Репутация
42
Хотелось бы уточнить:
1. Файлы надо искать такие, что бы у них совпадало и красное число и синее число одновременно?
2. Возможны ли в подкаталогах Q:\Arhiv\ файлы с одинаковыми именами?
3. Файлы надо сохранять учитывая структуру каталогов, или просто кидать все в C:\zagruz\
4. Если файлы с одинаковым именем возможны, и все копируются в C:\zagruz\, без учета структуры каталогов, то каким образом они должны быть переименованы?
 
Автор
E

Ed_Vard

Новичок
Сообщения
19
Репутация
0
1. Да - именно так - совпадало и красное и синее число одновременно
2. В каталоге Q:\Arhiv\ одинаковых имен быть не может, а вот подкаталоге допустим Q:\Arhiv\111\ может быть!
3. Просто копировать в папку C:\zagruz\ без структуры
4. Если попадуться одинаковые файлы в разных подкаталогах - то переименовать добавив цифру 1,2.... и т.д. если есть несколько таких файлов - например вот так 1-PFR-700-Y-2010-ORG-022-033-001234-DCK-12000-DPT-000000-DCK-00000.XML
 

aleratorio

Осваивающий
Сообщения
85
Репутация
42
Ну вот что у меня получилось:
Код:
#include <Excel.au3>

$sArhiv = 'Q:\Arhiv\'
$sDest = 'C:\zagruz\'
$sExcellFileName = 'Xml.xlsx'

$oExcel = _ExcelBookAttach('Microsoft Excel - ' & $sExcellFileName, 'Title')
$i = 1
While 1
    $sCellValue = _ExcelReadCell($oExcel, $i, 1)
	If $sCellValue = '' Then ExitLoop
	_ExcelWriteCell($oExcel, SearchAndCopy($sArhiv, $sDest, $sCellValue) & ' Files Copied', $i, 2)
	$i += 1
WEnd

Exit

Func SearchAndCopy($sSearchDir, $sCopyDir, $sValue)
	$search = FileFindFirstFile($sSearchDir & "*.*")
	$ret = 0

	While 1
		$sSourceFile = FileFindNextFile($search)
		if @error then ExitLoop
		if @extended Then
			$ret += SearchAndCopy($sSearchDir & $sSourceFile & "\", $sCopyDir, $sValue)
			ContinueLoop
		EndIf

		$sSearchSubstring = StringRegExpReplace($sValue, '.*(-\d+-DCK-\d+-DPT-).*', '\1')
		If StringInStr($sSourceFile, $sSearchSubstring) <> 0 Then
			$sCopyName = $sSourceFile
			$j = 0
			$bNotCopy = False
			While FileExists($sCopyDir & $sCopyName)
				If StringCompare(FileGetTime($sSearchDir & $sSourceFile, 0, 1), FileGetTime($sCopyDir & $sCopyName, 0, 1)) = 0 Then
					$bNotCopy = True
					ExitLoop
				EndIf
				$j += 1
				$sCopyName = StringTrimRight($sSourceFile, 4) & '_' & $j & '.XML'
			WEnd
			If Not $bNotCopy Then
				FileCopy($sSearchDir & $sSourceFile, $sCopyDir & $sCopyName)
				$ret += 1
			EndIf
		EndIf
	WEnd

	return $ret
EndFunc


Перед запуском скрипта должен быть в Excel-е открыт файл 'Xml.xlsx'(В моем случае), или нужно поменять значение $sExcellFileName на ваше имя файла.

В первом столбце, начиная с первой строки и вниз должен находиться список файлов для поиска.

Как сделать красным шрифт не найденных значений я не знаю, так что просто во втором столбце выдается количество скопированных файлов.

Функция проверяет файлы по времени модификации, если время модификации найденного файла совпадает с временем модификации файла в каталоге C:\zagruz\, то файл считается идентичным и не копируется. Сделано, для того что бы не создавалось множество копий одинаковых файлов после повторных запусков скрипта.

К файлам с одинаковым именем добавляется _1, _2 и т.п. Так будет удобнее сортировать файлы по имени, чем если бы цифра добавлялась в начале.
 
Автор
E

Ed_Vard

Новичок
Сообщения
19
Репутация
0
aleratorio Большое спасибо - практически то что нужно, осталось добавить сообщение о начале работы скрипта и завершении и немного переделать чтение из Excel - в остальном - именно то что нужно! Огромна благодарность! на 10000 файлов работает вполне нормально!
 
Верх