Computerhilfen.de Logo
Forum
Tipps
News
Frage stellen

Dateien löschen in Visual C++

Hallo!

Ich möchte in meinem MFC-Programm einen ganzen Ordner rekursiv löschen. Verwende dazu SHFileOperation.
Den Member pFrom der Struktur SHFILEOPSTRUCT setze ich, nach diversen Versuchen, inzwischen mit einer Variable vom Typ LPCTSTR (so, wie der Member in der Struktur auch definiert ist).

Das könnte beispielsweise so aussehen:

LPCTSTR sTargetFolder = "C:\\tmp\0\0"In diesem Fall funktioniert das auch.

Wenn ich mir allerdings meinen zu löschenden Pfad beispielsweise so zusammenbaue:
TCHAR szPathName[_MAX_PATH];
::GetModuleFileName(NULL, szPathName, _MAX_PATH);
LPTSTR pszFileName = _tcsrchr(szPathName, '\\') + 1;
*pszFileName = '\0';
CString sAppRoot = szPathName;

LPCTSTR sTargetFolder = sAppRoot + "images\\test\0\0";
dann erzählt er mir Windows immer was vonwegen
"Datei kann nicht gelöscht werden: Die Quelldatei oder vom Quelldatenträger kann nicht gelesen werden."

Habe schon einige Varianten durchprobiert - wie gesagt auch mit der Verwendung eines anderen Typs für den Member pFrom. In einem Beispielskript im Netz wurde string verwendet, aber das Ergebnis war bei mir das gleiche.

Hat jemand von euch Experten einen Lösungsvorschlag?

Vielen Dank schonmal! :D

greez 8)
JoSsiF

Antworten zu Dateien löschen in Visual C++:

Was enthält denn sTargetFolder nach dieser Zeile?

LPCTSTR sTargetFolder = sAppRoot + "images\\test\0\0";

könnt n Pointer auf die Daten von einem schon wieder zerstörten temporären CString Objekt sein :-)

Btw wieso nullterminierst du manuell?

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

sTargetFolder enthält nach dieser Operation den korrekten Pfad, die verwendeten CString-Objekte sind auch noch existent.

Das kuriose ist ja: setze ich, wie im 1. Codeschnipsel, den Pfad per Hand, kommt die gleiche Fehlermeldung.
Dumme Frage vielleicht, aber muss man Leerzeichen im Pfad (z.B. "Eigene Dateien") in irgendeiner Weise gesondert behandeln? Werde das Gefühl nicht los, dass es daran liegt.

Die manuelle Nullterminierung war übrigens noch ein Überbleibsel eines früheren Versuchs, die ist ja hier überflüssig.

Danke erstmal!

greez 8)
JoSsiF

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button
1 Leser hat sich bedankt

So... was lange währt (und es war sehr lang), wird scheinbar doch endlich gut.

Das Problem war vermutlich, dass LPCTSTR sTargetFolder aus einem CString erzeugt worden ist. Scheinbar akzeptiert pFrom nur mit MAX_PATH begrenzte Chars.

greez 8)
JoSsiF

CString + "chararray" ergibt n objekt vom typ CString.

Wenn du das an ein LPCTSTR (nichts anderes als n const char*) zuweist, wird der pointer auf die Daten im CString rausgegeben. Da du das CString nicht speicherst, passiert danach mit den Daten irgendwas undefiniertes... Zumindest Zeigt dann sTargetName ins Nirvana.

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Sorry, verstehe ich nicht ganz.

Wenn ich eine CString-Variable anlege und direkt einen Wert zuweise...

CString sTargetFolder = "C:\\temp";
... dann hab ich doch den Wert im Speicher (im genannten Fall wäre es ja auch kein Typenmix). Und ein Pointer darauf würde dann diesen Wert zurückliefern, richtig? Was müsste/könnte/sollte ich da speichern?

Es geht um diese Zeile :

LPCTSTR sTargetFolder = sAppRoot + "images\\test\0\0";

Schauen wir mal die Typen in dieser Zeile an :

LPCTSTR = CString + LPCSTR;

=> der Compiler muss für die rechte Seite der Zuweisung ein temporäres CString Objekt erzeugen.

Der generierte Code dürfte so aussehen :
LPCTSTR sTargetFolder;
{
  CString tmp = sAppRoot;
  tmp += "images\\test\0\0";
  sTargetFolder = tmp;
}

Da dieses temporäre Objekt nach dieser Zeile zerstört wird, darf man dessen Daten-pointer nicht mehr benutzen.

=> Die CString Klasse der MFC ist 'schlecht' designed, da sie dieses Verhalten problemlos zulässt.

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Mit anderen Worten: ich müsste erst den kompletten Pfad in ein CString-Objekt packen und dann den Pointer auf genau dieses CString-Objekt setzen, richtig?

Nunja...könnte sein, dass ich gerade diese Variante nicht probiert hab, aber die jetzige Lösung (mit 'nem char) entspricht ja prinzipiell dem und funzt ;)

Danke trotzdem für die Info, wieder was gelernt! :)

greez 8)
JoSsiF


« C++: PointerErfahrung mit #develop ? »
 

Schnelle Hilfe: Hier nach ähnlichen Fragen und passenden Tipps suchen!

Fremdwörter? Erklärungen im Lexikon!
Ordner
Ordner sind Strukturelemente in einem Dateisystem, die  Dateien und andere Ordner organisieren und speichern können. Sie ermöglichen eine strukturierte und...

Type 1 Schriften
Type 1 ist ein Schriftformat, das die Schrift-Beschreibung in Form von PostScript-Befehlen speichert. PostScript-Schriften werden mithilfe von PostScript-Operationen besc...

Quellcode
Ein Quellcode, auch als Quelltext bekannt, bezeichnet den unkompilierten Programm-Code einer Software. Quell- oder Programm-Code ist der auch für Menschen lesbare Co...