Сборка WinSCP .NET: FileMask в синхронизации каталогов не работает

Вот что я хочу сделать в первую очередь с точки зрения непрофессионала: я хочу получить файлы (а может быть, только некоторые файлы). Если есть подкаталоги, я хочу также получить файлы в этих подкаталогах. Я использую Visual C ++ / CLI для программирования, поэтому использую сборку .net.

В WinSCP это использовать Session.SynchronizeDirectories(). Последний параметр - это TransferOptions (класс), и он обычно имеет значение null. В основном это означает, что все файлы будут перенесены. Если я создам объект и установлю свойство string FileMask, я смогу передавать только определенные файлы.

Поэтому я меняю пример программы WinSCP C # на:

using (Session session = new Session())
{
    // Will continuously report progress of synchronization
    session.FileTransferred += FileTransferred;

    // Connect
    session.Open(sessionOptions);

    // Create a TransferOptions object
    TransferOptions tro = new TransferOptions();
    tro.FileMask = "*.txt";
    tro.TransferMode = TransferMode.Automatic;

    // Synchronize files
    SynchronizationResult synchronizationResult;
    synchronizationResult =
        session.SynchronizeDirectories(
             SynchronizationMode.Local, @"C:\temp\win", "/C/Users/peter/Documents/WinSCP5.5.1/",
             false, false, SynchronizationCriteria.Time, tro);

    // Throw on any error
    synchronizationResult.Check();
}

Когда я запускаю программу, все в текущем каталоге и подкаталогах переносится!

Думаю, что могу ошибаться, указывая эти параметры. Пользуюсь программой WinSCP. (См. Изображение на странице диалогового окна настроек передачи веб-сайта WinSCP.)

Все параметры ясны, за исключением того, что я ввожу следующее для маски файла: *.txt

Я нажимаю кнопку ОК, чтобы начать передачу. У меня включен предварительный просмотр. И я вижу только выбранные текстовые файлы, даже тот, который находится в подкаталогах.

Так программа WinSCP работает, а API - нет?

[Edit] Я использую версию 5.5.2 сборки WinSCP.


person user3454439    schedule 15.04.2014    source источник
comment
Пожалуйста, покажите свой код   -  person Martin Prikryl    schedule 15.04.2014
comment
Ваш код выглядит хорошо. Установите Session.SessionLogPath и поделитесь журналом. Например, используя pastebin.com.   -  person Martin Prikryl    schedule 16.04.2014
comment
Вот журнал, он находится в pastebin.com/xR27KwBH   -  person user3454439    schedule 16.04.2014
comment
Журнал не соответствует вашему коду. Журнал использует двоичный режим передачи, а ваш код устанавливает автоматический. Журнал показывает, что ненужные файлы удаляются, а вы передаете параметр false в delete в коде. Есть и разные пути. Вам трудно помочь, если вы не поделитесь соответствующим журналом и кодом.   -  person Martin Prikryl    schedule 16.04.2014
comment
Я смотрю в журнал и мне кажется, что сборка в ответ вызывает скрипт. Во всяком случае, из журнала вообще никакой фильтрации нет! И чтобы ответить на ваш вопрос, из соображений безопасности я изменил путь перед публикацией. Я изменю исходные сообщения.   -  person user3454439    schedule 16.04.2014
comment
pastebin.com/g7e6BvtT Я снова запускаю программу. Даже если я выберу автоматический режим передачи, он все равно будет передаваться как двоичный. Два ложных внутри SynchronizeDirectories: без удаления и без зеркала.   -  person user3454439    schedule 16.04.2014
comment
Даже если я использую режим ASCII, в журнале сеанса все равно указано Binary! А если маска *. * ›100K, передаются все файлы. Опять же, я использую версию 5.5.2.   -  person user3454439    schedule 16.04.2014
comment
Я пробовал ваш ТОЧНЫЙ код, и он РАБОТАЕТ, как ожидалось. Вызов Session.SynchronizeDirectories правильно переводится в synchronize local -nopermissions -preservetime -transfer="automatic" -filemask="*.txt" -criteria="time" -- "C:\temp\win" "/C/Users/peter/Documents/WinSCP5.5.1/"   -  person Martin Prikryl    schedule 16.04.2014
comment
На самом деле поведение, наблюдаемое в ваших журналах, выглядит так, как будто вы вообще не передаете экземпляр TransferOptions (по умолчанию используется двоичный режим, а также, очевидно, пустая маска файла). Вы уверены, что логи от ТОЧНОГО! код вы включили в вопрос?   -  person Martin Prikryl    schedule 16.04.2014
comment
О мой! Тогда мне придется все проверять еще раз. Включая повторное получение версии 5.5.2 или любой другой последней версии. Хм ... Почему у меня столько проблем.   -  person user3454439    schedule 16.04.2014
comment
Я предлагаю вам загрузить исходный код сборки WinSCP .NET и скомпилировать его самостоятельно, чтобы вы могли отлаживать перевод из Session.SynchronizeDirectories в базовую команду сценария.   -  person Martin Prikryl    schedule 16.04.2014
comment
Я включаю проект исходного кода в свой существующий проект. Скомпилируйте проект исходного кода. В моем существующем проекте я «добавляю ссылку» на скомпилированную DLL. Запустить его. Передаются только файлы TXT! Хороший. Затем я удаляю проект. Используйте обратно EXE (из Winscp552.zip с версией файла как 5.5.2.4130) и DLL (из Winscp5552automation.zip с версией файла как 1.1.5.4130). Почему-то, когда я запускаю программу, до первого оператора требуется 30 секунд! Следует отметить, что скомпилированная DLL имеет версию файла 1.1.5.0!   -  person user3454439    schedule 17.04.2014
comment
Но работает ли после возврата к официальной сборке? (Задержка 30 секунд - другая тема)   -  person Martin Prikryl    schedule 17.04.2014
comment
да. Оно работает. После дальнейшего тестирования для всех трех версий (5.5.1, 5.5.2 и 5.5.3), если я использую EXE и DLL, будет задержка 30 секунд. Скажем, я использую 5.5.3 EXE и компилирую исходный код для DLL, нет 30-секундной задержки. Думаю, я напечатаю как решение.   -  person user3454439    schedule 17.04.2014
comment
Так вы знаете, в чем была проблема?   -  person Martin Prikryl    schedule 17.04.2014
comment
Голосую за закрытие вопроса. Похоже, воспроизвести проблему уже нельзя. Я тоже не могу.   -  person Martin Prikryl    schedule 17.04.2014


Ответы (1)


Наконец-то я заработал перед праздником Пасхи. Поработав какое-то время с @Martin, я решил проблему. (Обратите внимание, я не говорю, что нашел решение.) :(

В любом случае, я загружаю исходный код для версии WinSCP 5.5.2. Мне нужно изменить проект с dot net версии 4 обратно на версию 3.5, поскольку я использую Visual Studio 2008. Я включаю его в свой исходный проект. Скомпилируйте это. OK. У меня есть исходный проект для использования этой выходной DLL. Я удостоверяюсь, что WinSCP EXE тоже версии 5.5.2. Запустить его. Без проблем. Маска файла работает.

Просто побочная история, если вам интересно. После использования исходного кода проекта я его удаляю. Я использую DLL 5.5.2, загруженную с веб-сайта. Внезапно программе требуется около 30 секунд для выполнения первого оператора. Затем я использую версию 5.5.1 EXE и DLL. Та же задержка. Переключитесь на 5.5.3 EXE и DLL. Те же 30 секунд или около того. Удалите DLL и используйте исходный код сборки 5.5.3 .net. Скомпилируйте это. Программа запускается немедленно.

Думаю, с этого момента я буду компилировать свою сборку .net и использовать ее.

Спасибо Мартину за помощь.

person user3454439    schedule 17.04.2014