C++ FTP upload aus directory

Crashdowns

Ensign
Dabei seit
Juni 2010
Beiträge
138
Hallo zusammen,
ich habe ein kleines Programm gebastelt das ein einzelnes File auf einen FTP-Server schicken soll.
Wenn das File in C:\ liegt und das Programm auch läuft alles ohne Probleme. Sobald aber ein File aus C:\...\...\... geuploadet werden soll passiert nichts.
Hat jmd eine Idee wo das Problem liegen könnte?

Hier der Code:

PHP:
void uploadFTP(){
	long rc;
	SOCKET s;
	SOCKADDR_IN addr;

	rc = startWinsock();
		if (rc!=0){
			printf("error startWinsock fehlgeschlagen\n", rc);
			return;
		}
		else {
			printf("Winsock gestartet!\n");	
		}
	s = socket (AF_INET, SOCK_STREAM, 0);

	memset(&addr, 0, sizeof(SOCKADDR_IN));
	addr.sin_family = AF_INET;
	addr.sin_port = htons(21); 
	addr.sin_addr.s_addr = inet_addr("hier kommt die IP rein"); 
	
        rc = connect(s, (SOCKADDR*)&addr, sizeof(SOCKADDR));
		if (rc == SOCKET_ERROR){
			printf ("error , connect fehlgeschlagen\n");
			return;
		}
		else{
			printf("connected\n");
		}

	HINTERNET hOpen, hFTP;
	hOpen = InternetOpen(0, INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, INTERNET_FLAG_ASYNC);
	hFTP = InternetConnect(hOpen, "ftp site", INTERNET_DEFAULT_FTP_PORT, "username", "password", INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, 0);

	bool uploadSuc = FtpPutFile(hFTP, "C:\\...\\..\\test.sqlite", "test.sqlite", FTP_TRANSFER_TYPE_BINARY,0);
		if(uploadSuc == false){
			printf("upload error\n");
		}
		else{
			printf("upload done");
		}

	InternetCloseHandle(hFTP);
	InternetCloseHandle(hOpen);
}
Ich habe auch schon überlegt ob ich vorher mit SetDirectory arbeiten muss, aber in meinem kurzen Tests diesbezüglich hatte ich keinen Erfolg :(
 
Zuletzt bearbeitet:
4

4cc

Gast
Code:
"C:\\...\\..\\"
Das hier wäre dann "C:\..." und unter Windows sind Punkte kein zulässiger Ordnername - bist du dir sicher das du weisst was du da tust ?
 

Crashdowns

Ensign
Ersteller dieses Themas
Dabei seit
Juni 2010
Beiträge
138
Das hier wäre dann "C:\..." und unter Windows sind Punkte kein zulässiger Ordnername - bist du dir sicher das du weisst was du da tust ?
Das war als Beispiel gedacht! :D
Natürlich steht dort im richtigen Source Code ein vorhandener und konkreter Pfad. Ich dachte das kommt aus dem Kontext. ;)
Ergänzung ()

ok, ich konnte das problem gerade eingrenzen. es funktioniert mit Files wie *.txt, *.log, etc. Allerdings nicht mit z.Bsp *.sqlite. Hat jmd eine Idee?
 

antred

Lt. Commander
Dabei seit
Juni 2010
Beiträge
1.288
Zeig uns deinen echten Code und nicht ein zusammengeschustertes Beispiel. Ansonsten können wir nur rätselraten. ;)

P.S. Die Aussage "passiert nichts" ist auch ein bißchen vage gehalten. Schon mal mit einem Debugger reingeschnuppert? Da müßtest du doch genau sehen, warum welche Codezweige durchlaufen werden.

P.S. #2: Laut MSDN-Doku ( http://msdn.microsoft.com/en-us/library/windows/desktop/aa384170(v=vs.85).aspx ) kannst du, wenn FtpPutFile() false zurückliefert, mit GetLastError() rausfinden, was genau der FtpPutFile()-Funktion nicht geschmeckt hat.
 
Zuletzt bearbeitet:

Crashdowns

Ensign
Ersteller dieses Themas
Dabei seit
Juni 2010
Beiträge
138
Das ist der echte Code, es wurde nur die IP der Website, Username, Password und Pfad entfernt.

Mit passiert nichts ist gemeint das die FtpPutFile false ausgibt. Der Upload wurde also nicht vollzogen. Jedoch nur für die bereits erwähnte sqlite Datei. Txt und log funktionieren.
 
Zuletzt bearbeitet:

antred

Lt. Commander
Dabei seit
Juni 2010
Beiträge
1.288
Ah ja, dann schnapp dir halt entweder einen Debugger oder versuche wenigstens, mit GetLastError() den Grund des Scheiterns zu ermitteln.
 

Crashdowns

Ensign
Ersteller dieses Themas
Dabei seit
Juni 2010
Beiträge
138
Habe den Code jetzt um GetLastError() erweitert -> "Überlappender E/A Vorgang wird verarbeitet". :freak:

PHP:
    void uploadFTP(){
    long rc;
    SOCKET s;
    SOCKADDR_IN addr;
     
    rc = startWinsock();
    if (rc!=0){
    printf("error startWinsock fehlgeschlagen\n", rc);
    return;
    }
    else {
    printf("Winsock gestartet!\n");
    }
    s = socket (AF_INET, SOCK_STREAM, 0);
     
    memset(&addr, 0, sizeof(SOCKADDR_IN));
    addr.sin_family = AF_INET;
    addr.sin_port = htons(21);
    addr.sin_addr.s_addr = inet_addr("hier kommt die IP rein");
    rc = connect(s, (SOCKADDR*)&addr, sizeof(SOCKADDR));
    if (rc == SOCKET_ERROR){
    printf ("error , connect fehlgeschlagen\n");
    return;
    }
    else{
    printf("connected\n");
    }
     
    HINTERNET hOpen, hFTP;
    hOpen = InternetOpen(0, INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, INTERNET_FLAG_ASYNC);
    hFTP = InternetConnect(hOpen, "ftp site", INTERNET_DEFAULT_FTP_PORT, "username", "password", INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, 0);
     
    bool uploadSuc = FtpPutFile(hFTP, "C:\\...\\..\\test.sqlite", "test.sqlite", FTP_TRANSFER_TYPE_BINARY,0);
    		if(uploadSuc){
			printf("upload done");
		}
		else{
			printf("upload error");
		

		DWORD err = ::GetLastError();
	
		LPVOID lpMsgBuf;

		FormatMessage(
			FORMAT_MESSAGE_ALLOCATE_BUFFER |
			FORMAT_MESSAGE_FROM_SYSTEM |
			FORMAT_MESSAGE_IGNORE_INSERTS,
			NULL,
			GetLastError(),
			MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
			(LPTSTR) &lpMsgBuf,0,NULL);

		MessageBox( NULL, (LPCTSTR)lpMsgBuf, "Error", MB_OK | MB_ICONINFORMATION );

			// Free the buffer.
		LocalFree( lpMsgBuf );
		}
    InternetCloseHandle(hFTP);
    InternetCloseHandle(hOpen);
    }
Ergänzung ()

EDIT: AHHH fehler gefunden. Die zu uploadende Datei wurde von einem anderen Programm genutzt. -> God damit!

Danke für die Hilfe. Wieder was neues gelernt^^
 
Top