Давай я тебе примерчик прям в твоем коде и напишу?
Я сначала попытаюсь объяснить вкратце...
В библиотеке STL есть некие классы, которые могут хранить внутри себя наборы объектов. Такие классы называются контейнерами.
В частности, есть такой контейнер - vector.
Также есть класс, облегчающий работу с символьными строками - string.
Попытаемся решить твою задачу, используя контейнер vector, который будет хранить объекты типа string.
Итак, для начала нужно подключить необходимые заголовочные файлы: <vector> и <string>.
#include <vector>
#include <string>
Теперь необходимо создать экземпляр контейнера vector, который и будет нашим массивом имён директорий:
std::vector<std::string> folders;
или
using namespace std;
vector<string> folders;
Здесь в треугольных скобках мы указываем тип объектов, которые будут храниться в контейнере.
Самому массиву, как видно из кода, мы присвоили имя folders.
При работе с библиотекой STL приветсвуется использование typedef.
Поэтому вместо описанного выше кода можно написать следующее:
typedef std::vector<std::string> CStringVector;
CStringVector folders;
Для добавления нового элемента к концу массива можно использовать метод vector::push_back(...):
folders.push_back("Новый элемент");
char str[] = "Еще один новый элемент";
folders.push_back(str);
std::string str2 = "А вот и еще новый элемент";
folders.push_back(str2);
Для получения текущего количесва элементов массиве существует метод size():
int count = folders.size();
Для получения конкретного элемента с индексом i можно использовать оператор []:
int i = 0;
std::string str3 = folders[i];
std::string str4 = folders[2];
Да, чуть не забыл: для преобразования объекта типа string к типу (const char *) необходимо вызвать метод c_str():
std::string str = "строка";
const char *ptr = str.c_str();
const char *ptr2 = folders[0].c_str();
Теперь попытаемся решить твою задачу.
Я выбрал класс vector из тех соображений, что в нем есть возможность доступа к элементам массива по их индексу - folders[index].
Это не единственный и далеко не лучший способ использования vector<string>. И это далеко не лучший вариант решения этой задачи.Но, имхо, так как ты раньше не сталкивался с STL, то наверное этот код будет тебе более понятен, чем какой-либо другой.
#include <vector>
#include <string>
void ScanFTP(TCHAR *szServerName, const char *szPathSpec)
{
// Создаем массив строк
std::vector<std::string> folders;
HINTERNET hOpen = NULL,hInet=NULL,hFTP=NULL;
WIN32_FIND_DATA FindFileData;
memset ((char *)&FindFileData, 0, sizeof(FindFileData));
char Buffer[MAX_PATH+1]={0};
hInet = InternetOpen(TEXT("FTP Scanner"), INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
if (hInet!=NULL)
{
hFTP = InternetConnect (hInet, szServerName, INTERNET_DEFAULT_FTP_PORT, NULL, NULL, INTERNET_SERVICE_FTP, 0, 0);
if (hFTP!=NULL)
{
hOpen = FtpFindFirstFile(hFTP, szPathSpec, &FindFileData, INTERNET_FLAG_NO_CACHE_WRITE, 0);
if(hOpen!=NULL)
{
do
{
if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
if (strcmp(FindFileData.cFileName, ".") && strcmp(FindFileData.cFileName, ".."))
{
// Формируем полное имя папки
std::string name = szPathSpec;
name += "/";
name += FindFileData.cFileName;
// Добавляем имя найденной папки
// в конец массива:
folders.push_back(name);
}
}
else
{
// имеем имя файла с путём...
}
}
while (InternetFindNextFile(hOpen, &FindFileData));
InternetCloseHandle (hOpen);
}
InternetCloseHandle (hFTP);
}
InternetCloseHandle (hInet);
// Я не знаю, в каком именно месте у тебя должен быть
// этот код, но предположим, что здесь...
// Для каждого элемента вектора folders вызываем ScanFTP.
int i = folders.size();
while (i--)
{
// Передаем в scanFtp строку
// из массива folders с индексом count.
ScanFTP(szServerName, folders[i].c_str());
}
}
}