Имя: Пароль:
1C
1С v8
Как на Sftp перебрать список файлов ? при помощи утилиты WinSCP
,
0 Nik_Zzz
 
31.03.20
13:34
Подскажите пожалуйста. Как на Sftp перебрать список файлов ? при помощи утилиты WinSCP
1 Ёпрст
 
31.03.20
13:51
(0) там проще каталоги синхронизировать же шь
2 Nik_Zzz
 
31.03.20
13:53
(1) я просто забираю из каталога , копирую в каталог на комп и удаляю их с sftp , делаю *.xml , но делается пачками , вот и хочу перебирать файлики по одному
3 Ёпрст
 
31.03.20
14:37
(2) и ? выполняешь скрипт, который всё из каталога на фтп переместит в твой каталог на компе.. и усё. Даже файло на фтп перебирать не надо
4 Nik_Zzz
 
31.03.20
14:41
(3) Проблема в том что некоторые файлы куда то теряются , вот и хочу этот момент методом перебора отладить
5 Ёпрст
 
31.03.20
14:44
(4) давно это было, по памяти только помню, что там один метод synchronize и параметры:
local — файлы скачиваются с сервера в локальную папку, remote — изменения в локальной папке будут залиты на сервер, both — двухсторонняя синхронизация.
Это что касается каталогов.
А про всё остальное, надо доку к WinSCP почитать.
Давно этим г. не пользуюсь, проще всё через вэбсервис слепить
6 Nik_Zzz
 
31.03.20
14:48
(5) Полностью согласен, но сторонний поставщик инфы, не хочет  предоставлять веб-сервис, приходится довольствоваться  тем что есть .
7 Nik_Zzz
 
31.03.20
14:51
synchronize  , знаю эту тему , но там идет полная синхронизация всех файлов , это не годится , так как я после копирования их удаляю и считаю их обработанными .
А методом synchronize она будет опять их создавать.
8 arsik
 
гуру
31.03.20
14:56
(7) Смотрите мануал. Все методы ком объекта описаны. https://winscp.net/eng/docs/library
9 Nik_Zzz
 
31.03.20
15:45
Пытаюсь читать, создает пустой файлик  , почему ? хотя файлики на sftp имеются.

СтрокаПрограммы = "cmd.exe /c """"" + ПутьWinSCP + """ /console /command " + """option batch abort"" " + """open " + ПрофильWinSCP + """ " + """ls " + КаталогНаSFTPСервере + """""" + """ " + """ close""" + " > FMfiles.txt 2>&1" + """ " + """ exit""";
10 ptiz
 
31.03.20
16:00
Дарю свой костыль:

Функция ПолучитьМассивФайловWinSCP(ИмяFTPСервера, ИмяКаталогаСервера, Маска = "*.*", Позиция = 65)

    МассивФайлов = Новый Массив;
    
    ИмяВремФайлаРезультата = КаталогВременныхФайлов() + "winscpls" + Формат(НомерСоединенияИнформационнойБазы(), "ЧГ=") + ".txt";
    Файл = Новый Файл(ИмяВремФайлаРезультата);
    Если Файл.Существует() Тогда
        УдалитьФайлы(ИмяВремФайлаРезультата);
    КонецЕсли;
    
    ИмяВремФайлаКоманды = КаталогВременныхФайлов() + "winscp" + Формат(НомерСоединенияИнформационнойБазы(), "ЧГ=") + ".cmd";
    ДобавитьНомерКФайлуКоманды = Ложь;
    Файл = Новый Файл(ИмяВремФайлаКоманды);
    Если Файл.Существует() Тогда
        Попытка
            УдалитьФайлы(ИмяВремФайлаКоманды);
        Исключение
            ДобавитьНомерКФайлуКоманды = Истина;
        КонецПопытки;
    КонецЕсли;
    
    Если ДобавитьНомерКФайлуКоманды Тогда
        Для сч = 1 По 999 Цикл
            ИмяВремФайлаКоманды = КаталогВременныхФайлов() + "winscp" + Формат(НомерСоединенияИнформационнойБазы(), "ЧГ=") + "_" + СокрЛП(сч) + ".cmd";
            сч = сч + 1;
            Файл = Новый Файл(ИмяВремФайлаКоманды);
            Если НЕ Файл.Существует() Тогда
                Прервать;
            КонецЕсли;
        КонецЦикла;
    КонецЕсли;
    
    Парам = ПреобразоватьВКомандуWinSCP(
                "option batch abort
                |open " + ИмяFTPСервера + "
                |cd " + ИмяКаталогаСервера + "
                |ls
                |exit");

    // cmd
    Стр = ПутьКWinSCP + " /command " + Парам;
    Текст = Новый ТекстовыйДокумент;
    Текст.ДобавитьСтроку(Стр);
    Текст.Записать(ИмяВремФайлаКоманды, КодировкаТекста.OEM);
    
    WshShell = Новый COMОбъект("WScript.Shell");
    Результат = WshShell.Run("""" + ИмяВремФайлаКоманды + """ > """ + ИмяВремФайлаРезультата + """", 0, 1);    // без "черного окна ДОС", ждем окончания
    Попытка
        УдалитьФайлы(ИмяВремФайлаКоманды);
    Исключение
    КонецПопытки;
    Файл = Новый Файл(ИмяВремФайлаРезультата);
    Если Результат <> 0 Тогда
        Попытка
            Если Файл.Существует() Тогда
                УдалитьФайлы(ИмяВремФайлаРезультата);
            КонецЕсли;
        Исключение
        КонецПопытки;
        Возврат МассивФайлов;
    КонецЕсли;
    
    // Читаем ответ
    Если НЕ Файл.Существует() Тогда
        Возврат МассивФайлов;
    КонецЕсли;
    
    Текст = Новый ТекстовыйДокумент;
    Текст.Прочитать(ИмяВремФайлаРезультата, КодировкаТекста.UTF8);
    ВсегоСтрок = Текст.КоличествоСтрок();
    НачалсяСписокФайлов = Ложь;
    Для счСтрок = 1 По ВсегоСтрок Цикл
        
        Стр = Текст.ПолучитьСтроку(счСтрок);
        
        Если Сред(Стр, 55, 4) = "  .." Тогда
            НачалсяСписокФайлов = Истина;
        КонецЕсли;
        
        Если НЕ НачалсяСписокФайлов Тогда
            Продолжить;
        КонецЕсли;
        
        Если СтрДлина(Стр) < Позиция Тогда
            Продолжить;
        ИначеЕсли Лев(Стр, 1) = "D" Тогда
            Продолжить;
        КонецЕсли;
        
        ИмяФайла = Сред(Стр, Позиция);
        
        Если НЕ ПроверкаСтрокиПоМаске(ИмяФайла, Маска) Тогда
            Продолжить;
        КонецЕсли;
        
        МассивФайлов.Добавить(ИмяФайла);
    
    КонецЦикла;
    
    
    Попытка
        УдалитьФайлы(ИмяВремФайлаРезультата);
    Исключение
    КонецПопытки;
    
    Возврат МассивФайлов;

КонецФункции // ПолучитьМассивФайловWinSCP()

// преобразуем многострочный текст в одну строку (каждая строка идет через пробел в кавычках)
// текст вида:
//    open "1.txt"
//    exit
// преобразуем в :
//    "open ""1.txt""" "exit"
Функция ПреобразоватьВКомандуWinSCP(ИсхСтр)

    Стр = "";
    ВсегоСтрок = СтрЧислоСтрок(ИсхСтр);
    Для сч = 1 По ВсегоСтрок Цикл
    
        ТекСтр = СтрПолучитьСтроку(ИсхСтр, сч);
        ТекСтр = СтрЗаменить(ТекСтр, """", """""");
        Стр = Стр + ?(Стр = "", "", " ") + """" + ТекСтр + """";
    
    КонецЦикла;
    
    Возврат Стр;

КонецФункции // ПреобразоватьВКомандуWinSCP()

Функция ПроверкаСтрокиПоМаске(Знач ИсходнаяСтрока, Знач ШаблонСтроки, Парам = Истина) Экспорт
    
    ИсходнаяСтрока = ВРЕГ(ИсходнаяСтрока);
    ШаблонСтроки = ВРЕГ(ШаблонСтроки);
    
    Симв127=Символ(127);
    //Защита ковычек, запятых, и доллара
    ИсходнаяСтрока=стрЗаменить(ИсходнаяСтрока,"""",Симв127);
    ИсходнаяСтрока=стрЗаменить(ИсходнаяСтрока,",",Симв127);
    ИсходнаяСтрока=стрЗаменить(ИсходнаяСтрока,"$",Симв127);
    ШаблонСтроки=стрЗаменить(ШаблонСтроки,"""",Симв127);
    ШаблонСтроки=стрЗаменить(ШаблонСтроки,",",Симв127);
    ШаблонСтроки=стрЗаменить(ШаблонСтроки,"$",Симв127);
    Если Парам Тогда//добавляем стоп-символы
        ШаблонСтроки="$"+ШаблонСтроки+"$";
        ИсходнаяСтрока="$"+ИсходнаяСтрока+"$";
    КонецЕсли;
    //Ш=""""+ШаблонСтроки+"""";
    //ш=стрЗаменить(ш,"*",""",""");
    //ш=стрЗаменить(ш,"?",""",""?"",""");
    ш=ШаблонСтроки;
    ш=стрЗаменить(ш,"*",",");
    ш=стрЗаменить(ш,"?",",?,");
    
    МассивСлов = ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок(ш, ",");
    
    Для Каждого Слово из МассивСлов Цикл
        Если НЕ ЗначениеЗаполнено(Слово) Тогда
            Продолжить;
        КонецЕсли;
        ДлинаСтроки=СтрДлина(ИсходнаяСтрока);
        ДлинаСлова=СтрДлина(Слово);
        Если (ДлинаСтроки>0) Тогда
            Если Слово="?" Тогда
                ИсходнаяСтрока=Сред(ИсходнаяСтрока,2);
            Иначе
                Поз=Найти(ИсходнаяСтрока,Слово);
                Если Поз>0 Тогда
                    ИсходнаяСтрока=Сред(ИсходнаяСтрока,Поз+ДлинаСлова);
                Иначе
                    Возврат Ложь;
                КонецЕсли;
            КонецЕсли;
        Иначе
            Возврат Ложь;
        КонецЕсли;
    КонецЦикла;
    
    Возврат Истина;
    
КонецФункции
11 Nik_Zzz
 
02.04.20
12:16
(10) Благодарю за костыль :)
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший