Zum Inhalt springen

SetCurrentDirectory


wulfgang

Empfohlene Beiträge

Hallo,

ich möchte mit SetCurrentDirectory in einen anderen Ordner gelangen. Erhalte aber durch GetLastError noch den Fehler 12003.

An extended error was returned from the server. This is typically a string or buffer containing a verbose error message. Call InternetGetLastResponseInfo to retrieve the error text.

Bei der Funktion InternetGetLastResponseInfo habe ich noch nicht rausgefunden, wie die genau funktioniert. Kann mir jemand ein Beispiel geben oder sieht jemand so meinen Fehler?

{

if(connection = session.GetFtpConnection(pstrServer, login, passwd, port, bPassive)) 

			{

			cout << "Verbindung wurde aufgebaut\n";     

			//connection_pointer=connection; 

			}


	}

	//Fehleroutine

	catch (CInternetException* pEx)

    {

		cout<<"FEHLER : "<<GetLastError()<<endl;

        TCHAR sz[1024];

        pEx->GetErrorMessage(sz, 1024);

        printf_s("ERROR!  %S\n", sz);

        pEx->Delete();

     }





	if(connection->SetCurrentDirectory(_T("ordner\ordner\ordner")))								

		{

			cout<<"...mit Erfolg!\n";

		}	else	


		{

			cout << "...ohne Erfolg\nVerbindung wird geschlossen!\n";

			cout<<"FEHLER : "<<GetLastError()<<endl;

			connection->Close();

		}



}

Link zu diesem Kommentar
Auf anderen Seiten teilen

if(connection->SetCurrentDirectory(_T("ordner\ordner\ordner")) )

Also der Compiler gibt mir keine Warnung aus. Wieso sollte er denn?

Habe es auch probiert mit:

if(connection->SetCurrentDirectory(_T("ordner/ordner/ordner")) )
if(connection->SetCurrentDirectory(_T("ordner\\ordner\\ordner")) )[/

Hat aber keinen Unterschied gemacht.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Also der Compiler gibt mir keine Warnung aus. Wieso sollte er denn?
Der Backslash leitet eine Escape-Sequenz ein. Um einen Backslash in einem Stringliteral unterzubringen, musst du zwei benutzten. Möglicherweise bekommst du keine Warnung, weil die "ordner" eigentlich mit einem Zeichen anfangen, das eine gültige Escape-Sequenz darstellt, z.B. n oder t.

Habe es auch probiert mit:

if(connection->SetCurrentDirectory(_T("ordner/ordner/ordner")) )
if(connection->SetCurrentDirectory(_T("ordner\\ordner\\ordner")) )[/

Hat aber keinen Unterschied gemacht.

Na dann benutzt doch mal InternetGetLastResponseInfo, wie in der Fehlermeldung angegeben.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Also laut MSDN hat InternetGetLastResponseInfo ja drei Parameter, die alle Zeiger sind, richtig? Nur ist mir noch nicht ganz klat, welcher Parameter wofür.

Bei mir funktioniert der Aufruf auch nur bei:

DWORD *lpdwError;

         LPTSTR lpszBuffer;

         DWORD *lpdwBufferLength;

InternetGetLastResponseInfo(lpdwError, lpszBuffer, lpdwBufferLength);

Ist aber ja irgendwie noch falsch. Der zweite Parameter müsste auch ein Zeiger sein,oder? Wenn die Parameter Zeiger sind, wie komme ich denn dann an die ErrorMessage?

Link zu diesem Kommentar
Auf anderen Seiten teilen

also ich finde folgendes im msdn:


BOOL InternetGetLastResponseInfo(

  __out    LPDWORD lpdwError,

  __out    LPTSTR lpszBuffer,

  __inout  LPDWORD lpdwBufferLength

);

und du hast recht, das sind Pointer zu einem Buffer, der die Informationen speichert. Wenn du im msdn weiter ließt, findest du golgendes zum Return Value:

Returns TRUE if error text was successfully written to the buffer, or FALSE otherwise. To get extended error information, call GetLastError. If the buffer is too small to hold all the error text, GetLastError returns ERROR_INSUFFICIENT_BUFFER, and the lpdwBufferLength parameter contains the minimum buffer size required to return all the error text.

Sprich benutze GetLastError und erhalte deine Information...

InternetGetLastResponseInfo Function (Windows)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Moin, also habe das mit InternetGetLastResponseInfo umgesetzt und erhalte

Error 122 The data area passed to a system call is too small.

Ich weiß nicht so genau was das nun heißt und wie das zu beheben ist.

#include "StdAfx.h"

#include "transfer_textfile.h"

#include "windows.h"

#include <iostream>

#include "Connect.h"


using namespace std;


transfer_textfile::transfer_textfile(void)

{

	Connect();

	CFtpConnection* connection_pointer;

	connection_pointer=Connect::getLastConnection();

	CFtpFileFind finder(connection_pointer);

	try

	{

		if(connection_pointer->SetCurrentDirectory(_T("Ordner\\ordner\\ordner")))								

		{

			cout<<"...mit Erfolg!\n";


			BOOL bWorking = finder.FindFile(_T("file.txt"));

			if(bWorking)

				{ 


					BOOL bGot = connection_pointer->GetFile(_T("file.txt"),_T("C:\\Ordner\\TxtTransfer"));

				}

			else

				{

						//something wrong with the file.. inform the user


						cout << "The File specified could not be found.!"<<GetLastError();

		}		}


		else

		{

			cout<<"FEHLER : "<<GetLastError()<<endl;


			DWORD dwInfo; 

			DWORD dwLength; 

			char *pszResponse = NULL; 

            InternetGetLastResponseInfo(&dwInfo, NULL, &dwLength); 

			cout << GetLastError();


		}

	}

	catch(CException* error)

    {

        TCHAR szCause[1024];

		error->GetErrorMessage(szCause,1024);

        printf_s("ERROR!  %S\n", szCause);

        error->Delete();

    }



}

Link zu diesem Kommentar
Auf anderen Seiten teilen

Moin, also habe das mit InternetGetLastResponseInfo umgesetzt
Nicht wirklich.

Der zweite Parameter muss ein Zeiger auf einen Puffer sein. Und der dritte muss auf eine Variable zeigen, die die Länge dieses Puffers, in TCHARs, enthält. Du übergibst aber NULL und einen Zeiger auf ein uninitialisiertes DWORD.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Der zweite Parameter muss ein Zeiger auf einen Puffer sein. Und der dritte muss auf eine Variable zeigen, die die Länge dieses Puffers, in TCHARs, enthält. Du übergibst aber NULL und einen Zeiger auf ein uninitialisiertes DWORD.

Funktioniert so aber noch nicht ganz. Wollte die Größe des Buffers eigentlich mit sizeof ermitteln. Aber sizeof gibt wohl einen falschen Datentyp zurück.

error C2440: 'initializing' : cannot convert from 'size_t' to 'DWORD *'

	DWORD dwInfo; 

			TCHAR puffer[50]; 

			TCHAR *pszResponse = puffer; 

			DWORD *dwLength= sizeof(puffer);  

            InternetGetLastResponseInfo(&dwInfo, (LPTSTR)pszResponse , dwLength); 

			cout << GetLastError();

Link zu diesem Kommentar
Auf anderen Seiten teilen

Warum hast du aus dwLength denn jetzt einen Zeiger gemacht?
In der MSDN steht doch
Pointer to a variable that contains the size of the lpszBuffer buffer, in TCHARs.

Deswegen habe ich daraus einen Zeiger.

Und was soll der Cast auf LPTSTR da?
Habe ich weggenommen.

Und sizeof liefert die Größe in Bytes, nicht in TCHARs. Das hatten wir doch auch schon einmal, oder?

Soll das Ergebnis von sizeof dann wieder durch wchar_t geteilt werden?

Dann erhalte ich logischerweise vom Compiler

'InternetGetLastResponseInfoW' : cannot convert parameter 3 from 'wchar_t *' to 'LPDWORD'

'initializing' : cannot convert from 'size_t' to 'wchar_t *'

Ich habe doch durch (sizeof(wchar_t)) geteilt?

DWORD dwInfo;  

			wchar_t puffer[50]; 

			wchar_t *pszResponse = puffer; 

			wchar_t  *dwLength = (sizeof(puffer))/(sizeof(wchar_t));

            InternetGetLastResponseInfo(&dwInfo, pszResponse , dwLength); 

			cout << GetLastError();

Link zu diesem Kommentar
Auf anderen Seiten teilen

In der MSDN steht doch

Deswegen habe ich daraus einen Zeiger.

Du hast aber keine Variable mehr, nur noch einen Zeiger. Wenn da steht "Zeiger auf eine Variable", dann legst du eine Variable an, und übergibst deren Adresse, wie es du es im ersten Code getan hast. Das Problem war doch nur, dass da kein definierter Wert drinstand.

Soll das Ergebnis von sizeof dann wieder durch wchar_t geteilt werden?

Dann erhalte ich logischerweise vom Compiler

Das bekommst du, weil du (aus unerfindlichen Gründen) einen wchar_t-Zeiger draus gemacht hast.

Einen eigenen Zeiger pszResponse brauchst du nicht, du kannst das Puffer-Array selbst benutzen.

Und du sollst durch sizeof(TCHAR) teilen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Einen eigenen Zeiger pszResponse brauchst du nicht, du kannst das Puffer-Array selbst benutzen.

War das so gemeint?

DWORD dwInfo; 

			TCHAR puffer[50]; 

			TCHAR *pszResponse = puffer;   

            InternetGetLastResponseInfo(&dwInfo, (LPTSTR)pszResponse , (sizeof(puffer)/sizeof(TCHAR))); 

			cout << GetLastError();

Als 3.Parameter brauche ich in dieser Funktion doch den Datentyp LPDWORD.

Link zu diesem Kommentar
Auf anderen Seiten teilen

War das so gemeint?
Nein, weil du immer noch pszResponse ebnutzt.

Als 3.Parameter brauche ich in dieser Funktion doch den Datentyp LPDWORD.
Schau nicht nur auf den Typ, schau auf die Beschreibung des Parameters. Ja, du brauchst da einen DWORD-Zeiger. Aber nicht irgendeinen. Du brauchst einen Zeiger auf ein DWORD, in dem drinsteht, wie groß der Puffer ist.

Ich verstehe nicht, wo hier das Problem ist. Bei dwInfo hast du das doch auch hinbekommen.

DWORD dwInfo = 0; 
TCHAR puffer[50] = _T("");
DWORD dwSize = sizeof(puffer) / sizeof(TCHAR);
if( !InternetGetLastResponseInfo(&dwInfo, puffer, &dwSize) )
{
// GetLastError [/code]

Link zu diesem Kommentar
Auf anderen Seiten teilen

Moin, war dein ! Absicht? Ich erhalte jetzt

Error 122 The data area passed to a system call is too small.

DWORD dwInfo = 0; 

				TCHAR puffer[50] = _T("");

				DWORD dwSize = sizeof(puffer) / sizeof(TCHAR);

				if( InternetGetLastResponseInfo(&dwInfo, puffer, &dwSize) )

				{	

					cout << GetLastError();

				}

Link zu diesem Kommentar
Auf anderen Seiten teilen

Also habe mir jetzt puffer ausgeben lassen:

550 Prohibited file name Onlino Irgendwo\automat

Die Fehler 550 habe ich nirgendswo gefunden. Der Pfadname ist auch abgeschnitten. Der vollständige Pfad lautet

Onlino Irgendwo\\automatic\\uuu
Was ist daran verboten?

transfer_textfile::transfer_textfile(void)

{

	Connect();

	CFtpConnection* connection_pointer;

	connection_pointer=Connect::getLastConnection();

	CFtpFileFind finder(connection_pointer);

	try

	{

		if(connection_pointer->SetCurrentDirectory(_T("Onlino Irgendwo\\automatic\\uuu")))								

		{

			cout<<"...mit Erfolg!\n";


			BOOL bWorking = finder.FindFile(_T("file.txt"));

			if(bWorking)

				{ 


					BOOL bGot = connection_pointer->GetFile(_T("file.txt"),_T("C:\\CPlusPlus\\TxtTransfer"));

				}

			else

				{

						//something wrong with the file.. inform the user


						cout << "The File specified could not be found.!"<<GetLastError();

		}		}


		else

		{

			DWORD dwInfo = 0; 

			TCHAR puffer[50] = _T("");

			DWORD dwSize = sizeof(puffer) / sizeof(TCHAR);

			if( !InternetGetLastResponseInfo(&dwInfo, puffer, &dwSize) )

					{

						cout << GetLastError();

					    cout << "Aufruf InternetGetLastResponseInfo nicht erfolgreich";

					}

			else

					{

						wcout << puffer;

						cout << "Aufruf InternetGetLastResponseInfo erfolgreich";

					}


		}

	}

	catch(CException* error)

    {

        TCHAR szCause[1024];

		error->GetErrorMessage(szCause,1024);

        printf_s("ERROR!  %S\n", szCause);

        error->Delete();

    }



}

Link zu diesem Kommentar
Auf anderen Seiten teilen

Die Fehler 550 habe ich nirgendswo gefunden.
In der FTP-Spezifikation hast du demnach nicht gesucht.

Und Google spuckt für "550 Prohibited file name" auch hunderte Treffer aus.

550 Requested action not taken.

File unavailable (e.g., file not found, no access).

Quelle: RFC 959 (rfc959) - File Transfer Protocol

Ich würde sagen, entweder gibt's das Verzeichnis nicht, oder du hast keine Rechte.

Der Pfadname ist auch abgeschnitten.
Das wiederum dürfte daran liegen, dass dein Puffer nur 50 Zeichen groß ist.
Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...