Так и не разобрался как перебрать файлы 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/.