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
undcopyPath
her? In den anderen Funktionen legst du lokale ArraysquellPath
undcopyPath
an. Die Variablen, die du hier verwendest, sind aber was anderes. Vermutlich Member der KlasseProgramm
. Oder Globale. Oder kopierst du den Inhalt der lokalen VariablequellPath
(OnBnClickedQuellPath
) irgendwann in die (klassen-)globalequellPath
? 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/39295nur 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.aspxZeichenketten und MFC:
http://msdn.microsoft.com/de-de/library/kda99ffc.aspxKonvertierungen von Zeichenketten
How to: Convert Between Various String Types
http://msdn.microsoft.com/de-de/library/ms235631.aspxZu TCHAR
http://www.codeproject.com/Tips/76252/What-are-TCHAR-WCHAR-LPSTR-LPWSTR-LPCTSTR-etcAnsonsten 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 Variablentypfü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