AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 24.09.2012, 16:38   #1  
Ksizorg is offline
Ksizorg
Участник
 
12 / 10 (1) +
Регистрация: 22.08.2012
передача файла на FTP
Здравствуй, необходимо передать файл на ftp клиента,
Использую класс winInet

winInet = new WinInet();
code1 = winInet.internetConnect("192,192,192,192", "login", "Password");
if (!code1)
code2 = winInet.ftpPutFile(code1,filefolder,_fileName);
Файл передает но в корень, а мне необходимо сохранять по \\192,192,192,192\catalog1\catalog2
Как указать путь куда необходимо сохранять?
Старый 24.09.2012, 17:16   #2  
Sada is offline
Sada
Программатор
Аватар для Sada
 
1,450 / 153 (8) ++++++
Регистрация: 29.03.2005
Адрес: Толи Барнаул, толи Москва
http://erpkb.com/Axapta/KakPoslat'FajjlPoFtp
За это сообщение автора поблагодарили: Ksizorg (1).
Старый 25.09.2012, 17:01   #3  
Ksizorg is offline
Ksizorg
Участник
 
12 / 10 (1) +
Регистрация: 22.08.2012
Цитата:
Сообщение от Sada Посмотреть сообщение
Axapta 3.0
Не получилось( Правда ссылка помогла директорию указать на ftp
X++:
static void Job227(Args _args)
{
int code1,code2;
filename  _fileName;
FileFolder_RU   filefolder;
 WinInet             winInet;
 boolean ret;
;
_filename = "P00090019_171707.flg";
filefolder ="\\\\192.0.0.1\\all-data\\krokus"+'\\'+_fileName;

winInet = new WinInet();
    code1 = winInet.internetConnect("192.192.192.192", "login", "pass");
    ret = wininet.ftpSetCurrentDirectory(code1,"in\\orders");
    if (code1)
      code2 = winInet.ftpPutFile(code1,filefolder,_fileName);

}
Старый 25.09.2012, 17:29   #4  
Sada is offline
Sada
Программатор
Аватар для Sada
 
1,450 / 153 (8) ++++++
Регистрация: 29.03.2005
Адрес: Толи Барнаул, толи Москва
ругается как то?
может тут много слэшей?
filefolder ="\\\\192.0.0.1\\all-data\\krokus"+'\\'+_fileName;
Старый 26.09.2012, 08:54   #5  
Ksizorg is offline
Ksizorg
Участник
 
12 / 10 (1) +
Регистрация: 22.08.2012
Нет не ругается просто переменной code2 присваивает 0 и файл не передает, по поводу слешей то я по разному пробовал и с локального диска и с сетевого, и слешы менял и количество тоже менял (вообще аксапта как то странно со слешами работает, если эту переменную посмотреть в дебагере, то количество слешей как и должно быть), не помогло, получилось отправить только с сервера и только с локального диска с моей машины нет, хотя по filezila нормально передаю
Старый 27.09.2012, 14:57   #6  
handy-comp is offline
handy-comp
Участник
 
96 / 78 (3) ++++
Регистрация: 27.09.2012
На сервере работает, а с другой машины нет?
Proxy используется?
Старый 11.12.2013, 13:22   #7  
DreamCreator is offline
DreamCreator
Moderator
Аватар для DreamCreator
Axapta Retail User
 
553 / 45 (3) +++
Регистрация: 04.11.2004
Адрес: Казань
Добрый день!
Не подскажите, как можно перебрать файлы на ftp? Axapta 3.0 SP3

X++:
static void testConnect2FTP(Args _args)
{
    str             ftp='our-ftp.local';
    str             username='admin';
    str             pass='123';

    WinInetClient   winInet = new WinInetClient();
    int             code1;
    int             code2;

    Filename        fileNamePng;
    int             handlePng = 0;

    FileFolder_RU   fileFolder = @"ftp://our-ftp.local/Pictures/images/catalog/products/angle/";
    ;

    code1 = winInet.internetConnect(ftp, username, pass);

    if (!code1)
        throw error("Не удалось подключиться к ftp-серверу!");

    code2 = winInet.ftpSetCurrentDirectory(code1, "/Pictures/images/catalog/products/angle/");

    // А дальше как?

    // Попытка перебрать файлы, как в обычной папке - handlePng всегда -1, т.е. findFirstFile файлов не видит, хотя в проводнике по этому пути они отображаются
    [handlePng, fileNamePng] = WinApi::findFirstFile(fileFolder + "*.*");

    if (handlePng != -1)
    {
        while (fileNamePng)
        {
            info(fileNamePng);
            fileNamePng = WinApi::findNextFile(handlePng);
        }
    }

    WinApi::findClose(handlePng);
}

Последний раз редактировалось DreamCreator; 11.12.2013 в 13:24.
Старый 11.12.2013, 13:47   #8  
Lucky13 is offline
Lucky13
Участник
1C
 
714 / 198 (8) ++++++
Регистрация: 21.10.2004
По-моему, надо копать в сторону FtpFindFirstFile/InternetFindNextFile
За это сообщение автора поблагодарили: DreamCreator (3).
Старый 13.12.2013, 17:41   #9  
DreamCreator is offline
DreamCreator
Moderator
Аватар для DreamCreator
Axapta Retail User
 
553 / 45 (3) +++
Регистрация: 04.11.2004
Адрес: Казань
Так и не разобрался как перебрать файлы c ftp из Аксапты, напишу все что нашел - может кому-нибудь пригодится.

Из приведенной ссылки понял что надо реализовать 2 метода FtpFindFirstFile и FtpFindNextFile, нашел пример на С++:

X++:
if(hConnect){
            cout<<"begin transfer……"<<endl;
            find=::FtpFindFirstFile(hConnect,ftpDir,&data,INTERNET_FLAG_RELOAD,0);
            cout<<"begin?-->"<<data.cFileName<<endl;
            while(::InternetFindNextFile(find,&data)){
                CString tempFtp=ftpDir;
                CString tempLocal=localDir;
                cout<<"file:"<<data.cFileName<<endl;
Сразу встал вопрос как передавать &data, в С++ он объявляется как:
X++:
WIN32_FIND_DATA FileData;
Как я понимаю это ссылка на структуру, или на класс. Т.е. структура или класс передается по значению. Далее стал смотреть какие типы можно передать из Аксапты и как с ними работать. Вот пример чтения файла с ftp, используется тип Pointer (хоть это указатель, а не ссылка - но ближе типа к ссылке я не нашел)

X++:
    _internetReadFile = new DLLFunction(_winInet,"InternetReadFile");
    _internetReadFile.returns(ExtTypes::DWORD);
    _internetReadFile.arg(ExtTypes::DWORD);
    _internetReadFile.arg(ExtTypes::POINTER);
    _internetReadFile.arg(ExtTypes::DWORD);
    _internetReadFile.arg(ExtTypes::Pointer);
И сам метод чтения файла:
X++:
str internetReadFile(int hdl)
{
    Binary _buffer = new Binary(2048);
    Binary _bytesRead = new Binary(4);
    str result;
    boolean ret;
    int done = 0;

    while (! done)
    {
        ret = _internetReadFile.call(hdl,_buffer,2000,_bytesRead);
        if ((! _bytesRead.dWord(0)) || (! ret))
            done = 1;
        else
        {
            result += subStr(_buffer.string(0),1,_bytesRead.dWord(0));
        }
    }
    return ret ? result : "";
}
В методе используется тип Binary - похоже здесь побайтно читается файл. Алгоритм нетривиальный для меня.

Затем стал искать примеры на С# - нашел замечательный код. Просто вставил его в консольный проект и сразу получил список директорий с ftp://mirror.yandex.ru/.
Старый 13.12.2013, 18:22   #10  
michel1971 is offline
michel1971
Участник
 
77 / 78 (3) ++++
Регистрация: 14.01.2011
вот тут FTP FtpFindFirstFileA реализация?
посмотрите описание необходимых функций FtpFindFirstFile/InternetFindNextFile
За это сообщение автора поблагодарили: DreamCreator (3).
Старый 14.12.2013, 11:12   #11  
handy-comp is offline
handy-comp
Участник
 
96 / 78 (3) ++++
Регистрация: 27.09.2012
Была аналогичная задача по FTP, плюс необходимо было чтобы работало все через proxy (а это задача, штатными средствами, практически невыполнимая с FTP), решил библиотекой: http://winscp.net/eng/docs/library Несколько лет эксплуатации - полёт нормальный. В дополнение получаете SFTP и SCP.
За это сообщение автора поблагодарили: DreamCreator (3), AvrDen (1).
Старый 14.12.2013, 23:48   #12  
DreamCreator is offline
DreamCreator
Moderator
Аватар для DreamCreator
Axapta Retail User
 
553 / 45 (3) +++
Регистрация: 04.11.2004
Адрес: Казань
Большое Спасибо! Вот полученный код перебора файлов на ftp:
X++:
    str             ftp='our-ftp.local';
    str             username='admin';
    str             pass='123';
    Path            path = "/Pictures/images/catalog/products/angle/";

    WinInet         winInet = new WinInet();
    int             handler;

    boolean         res;
    FileName        fileName;
    Container       con;
    int             i;
    ;

    handler = winInet.internetConnect(ftp, username, pass);

    if (!handler)
        throw error("Не удалось подключиться к ftp-серверу!");

    res = winInet.ftpSetCurrentDirectory(handler, path);

    if(!res)
        throw error("Не удалось установить нужную директорию");

    [handler, fileName] = winInet.ftpFindFirstFile(handler, "*.png");

    print fileName;

    while(fileName)
    {
        i++;
        con = winInet.ftpFindNextFile(handler);
        fileName = conpeek(con, 2);
        if(fileName)
        {
            print strFmt("%1 %2", i, fileName);
        }
    }
может кому пригодится.
Старый 26.04.2019, 18:28   #13  
AvrDen is offline
AvrDen
Участник
 
134 / 26 (1) +++
Регистрация: 04.08.2005
Адрес: Усть-Каменогорск
Подскажите, а у Вас не осталось кода, с помощью которого можно было бы копировать файлы на SFTP сервер с помощью АХ?
Старый 26.04.2019, 19:32   #14  
demianimp is offline
demianimp
Участник
 
202 / 104 (4) +++++
Регистрация: 10.10.2013
Мы используем библиотеку WinSCP
__________________
Любую техническую проблему можно решить, если есть достаточно времени и денег.
Старый 26.04.2019, 20:14   #15  
ax_mct is offline
ax_mct
Banned
 
2,548 / 1091 (0) ++++++++
Регистрация: 10.10.2005
Адрес: Westlands
https://github.com/sshnet/SSH.NET/releases
Старый 29.04.2019, 20:03   #16  
AvrDen is offline
AvrDen
Участник
 
134 / 26 (1) +++
Регистрация: 04.08.2005
Адрес: Усть-Каменогорск
Цитата:
Сообщение от demianimp Посмотреть сообщение
Мы используем библиотеку WinSCP
Подскажите, а Вы на какой версии АХ используйте данную библиотеку? При попытке добавить Reference на АХ 4, возникает ошибка, что DLL имеет неверный тип. В тоже время на АХ2012 все работает отлично. Может быть кто-нибудь знает как обойти данное ограничение?
Старый 30.04.2019, 12:52   #17  
demianimp is offline
demianimp
Участник
 
202 / 104 (4) +++++
Регистрация: 10.10.2013
Цитата:
Сообщение от AvrDen Посмотреть сообщение
Подскажите, а Вы на какой версии АХ используйте данную библиотеку? При попытке добавить Reference на АХ 4, возникает ошибка, что DLL имеет неверный тип. В тоже время на АХ2012 все работает отлично. Может быть кто-нибудь знает как обойти данное ограничение?
Можно попробовать решение от Raven Melancholic.
__________________
Любую техническую проблему можно решить, если есть достаточно времени и денег.
Старый 01.05.2019, 20:46   #18  
skycap is offline
skycap
Участник
 
43 / 14 (1) ++
Регистрация: 04.09.2008
Адрес: Москва
System.Net.WebClient
System.Net.NetworkCredential
Теги
ftp

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
работа по FTP mit DAX: Программирование 9 19.09.2014 10:05
Ax2009 Название файла при создании dbf Arahnid DAX: Программирование 2 23.08.2012 23:12
Сохранение файла на FTP yahenz DAX: Программирование 1 27.12.2011 09:45
FTP в AX4 sukhanchik DAX: Программирование 14 07.10.2009 12:52
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 20:15.