Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

SetCurrentDirectory

Empfohlene Antworten

Veröffentlicht

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();

		}



}

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.

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.

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?

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)

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();

    }



}

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.

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();

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();

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.

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.

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]

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();

				}

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();

    }



}

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.
Ich würde sagen, entweder gibt's das Verzeichnis nicht, oder du hast keine Rechte.

Ist das die einzige Fehlerquelle oder gibt es noch irgendeine andere potentielle Möglichkeit?

Jo, danke mit einzelen Slashes funktioniert es.

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.