Ist Pfad local
-
also einfach nur eine null an das ende des strings in der variable zu schreiben hat nix gebracht, ich muss die funktion benutzen.
kann mir jemand erklären warum? ich dachte die funktion macht nichts anderes wie die 0 an das ende...
der beitrag indem jemand das geschrieben hat wurde irgendwie gelöscht
-
also
CString test = _T("C:\\testordner\\*\n"); // geht nicht SHFILEOPSTRUCT sh; sh.hwnd = NULL; sh.fFlags = FOF_NOCONFIRMATION | FOF_SILENT; sh.wFunc = FO_DELETE; sh.pFrom = test; // CString2TCHAR(test); wenn ich das benutze funktionierts sh.pTo = NULL; sh.hNameMappings = NULL; sh.lpszProgressTitle = NULL; if (SHFileOperation (&sh) == 0 {...........}
kann mir bitte jemand erklären wie das ist, weil ich will ja nicht nur das der code funktioniert ich würde gern daraus etwas lernen und mit nehmen, aber so richtig verstehe ich das nicht...
was ich auch immer noch nciht so kapiere, wann delete ich? am besten im destruktor der klasse oder?
-
ich mein natürlich \0 sorry
CString test = _T("C:\\testordner\\*\0");
-
Du brauchst offensichtlich einen TCHAR* und hast einen CString, oder ?
Der ausführliche Ausflug von nwp3 in Stringverarbeitung reicht nicht ?
nwp3 schrieb:
So ganz unrecht hatte der "Grundlagen lernen"-Typ nicht.
Ich versuchs mal....
Du solltes rausfinden was ein CStringT ist und wie man daraus einen char * oder wchar_t * macht, dann funktioniert auch dein Code.
Sowohl TCHAR alsauch CString haben den Vorteil, das es egal ist ob Unicode oder nicht. Um da allerdings den String reinzubekommen wird _T("..") oder TEXT("..")
(oder notfalls auch L"..") wohl benötigt.
-
danke für die antwort... ich google auch ein wenig, da ich das einfach verstehen will jetzt.
// Our CString object. CString String = "HelloWorld"; // Get the internal buffer pointer of CString. LPTSTR pString = String.GetBuffer( 0 ); ... // Use the pString and then release it. String.ReleaseBuffer();
Warum geht das dann nicht in meinem Fall?
-
intern schrieb:
ich mein natürlich \0 sorry
CString test = _T("C:\\testordner\\*\0");
Wie wärs mit
CString test( _T("C:\\testordner\\*\0"));
Wenn man sich das aber mal im Debugger ansieht fehlt die NULL zwar, aber
int x = test.GetLength();
zählt die Null offensichtlich mit.
Es geht dann auch:
test += TCHAR(0);
-
intern schrieb:
ich mein natürlich \0 sorry
CString test = _T("C:\\testordner\\*\0");
geht doch ?
Ob die Null allerdings nach der Konvertierung von CString in TCHAR noch da
wäre eine andere Frage.Gibt es denn einen plausiblen Grund warum du nicht gleich ein TCHAR-Array nimmst bei dem duch den Speicher dynamisch verwaltest?
Wie nwp3 ja bereits angemerkt hat, haben konstante Strings ein paar Einschränkungen.
-
also ich habe das programm zum weiterarbeiten hier bekommen, das steht schon so. ist ziemlich groß für meine verhältnisse.
es gibt einfach einen standart pfad der aus einer datei gelesen wird und in CString gespeichert wird und hier und da verwendet wird.
Jetzt geht es darum den Inhalt des Ordner zu löschen.
CString test = _T("C:\\testordner\\*\0"); // gibt keinen compilerfehler aber meine löschfunktion geht nicht...
CString test( _T("C:\\testordner\\*\0")); SHFILEOPSTRUCT sh; sh.hwnd = NULL; sh.fFlags = FOF_NOCONFIRMATION | FOF_SILENT; sh.wFunc = FO_DELETE; sh.pFrom = test; //das geht auch nicht(strPathToDelete); sh.pTo = NULL; sh.hNameMappings = NULL; sh.lpszProgressTitle = NULL; if (SHFileOperation (&sh) == 0)
es geht wirklich nur mit der vorgeschlagenen funktion. oder wenn ich einfach sage
sh.pFrom = _T("C:\\testordner\\*\0")
ich suche auch schon nach literatur dazu aber leider finde ich nichts
-
und verrückt werde ich auch, denn das geht jetzt
strPathToDelete = _T("C:\\Download\\*"); strPathToDelete += _T('\0'); SHFILEOPSTRUCT sh; sh.hwnd = NULL; sh.fFlags = FOF_NOCONFIRMATION | FOF_SILENT; sh.wFunc = FO_DELETE; sh.pFrom = strPathToDelete; //CString2TCHAR(strPathToDelete); sh.pTo = NULL; sh.hNameMappings = NULL; sh.lpszProgressTitle = NULL; if (SHFileOperation (&sh) == 0)
was ist denn daran jetzt anderst? strPathToDelete += _T('\0');
-
Hallo,
zunächst das hier:
intern schrieb:
CString test( _T("C:\\testordner\\*\0")); SHFILEOPSTRUCT sh; sh.hwnd = NULL; sh.fFlags = FOF_NOCONFIRMATION | FOF_SILENT; sh.wFunc = FO_DELETE; sh.pFrom = test; //das geht auch nicht(strPathToDelete); sh.pTo = NULL; sh.hNameMappings = NULL; sh.lpszProgressTitle = NULL; if (SHFileOperation (&sh) == 0)
kann nicht funktionieren, weil bei
CString test( _T("C:\\testordner\\*\0"));
test nur alle Zeichen bis zum ersten Null-Byte bekommt (die "Null" ist nicht enthalten, obwohl geschrieben, weil der Konstruktor zur "Füllung" des internen Zeichenspeichers hier nur alle Zeichen liest, bis die erste "Null" kommt, der Zeichenspeicher enthält also die "Null" nicht), eine zweite "Null", die erforderlich ist, gibt es hier nicht, nur eine, die bei
sh.pFrom = test
von CString hier "erzeugt" wird.
Hier:
intern schrieb:
oder wenn ich einfach sage
sh.pFrom = _T("C:\\testordner\\*\0")
ich suche auch schon nach literatur dazu aber leider finde ich nichts
liegt der Fall ganz anders, weil kein CString benutzt wird, es gibt keine Funktion hier (oben schon, weil dort ein Konstruktor "aufgerufen" wird, der nach einer bestimmten Regel die Zeichen analysiert), die erst alle Zeichen in einen bestimmten Bereich kopieren muss, hier liegen die Zeichen mit der explizit geschriebenen "Null" und mit einer "Null", die vom Compiler noch zusätzlich angefügt wird, in einem Speicherbereich, also alles so, wie es sein soll.
Und das hier:
intern schrieb:
und verrückt werde ich auch, denn das geht jetzt
strPathToDelete = _T("C:\\Download\\*"); strPathToDelete += _T('\0'); SHFILEOPSTRUCT sh; sh.hwnd = NULL; sh.fFlags = FOF_NOCONFIRMATION | FOF_SILENT; sh.wFunc = FO_DELETE; sh.pFrom = strPathToDelete; //CString2TCHAR(strPathToDelete); sh.pTo = NULL; sh.hNameMappings = NULL; sh.lpszProgressTitle = NULL; if (SHFileOperation (&sh) == 0)
was ist denn daran jetzt anderst? strPathToDelete += _T('\0');
klappt, weil durch Hinzufügen eines einzelnen ("Null-")Zeichens der interne Zeichenzähler um eins erhöht wird (es wird eine andere Funktion, nicht der Konstruktor wie oben, aufgerufen, die "Null"-Zeichen nicht "ablehnt"), die "Null" also mit erfasst wird und in den internen Zeichenspeicher übertragen wird. Eine zweite "Null" wird wieder, wie oben schon erklärt, von CString bereit gestellt.
MfG,
Probe-Nutzer