Open File Dialog mit doppeltem backslash



  • ok ich hab mir jetzt grad die Escapesequenzen angeschaut.
    Jetzt hab ichs verstanden, is ja im prinzip auch logisch, dass so die blackslashs angezeigt werden.

    nur wie mach ich das jetzt mit der SHFILEOPSTRUCT funktion?
    wenn ich den Pfad verwende, wie ich ihn vom Open File Dialog bekomm, kopiert die Funktion nichts
    Gruß



  • FlorianB schrieb:

    ok ich hab mir jetzt grad die Escapesequenzen angeschaut.
    Jetzt hab ichs verstanden, is ja im prinzip auch logisch, dass so die blackslashs angezeigt werden.

    nur wie mach ich das jetzt mit der SHFILEOPSTRUCT funktion?
    wenn ich den Pfad verwende, wie ich ihn vom Open File Dialog bekomm, kopiert die Funktion nichts
    Gruß

    Debuggen, Variableninhalte prüfen, Rückgaben prüfen (z.B. von SHFileOperation ). Wenn nichts hilft, ein Minimalbeispiel basteln, das den Fehler enthält, und hier posten.

    Btw, die Funktion heißt natürlich SHFileOperation . SHFILEOPSTRUCT ist das dazugehörige struct. 🙂



  • also ich habs mal durchgedebuggt.

    hier erst mal mein code:

    .
    .
    .
    void Programm::OnBnClickedQuellPath()
    {	
    
    	BROWSEINFO rBI= {0};
    	rBI.ulFlags = BIF_RETURNONLYFSDIRS | BIF_USENEWUI;
    	rBI.lpszTitle= L"Select Folder for Input Files";
    
    	LPITEMIDLIST pidl= SHBrowseForFolder( &rBI ); 
    	if ( pidl != NULL ) {  // else, user canceled	
    		TCHAR quellPath[MAX_PATH];
    		BOOL fRet= SHGetPathFromIDList( pidl, quellPath );
    		m_ctrlEditDecryptFilename.SetWindowTextW( quellPath );
    	}
    
    }	
    
    void Programm::OnBnClickedCopyPath()
    {	
    
    	BROWSEINFO rBI= {0};
    	rBI.ulFlags = BIF_RETURNONLYFSDIRS | BIF_USENEWUI;
    	rBI.lpszTitle= L"Select Folder for Output Files";
    
    	LPITEMIDLIST pidl= SHBrowseForFolder( &rBI ); 
    	if ( pidl != NULL ) {  // else, user canceled	
    		TCHAR copyPath[MAX_PATH];
    		BOOL fRet= SHGetPathFromIDList( pidl, copyPath );
    		m_ctrlEditEncryptFilename.SetWindowTextW( copyPath );
    	}
    
    }	
    
    void Programm::OnBnClickedStart()
    {	
    
    	SHFILEOPSTRUCT sf;
    	memset(&sf,0,sizeof(sf));
    	sf.hwnd = 0;
    	sf.wFunc = FO_COPY;
    	sf.pFrom = quellPath;
    	sf.pTo = copyPath;
    	sf.fFlags = FOF_NOCONFIRMATION | FOF_NOCONFIRMMKDIR | FOF_NOERRORUI | FOF_SIMPLEPROGRESS;
    
    	int n = SHFileOperation(&sf);
    	if( n == 0)
    	{
    		LPTSTR geht = _T("Fertig");
    		m_ctrlEditChecksum.SetWindowText(geht);			//quellPath Kopiervorgang erfolgreich
    	}
    	else
    	{
    		LPTSTR nicht = _T("Fehler");
    		m_ctrlEditChecksum.SetWindowText(nicht);			//Kopiervorgang fehlgeschlagen
    	}
    .
    .
    .
    

    nun zu meinen ergebnissen:
    wenn ichs so laufen lass, zeigt er mir beim debuggen an, dass copyPath und quellPath ein Schlechtes Ptr sind und Fehler: CXX0030: Fehler: Ausdruck kann nicht ausgewertet werde.
    habs dann mal noch mit ner Testvariable versucht. Also mit LPTSTR quellPath = _T("C:\KA"); und mit LPTSTR copyPath = _T("C:\KA2");
    Wenn ichs so durchlaufen lass gehts auch nicht. Da fehlt dann bei der Veriable der Backslash. Wenn ich es jedoch mit doppelten Backslash laufen lass mit den Variablen, funktioniert es und er kopiert den Ordner.
    Kann mir da jemand weiter helfen. Ich bin noch anfänger in dem Gebiet und weiß nun nicht mehr weiter.
    Gruß



  • Dieser Thread wurde von Moderator/in Jochen Kalmbach aus dem Forum C++/CLI mit .NET in das Forum MFC (Visual C++) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • FlorianB schrieb:

    void Programm::OnBnClickedStart()
    {	
    		
    	SHFILEOPSTRUCT sf;
    	memset(&sf,0,sizeof(sf));
    	sf.hwnd = 0;
    	sf.wFunc = FO_COPY;
    	sf.pFrom = quellPath;    //<==
    	sf.pTo = copyPath;       //<==
    	sf.fFlags = FOF_NOCONFIRMATION | FOF_NOCONFIRMMKDIR | FOF_NOERRORUI | FOF_SIMPLEPROGRESS;
    

    Wo hast du denn quellPath und copyPath her? In den anderen Funktionen legst du lokale Arrays quellPath und copyPath an. Die Variablen, die du hier verwendest, sind aber was anderes. Vermutlich Member der Klasse Programm . Oder Globale. Oder kopierst du den Inhalt der lokalen Variable quellPath ( OnBnClickedQuellPath ) irgendwann in die (klassen-)globale quellPath ? Ich vermute, das tust du nicht und genau das ist der Fehler.



  • also ich hab ne Headerdatei angelegt, in der hab ich copyPath und quellPath public angelegt. Das müsste doch passen oda?
    Ich steh grad irgendwie auf dem Schlauch 🙄
    wenn ich copyPath und quellPath als TCHAR deklariere in der Header mekert er bei der SHFileOperation. Wenn ich als LPTSTR deklariere mekert er zwar nicht, aber funktioniert auch nicht. Was mach ich jetzt falsch? Warscheinlich ein großer Fehler bei den Variablen.
    Gruß



  • FlorianB schrieb:

    also ich hab ne Headerdatei angelegt, in der hab ich copyPath und quellPath public angelegt. Das müsste doch passen oda?

    Nein! Du deklarierst doch dort lokale Variablen. Wenn du ein lokales quellPath anlegst, schreibst du auch da rein und nicht in deine Globale. Lösche die lokalen Deklarationen und schaue, was passiert. 😉



  • so ich bin schon weiter gekommen.
    hab jetzt in die headerdatei folgendes eingetragen:
    TCHAR quellPath[MAX_PATH];
    TCHAR copyPath[MAX_PATH];

    funktioniert auch wunderbar so. also das Pfad einlesen über den Open File Dialog.
    das Kopieren findet leider nicht statt.
    wenn ich durchdebugge, ist bei vollgender Codezeile ein falscher Wert:
    int n = SHFileOperation(&sf);

    n hat hier den Wert 1148. Aber warum?
    Wenn ich es durchlaufen lass mit Lokalen Variabeln, funktioniert es nur wenn ich doppelte Backslash eintrag. Dann hat n den Wert 0 und kopiert.
    Wenn ich es mit normalem Pfad durchlaufen lass, als mit einfachen Backslash, dann hat n den Wert 1026 und es wir nicht kopiert.

    Was mach ich jetzt noch falsch?
    Durch das debuggen hab ich einiges interessantes rausgefunden 🙂
    gruß



  • Hast Du mal die Doku zu SHFileOperation gelesen? Speziell wie der Pfad auifgebaut sein MUSS? Da reicht *nicht* eine \0 am Ende!



  • hey,
    hab mir alles nocheinmal durchgelesen.
    der Pfad muss doch so aussehen oda?:

    // RIGHT
    LPTSTR pszSource = L"C:\\Windows\\*\0";
    

    Gruß



  • richtig oder falsch?



  • kann mir keiner Helfen?
    MfG



  • Ich würde es so schreiben:

    LPCTSTR pszSource = _T("C:\\Windows\\*\0\0");
    


  • hey,

    ok hmm.
    Bei dem Pfad muss ich jetzt aber doppelte \\ angeben, Dann funktioniert der Kopiervorgang.
    Nur wie mach ich das jetzt mit dme OpenFileDialog-Pfad?
    Mit dem funktioniert es nämlich nicht. Es wird nichts kopiert.
    Gruß



  • hey,
    hab nach langem googeln was zu dem Thema gefunden.
    http://www.c-plusplus.net/forum/39295

    nur handelt es sich hierbei um einen AnsiString.
    Hat der TCHAR die gleichen Eigenschaften?
    Weil dann müsste die Funktion ja funktionieren.
    Gruß



  • Mein Eindruck, Du programmierst nicht, sondern stocherst rum.
    Ist Dir schon mal in den Sinn gekommen, Dir die Grundlagen anzueignen.
    Dazu gehört das Wissen um Datentypen, Zeichensätze allgemein.

    Windows Datentypen
    http://msdn.microsoft.com/en-us/library/aa383751%28v=VS.85%29.aspx
    Zeichensätze
    http://msdn.microsoft.com/de-de/library/06b9yaeb.aspx

    Zeichenketten und MFC:
    http://msdn.microsoft.com/de-de/library/kda99ffc.aspx

    Konvertierungen von Zeichenketten
    How to: Convert Between Various String Types
    http://msdn.microsoft.com/de-de/library/ms235631.aspx

    Zu TCHAR
    http://www.codeproject.com/Tips/76252/What-are-TCHAR-WCHAR-LPSTR-LPWSTR-LPCTSTR-etc

    Ansonsten in der MSDN steht alles was Du zur Programmierung von Windows mit MFC wissen mußt.
    Voraussetzung: Lesen!



  • hey,

    ich bin noch ein Anfänger und kein Experte.
    Hab mir die Links lange durchgelesen.
    Mit den MSDN einträgen kann ich irgedwie nicht so viel anfangen.

    kann mir mal jemand zeigen, wie er es machen würde, wenn der Pfad über einen open file dialog eingelesen wird und dann in der SHFileOperation verwendet wird?

    hab jetzt nochmal ein bisschen rumprobiert es aba ned nicht hinbekommen 😞

    das mit den doppelten Backslash hab ich jetzt auch kapiert.

    Gruß



  • Hey Leute,
    keiner ne Ahnung?
    Gruß



  • Brauch man aber doch trotzdem nicht, oder?



  • Hey,
    habs inzwischen hinbekommen!
    es war lediglich der falsche Variablentyp

    für alle die das gleiche oder änliche Probelm haben:

    CString quellPathC(quellPath);                //Umwandlung von TCHAR in CString
    	quellPathC.Append(L"\\*.*");
    	CString copyPathC(copyPath);
    
    	quellPathC.AppendChar('\0');
    	copyPathC.AppendChar('\0');
    	SHFILEOPSTRUCT sf;
    	memset(&sf,0,sizeof(sf));
    	sf.hwnd = NULL;
    	sf.wFunc = FO_COPY;
    	sf.pFrom = quellPathC.GetBuffer();									//quellPath Pfad von Dateiordner
    	sf.pTo = copyPathC.GetBuffer();										//Pfad des Kopierordners
    	sf.hNameMappings = NULL;
    
    	sf.fFlags = FOF_NOCONFIRMATION | FOF_NOCONFIRMMKDIR | FOF_NOERRORUI | FOF_SIMPLEPROGRESS;
    

    Mfg und vielen Dank trotzdem


Anmelden zum Antworten