Wysłanie kilku plików przez FTP

Wysłanie kilku plików przez FTP
0

Wysmażyłem sobie taki kod:

Kopiuj
#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:

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

i

Kopiuj
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:

Kopiuj
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.

kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:3 dni
  • Lokalizacja:Szczecin
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.


_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:3 dni
0
Kopiuj
char buff[MAXPATH]={0},*truepath=strcat(strcat(buff,getenv("APPDATA")),"\\plik.txt");

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
0

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

Przy próbie kompilacji:

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

Dostaję:

Kopiuj
`MAXPATH' undeclared (first use this function) 
`buff' undeclared (first use this function) 
kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:3 dni
  • Lokalizacja:Szczecin
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.

Kopiuj
std::string path = getenv("APPDATA");
path += "\\plik.txt";

_13th_Dragon
std::string path(std::string(getenv(&quot;APPDATA&quot;))+&quot;\\plik.txt&quot;);
kq
Według mnie tak jest brzydziej :P
Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:minuta
0
Kopiuj
	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ę.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.