Войти

Показать полную графическую версию : Скачивание с ftp, обработка файлов и обратная закгрузка


ul9
19-07-2013, 15:51
Здравствуйте.

Вновь решила прибегнуть к помощи форумчан.
Напишу сразу, язык исполнения не имеет значения.

Обрисую картину вкратце:
Есть фтп, на него нужно подключиться, скачать определённые файлы, найти в них заданный текст (конкретная строка HTML). Сделать в файлах замену по образцу и закачать обратно на фтп.

Понимаю, что задача не из простых, поэтому готова отблагодарить материально. :yes:

Если вас ещё не отпугнуло начало, то я продолжу и опишу всё это подробно:

1. Подключаемся к фтп.
Нужно универсальное решение. Т.к. фтп каждый раз разное и всё время редактировать в исходнике user, pass не вариант. Поэтому я вижу такое решение. Запускаю исполнение, появляется пустой текстовый файл. В первой строчке я ввожу фтп адрес, во второй логин, в третьей пароль - нажимаю сохранить и эта информация обрабатывается и происходит подключение.

2. Скачивание файлов.
На каждом фтп структура папок стандартная, но есть лишние файлы, которые нам не нужны. Поэтому нужно скачивать конкретные файлы, которые, например, можно брать из заготовленного списка и поочередно выкачивать. Но, нужно учесть, что при скачивании файлов на компьютер должна сохраниться структура папок с файлами внутри. Скачивание файлов происходит в определённую папку. Назовём её Temp. После скачивания нужно проверить файлы на целостность, конечно необязательно, но бывает так, что фтп не всегда отдаёт файлы. После проверки на наличие всех файлов в папке, мы приступаем к следующему шагу.

3. Обработка файлов.
У нас есть два файла: в одном (файл Search) - что надо найти; во втором (файл Destination) - на что заменить. В этих файлах код html с множеством символов. Так вот, перед началом обработки необходимо проверить наши скаченные файлы в папке Temp на наличие тех самых строк из файла Search. Достаточно вывести количество файлов, в которых были найдены эти строки. Так как всегда количество файлов одинаково. Например: "Заданный текст встречается в 15 файлах". Но текст может встречаться в разных вариациях (лишняя запятая, другое окончание у слова). И текст может не находить. Поэтому скрипт, после поиска в файлах, должен запросить разрешение на работу. Если нажимаю нет, то скрипт завершается и открывает файл Search для редактирования поисковой фразы. Если да, то работа продолжается.
Мы проверили файлы на наличие нужной строки и можем приступить к обработке файлов. Вносим изменения во все файлы в папке Temp и подпапки. Из файла Search ищем, из файла Destination заменяем. И в конце указываем количество файлов, в которых была произведена замена. Например: "Замена произведена в 15 файлах".
Папка Temp содержит в себе скаченные подпапки и файлы с именами на транслите. Поэтому поиск и замену нужно производить и в подпапках в том числе.

4. Закачивание обратно на фтп.
Здесь всё просто. Наши обработанные файлы закачиваем обратно на тот же фтп. Заменяя исходные файлы на фтп и сохраняя структуру папок. После закачивания, нужно отписаться, что все файлы были переданы успешно.

На этом всё.
Прошу прощения за мой "французский".
Спасибо, что дочитали до конца.
Очень рассчитываю на вашу помощь, ограничена во времени. :)

Iska
19-07-2013, 21:00
1. Подключаемся к фтп.
Нужно универсальное решение. Т.к. фтп каждый раз разное и всё время редактировать в исходнике user, pass не вариант. Поэтому я вижу такое решение. Запускаю исполнение, появляется пустой текстовый файл. В первой строчке я ввожу фтп адрес, во второй логин, в третьей пароль - нажимаю сохранить и эта информация обрабатывается и происходит подключение. »
Универсальное решение — использование командной строки, в которой будут указываться потребные параметры, либо имя конфигурационного файла, содержащего потребные параметры. Но никак не то, что Вы описали.

После скачивания нужно проверить файлы на целостность »
Что Вы под этим понимаете?

P.S. Поиск и замена в html-файлах — задача никак не для пакетных файлов.

ul9
19-07-2013, 21:44
либо имя конфигурационного файла, содержащего потребные параметры »
Это было бы хорошо. Запустил скрипт, он открыл конфигурацию, ты внёс свои правки, сохранил, закрыл файл и продолжилась обработка.
Что Вы под этим понимаете? »
Я имела в виду проверку, все ли файлы скачались из списка.
P.S. Поиск и замена в html-файлах — задача никак не для пакетных файлов. »
А как же это?
Кажется это ваш код, если не ошибаюсь. И он отлично работает. Из одного файла берёт что ищем, из другого чем заменяем. И обрабатывает всю папку с подпапками.
Option Explicit

Const ForReading = 1
Const ForWriting = 2


Dim objArgs
Dim objFSO
Dim objFile

Dim strWhatFind
Dim strReplaceBy

Dim strContent


Set objArgs = WScript.Arguments.Named

If objArgs.Count = 4 Then
Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")

If objArgs.Exists("FolderForScan") Then
If objArgs.Exists("FileExtension") Then
If objArgs.Exists("FileWhatFind") Then
If objArgs.Exists("FileReplaceBy") Then
If objFSO.FolderExists(objArgs.Item("FolderForScan")) Then
If objFSO.FileExists(objArgs.Item("FileWhatFind")) Then
If objFSO.FileExists(objArgs.Item("FileReplaceBy")) Then
If objFSO.GetFile(objArgs.Item("FileWhatFind")).Size > 0 Then
With objFSO.OpenTextFile(objArgs.Item("FileWhatFind"), ForReading)
strWhatFind = .ReadAll()
.Close
End With

If objFSO.GetFile(objArgs.Item("FileReplaceBy")).Size > 0 Then
With objFSO.OpenTextFile(objArgs.Item("FileReplaceBy"), ForReading)
strReplaceBy = .ReadAll()
.Close
End With
Else
strReplaceBy = ""
End If

WScript.Echo "Folder for scan: " & objArgs.Item("FolderForScan")
WScript.Echo "File extension: " & objArgs.Item("FileExtension")
WScript.Echo "File what find: " & objArgs.Item("FileWhatFind")
WScript.Echo "File replace by: " & objArgs.Item("FileReplaceBy")
WScript.Echo

ScanSubFolders objFSO.GetFolder(objArgs.Item("FolderForScan"))
Else
WScript.Echo "File [" & objArgs.Item("FileWhatFind") & "] is zero length"
End If
Else
WScript.Echo "File [" & objArgs.Item("FileWhatFind") & "] not found"
End If
Else
WScript.Echo "File [" & objArgs.Item("FileWhatFind") & "] not found"
End If
Else
WScript.Echo "Folder [" & objArgs.Item("FolderForScan") & "] not found"
End If
Else
WScript.Echo "Not found argument <FileReplaceBy>"
Call Usage
End If
Else
WScript.Echo "Not found argument <FileWhatFind>"
Call Usage
End If
Else
WScript.Echo "Not found argument <FileExtension>"
Call Usage
End If
Else
WScript.Echo "Not found argument <FolderForScan>"
Call Usage
End If

Set objFSO = Nothing
Else
Call Usage
End If

Set objArgs = Nothing

WScript.Quit
'=============================================================================

'=============================================================================
Sub ScanSubFolders(objFolder)
Dim objSubFolder
Dim objFile

WScript.Echo "[" & objFolder.Path & "]"

For Each objFile In objFolder.Files
If UCase(objFSO.GetExtensionName(objFile.Name)) = UCase(objArgs.Item("FileExtension")) Then
WScript.Echo " " & objFile.Name

If objFile.Size > 0 Then
With objFSO.OpenTextFile(objFile.Path, ForReading)
strContent = .ReadAll()
.Close
End With

If InStr(1, strContent, strWhatFind, vbTextCompare) > 0 Then
WScript.Echo " Fragment for replace found"

With objFSO.OpenTextFile(objFile.Path, ForWriting)
.Write Replace(strContent, strWhatFind, strReplaceBy)
.Close
End With
End If
End If
End If
Next

WScript.Echo

For Each objSubFolder In objFolder.SubFolders
ScanSubFolders objSubFolder
Next
End Sub
'=============================================================================

'=============================================================================
Sub Usage()
WScript.Echo "Usage: cscript.exe //nologo " & WScript.ScriptName & " " & _
"/FolderForScan:<folder> " & _
"/FileExtension:<extension> " & _
"/FileWhatFind:<file> " & _
"/FileReplaceBy:<file>"
End Sub
'=============================================================================
Вызывается
cscript.exe //nologo replace.vbs /FolderForScan:"%UserProfile%\work" /FileExtension:"html" /FileWhatFind:"text\utf_s.txt" /FileReplaceBy:"text\utf_r.txt"

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

Iska
19-07-2013, 22:21
Запустил скрипт, он открыл конфигурацию, ты внёс свои правки, сохранил, закрыл файл и продолжилась обработка. »
Это не хорошо. Вы создали конфигурационный файл, сохранили и перетянули его на скрипт (если не умеете работать с командной строкой).

Я имела в виду проверку, все ли файлы скачались из списка. »
Ну, об этом сообщит ненулевой код возврата используемого менеджера загрузки. Во всяком случае, так ведут себя приличные утилиты.

А как же это?
Кажется это ваш код, если не ошибаюсь. И он отлично работает. Из одного файла берёт что ищем, из другого чем заменяем. И обрабатывает всю папку с подпапками. »
1. Судя по внешнему виду — да, возможно,что и мой.
2. Работает. Но с текстовыми файлами в ANSI-кодировке. Что до html в какой-нибудь экзотичной кодировке — только теоретически. И будьте готовы к тому, что, например, «&», «<» и «>» (и т.п.) — это «&amp;», «&lt;» и «&gt;». Как при поиске, так и при замене. И не забудьте про всё ту же кодировку.

чтобы он считал сначала количество совпадений, »
Зачем?

Если продолжить, то в конце операции писал бы количество замен. »
Зачем?

ul9
19-07-2013, 22:44
Цитата Iska:
если не умеете работать с командной строкой »
Я с программированием очень плохо знакома. Всё исключительно на помощи коллег и форумчан держится. :)
Цитата Iska:
Это не хорошо. Вы создали конфигурационный файл, сохранили и перетянули его на скрипт. »
Значит можно вызвать этот конфигурационный файл через батник, отредактировать его и потом без перетаскиваний запустить через call его.
Цитата Iska:
чтобы он считал сначала количество совпадений, »
Зачем? »
Я же писала, что в основном везде одинаковый текст, но где-то может встретиться лишняя запятая или другое окончание в слове. Из-за этого файл не будет обработан. И уйдёт обратно на фтп необработанным. Я заранее знаю, что файлов для обработки ровно 21 html. И если скрипт посчитает и напишет, что было найдено 21 совпадение, то я буду уверена, что и замена пройдёт во всех файлах.
Цитата Iska:
И будьте готовы к тому, что, например, «&», «<» и «>» (и т.п.) — это «&amp;», «&lt;» и «&gt;» »
Нет, это не так. Я работаю с этим скриптом и он обрабатывает все символы. «&», «<» и «>» - эти в том числе и ещё куча других спец.символов. Кодировка Ansi.

Iska
19-07-2013, 23:16
Значит можно вызвать этот конфигурационный файл через батник, отредактировать его и потом без перетаскиваний запустить через call его. »
Не надо «вызывать его через батник». «Ручками» создаёте файл конфигурации и сохраняете. Вы понимаете, зачем вообще они нужны — файлы конфигурации?! Для повторного использования. То есть, Вы создаёте для каждого сервера отдельный файл один раз, затем используете его повторно многократно.

Я заранее знаю, что файлов для обработки ровно 21 html. И если скрипт посчитает и напишет, что было найдено 21 совпадение, то я буду уверена, что и замена пройдёт во всех файлах. »
Ясно.

Нет, это не так.»
Нет, это так: Мнемоники в HTML — Википедия (http://ru.wikipedia.org/wiki/%D0%9C%D0%BD%D0%B5%D0%BC%D0%BE%D0%BD%D0%B8%D0%BA%D0%B8_%D0%B2_HTML), полный текущий рекомендованный список ищите на W3C.

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

ul9
19-07-2013, 23:30
Не надо «вызывать его через батник». «Ручками» создаёте файл конфигурации и сохраняете. Вы понимаете, зачем вообще они нужны — файлы конфигурации?! Для повторного использования. То есть, Вы создаёте для каждого сервера отдельный файл один раз, затем используете его повторно многократно. »
Дело в том, что многократное использование мне не нужно. Необходимо разово пробежаться по всем фтп и внести корректировки в файлы.
Давайте сделаем так: Вы упакуйте пару-тройку html-файлов в архив, присовокупите к ним файл с фразами для поиска и файл с фразами для замены соответственно. Затем отошлите полученный архив (или ссылку на него) мне в личку. Я посмотрю и обещаю подумать. »
Отлично, минут через 20 скину в лс.

Iska
19-07-2013, 23:38
Дело в том, что многократное использование мне не нужно. Необходимо разово пробежаться по всем фтп и внести корректировки в файлы. »
А когда это потребуется сделать (тоже разово) — в очередной раз?

Файлы на разных серверах одни и те же? Пути к ним (за исключением имён серверов) одинаковые? Пары поиска/замены для одинаковых html-файлов на разных серверах одни и те же?

ul9
19-07-2013, 23:46
А когда это потребуется сделать (тоже разово) — в очередной раз? »
Никогда. Но фтп очень много, порядка 200.
Файлы на разных серверах одни и те же? »
Имена у файлов одни и те же, содержание разное, но искомые строчки одни и те же.
Пути к ним (за исключением имён серверов) одинаковые? »
Одинаковые.
Пары поиска/замены для одинаковых html-файлов на разных серверах одни и те же? »
Нужно сделать одни и те же замены в определённых файлах на всех фтп.

Iska
19-07-2013, 23:57
Никогда. »
Зуб даёте ;)?

С остальным пока, в принципе, ясно. То есть, у нас, фактически, перечень серверов (имя сервера+/-порта, логин+пароль), перечень относительных путей файлов (единый для всех серверов) и набор пар фраз для каждого относительного пути файла, так?

ul9
20-07-2013, 00:06
Цитата Iska:
Зуб даёте ? » Нет :) Но если нужно будет, я опять пройдусь руками внося в конфиг данные для подключения.
Цитата Iska:
у нас, фактически, перечень серверов (имя сервера+/-порта, логин+пароль), перечень относительных путей файлов (единый для всех серверов) »
Да.
Цитата Iska:
и набор пар фраз для каждого относительного пути файла, так? » Нет. Это мы скачиваем по списку, а обрабатываем (заменяем текст) уже все скаченные файлы в папке и подпапке, а не по списку.

ul9
20-07-2013, 00:25
Отправила ЛС.

Iska
20-07-2013, 02:18
Получил. Думаю.

ul9
21-07-2013, 14:50
Получил. Думаю. »
Как продвигаются мыслительные процессы? :)

ul9
24-07-2013, 15:32
Ребята, неужели никто не может помочь?
Очень нужна ваша помощь.

sunnykey
24-07-2013, 16:16
Ребята, неужели никто не может помочь?
Очень нужна ваша помощь. »
Ждите выходных, когда у большинства будет свободное время;)
Скинь мне копию архива в личку




© OSzone.net 2001-2012