Что нового

Сравнение списка файлов и каталога с файлами с копированием файлов из каталога

jastreb

Новичок
Сообщения
17
Репутация
1
Доброго дня.
"Партия" :smile: поставила задачу:
Необходимо сравнить список файлов и каталог в котором находится куча подкаталогов и файлов.

Список файлов хранится в book.txt в виде

Как делать деньги на фондовом рынке.djvu
Как привести дела в порядок. Искусство продуктивности без стресса. Дэвид Аллен.pdf
Колин Тернер - Подстрелите обезьянку Секреты нового мышления вбизнесе.djvu
М.Каменнова и др. - Моделирование бизнеса.Технология ARIS.pdf

записей в файле может быть несколько тысяч.

Каталог может выглядеть так E:\New_book
E:\New_book\Энциклопедии\Что такое кто такой.fb2
E:\New_book\Иванов Сказки для самых маленьких.fb2
и т.д.

Если есть совпадения в имени файла который находится в списке book.txt и в каталоге E:\New_book то этот файл из каталога не переносится, если же совпадений нет то файл переносится в каталог E:\book_sort с сохранением пути (нарпимер Энциклопедии\Что такое кто такой.fb2 не нашлось в списке файлов и был перенесен в E:\book_sort\Энциклопедии\Что такое кто такой.fb2 )

ОС Win7 SP1

Сталкивался кто нибудь с подобным? Спасибо.
 

Yuri

AutoIT Гуру
Сообщения
737
Репутация
282
А если без AutoIt?
Есть такая штука "Портфель" в системе WinXP, может и на Win 7 есть.
Если это подходит, то...
 
Автор
J

jastreb

Новичок
Сообщения
17
Репутация
1
Насколько я знаю "Портфель" предназначен не много не для этого. У меня получается огромный объем файлов и через портфель гонять их не получится.
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
jastreb

Как-то так:
Код:
#include <Array.au3>
#include <FileOperations.au3>

$sDirPath1 = @ScriptDir & '\New_book'
$sDirPath2 = @ScriptDir & '\book_sort'

$sFilePath1 = @ScriptDir & '\book.txt'

$sText = FileRead($sFilePath1)

$aFileList = _FO_FileSearch($sDirPath1, '*', True, 125, 1, 1, 0)


For $i = 1 To $aFileList[0]
	$aPath = _FO_PathSplit($aFileList[$i])
	
	If Not StringInStr($sText, $aPath[1]) Then
		FileCopy($aFileList[$i], StringReplace($aFileList[$i], $sDirPath1, $sDirPath2), 9) ; копирование с перезаписью и сохранением подпапок
	EndIf
Next


FileOperations.au3 отсюда http://www.autoitscript.com/forum/topic/133224-filesearch-foldersearch/
положить рядом со скриптом или в папку Include в папке Autoit
 
Автор
J

jastreb

Новичок
Сообщения
17
Репутация
1
2:WSWR
Выдает такую ошибку

E:\Sort\sort_files.au3 (14) : ==> Subscript used with non-Array variable.:
For $i = 1 To $aFileList[1]
For $i = 1 To $aFileList^ ERROR
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
jastreb

Задача была похожая, инвариации всегда новые, под всё один скрипт не сделаешь. Но задачу можно решить так:
Search_files_list.7z - делает поиск по списку и выводит список найденных и не найденных и копирует найденные файлы в отдельный каталог.
Далее утилитой Synchronization сравниваем два каталога - оригинал и папку найденных. Сравнить можно в режиме совпадение и несовпадение. Далее можно выполнить копирование из одной в другую, например не совпавшие при этом изменить реальный путь оригинальной папки, а копирование будет в то место где была оригинальная папка.

Можно ещё так:
Утилитой Create_list_files создаём список файлов, далее сравниваем два списка в утилите Compare strings, там можно получить одинаковые файлы и разные, получаем два списка. Далее скармливаем каждый список вышеуказанной утилите Search_files_list и получаем два комплекта файлов.

И ещё CompareDir можно попробовать.

Если варианты не совсем подходят, то можно используя исходники изменить, но это уже надо думать.
 
Автор
J

jastreb

Новичок
Сообщения
17
Репутация
1
Вопрос решен
Код:
#include <Array.au3>
#include <FileOperations.au3>

$sDirPath1 = @ScriptDir & 'New_book'
$sDirPath2 = @ScriptDir & 'book_sort'
$sFilePath1 = @ScriptDir & 'book.txt'

$sFile = FileOpen ($sFilePath1, 0)
$sText = FileRead($sFile)
FileClose ($sFile)
$aFileList = _FO_FileSearch($sDirPath1, '*', True, 125, 1, 1, 0)

For $i = 1 To $aFileList[0]
   $aPath = _FO_PathSplit($aFileList[$i])
   $aPath12 = $aPath[1] & $aPath[2]
   $sPathSort = StringReplace ($aPath[0], "New_book\", "New_book\book_sort\")
    If Not StringInStr($sText, $aPath12) Then
        FileMove($aFileList[$i], $sPathSort, 9) 
    EndIf
Next


Всем спасибо за помощь и информацию
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
jastreb [?]
[info border=#0000ff float=left]На форуме принято помечать тему решенной после получения ответа на свой вопрос!
Вверху или внизу темы нажмите на ссылку такого вида:
package_old.gif
Тема не решена
[/info]
 
Верх