Показать сообщение отдельно
Старый 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/.