Wysłanie kilku plików przez FTP

0

Wysmażyłem sobie taki kod:

#include <windows.h>
#include <tlhelp32.h>
#include <tchar.h>
#include <stdio.h>
#include <wininet.h>
#include <ctime> 
#include <iostream> 
#pragma comment(lib, "wininet")

	int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
	{  

            char* appdata = getenv("APPDATA");             
            char* truepath = strcat(appdata, "\\plik.txt");

            HINTERNET hInternet;
            HINTERNET hFtpSession;
            hInternet = InternetOpen(NULL,INTERNET_OPEN_TYPE_DIRECT,NULL,NULL,0);
            hFtpSession = InternetConnect(hInternet, "host", INTERNET_DEFAULT_FTP_PORT, "login", "haslo", INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, 0);

            FtpPutFile(hFtpSession, truepath, "plik", FTP_TRANSFER_TYPE_BINARY, 0);
            
            InternetCloseHandle(hFtpSession);  
            InternetCloseHandle(hInternet);   
            
            return 0; 
	}

I wszystko ładnie działa. Problem pojawia się, kiedy chcę przesłać kolejny plik.

Dodaję linie:

char* truepath2 = strcat(appdata, "\\plik2.txt");

i

FtpPutFile(hFtpSession, truepath2, "plik2", FTP_TRANSFER_TYPE_BINARY, 0);

Wtedy nie wysyła się nic.

Macie może jakieś rady jak to zrobić?

0

Widzę, że problem leży tutaj:

char* appdata = getenv("APPDATA");             
char* truepath = strcat(appdata, "\\plik.txt");

Jestem w stanie wysłać ten sam plik kilka razy z inną nazwą, lub inny plik kiedy nie używa ścieżki appdata.
Kiedy 2 pliki próbują wykorzystać appdata to coś się psuje.

1

Zadanie na dziś: przeczytaj dokumentację strcat: http://en.cppreference.com/w/cpp/string/byte/strcat i getenv: http://en.cppreference.com/w/cpp/utility/program/getenv

Szczególnie ten fragment:

Modifying the string returned by getenv (e.g. after casting away constness) invokes undefined behavior.

  1. Wywołujesz UB modyfikując string zwrócony przez getenv,
  2. nawet jakbyś tego nie robił, modyfikujesz kilka razy ten sam string.

Użyj std::string i + i nie będziesz miał takich głupich kłopotów.

0
char buff[MAXPATH]={0},*truepath=strcat(strcat(buff,getenv("APPDATA")),"\\plik.txt");
0

Trudno jest uzyskać ścieżkę appdata bez używania getenv.

Przy próbie kompilacji:

char buff[MAXPATH]={0},*truepath=strcat(strcat(buff,getenv("APPDATA")),"\\plik.txt");

Dostaję:

`MAXPATH' undeclared (first use this function) 
`buff' undeclared (first use this function) 
1

A kto mówi, że masz nie używać getenv? Masz to robić z głową, nic więcej nic mniej. MAXPATH to stała, którą @_13th_Dragon założył, że sobie ustawisz jako maksymalną wielkość ścieżki. Możesz też użyć std::string i obyć się bez niewygodnych funkcji z C.

std::string path = getenv("APPDATA");
path += "\\plik.txt";
0
	const char* appdata = getenv("APPDATA");
	char truepath[MAX_PATH];

	...

	strcpy(truepath, appdata);
	strcat(truepath, "\\plik.txt");
0

Dziękuję bardzo za wszystkie odpowiedzi :* Już mi wszystko działa.
Wybaczcie mi moją wielką głupotę ale dopiero się uczę.

1 użytkowników online, w tym zalogowanych: 0, gości: 1