RemoveDir ohne Erfolg
-
Hallo,
folgender Code sollte eigentlich ein Verzeichnis löschen. Tut er aber nicht!!
{ String CurrentDir = GetCurrentDir(); SetCurrentDir(NewDir); if (!RemoveDir(TempDir)) // Fehleranweisung ... blabla ... SetCurrentDir(CurrentDir); }
Kurze Variablenbeschreibung
CurrentDir = aktuelles Verzeichnis (Zwischenspeichern)
NewDir = Verzeichnisebene über dem Verzeichnis das gelöscht werden soll
TempDir = zu löschendes VerzeichnisKennt jemand das Problem? Kann es an zu langen Verzeichnisnamen liegen? Habe wirklich keine Ahnung. Weiss auch nicht, wie die Funktion RemoveDir ganz genau arbeitet. Auch das Wechseln des Verzeichnisses hat nicht geholfen (SetCurrentDir). Habe es vorher ohne gemacht. Auch kein Erfolg.
Gruß
freedy
-
Hi,
bin mir nicht ganz sicher, aber ich glab das Verzeichnis muss vor dem Löschen leer sein.
Goldfinger
-
Entschuldigung, habe ich nicht erwähnt. Ich bewege vor dem "Löschen" des Verzeichnisses alle Dateien des Verzeichnisses um.
Löschen kann ich trotzdem nicht.
Bin weiter fleissig am probieren und experimentiere mal weiter. Wenn ich was neues habe, melde ich mich.Gruß
freedy
-
So...
ich habe folgendes herausgefunden. Wenn ich in der Fehlerbehandlung den Verzeichnisnamen im Code einbette, wird das Verzeichnis gelöscht.
{ String CurrentDir = GetCurrentDir(); SetCurrentDir(NewDir); if (!RemoveDir(TempDir)) { // Fehleranweisung ... blabla ... RemoveDir("cae_5000"); } SetCurrentDir(CurrentDir); }
Worin liegt jetzt aber der Unterschied zwischen dem String TempDir und der direkten Zuweisung? Einen Unterschied dürfte es doch eigentlich nicht geben, oder?
Gruß
freedy
-
Versuch mal
{ String CurrentDir = GetCurrentDir(); SetCurrentDir(NewDir); if (!RemoveDir(TempDir)) { // Fehleranweisung ... blabla ... ShowMessage(TempDir); RemoveDir("cae_5000"); } SetCurrentDir(CurrentDir); }
die können nicht gleich sein
-
Original erstellt von freedy:
Worin liegt jetzt aber der Unterschied zwischen dem String TempDir und der direkten Zuweisung?Hast du schon geprüft, ob in TempDir überhaupt das gewünschte Verzeichnis steht? Es ist durchaus möglich, dass deine relativen Pfadangaben durch das CurrentDir-Gewurstel durcheinanderkommen. Bei Dateioperationen sollte man nach Möglichkeit immer absolute Pfade verwenden.
-
Hast du schon geprüft, ob in TempDir überhaupt das gewünschte Verzeichnis steht? Es ist durchaus möglich, dass deine relativen Pfadangaben durch das CurrentDir-Gewurstel durcheinanderkommen. Bei Dateioperationen sollte man nach Möglichkeit immer absolute Pfade verwenden.
Ja, das habe ich beim Debugging überprüft.
Habe mir jetzt eine kleine Demoanwendung geschrieben. Dabei ist dann folgendes rausgekommen:
Ich kann ein Verzeichnis erstellen und löschen. Kopiere ich aber nach dem Erstellen eine beliebige Datei hinein, geht es nicht mehr. Logisch.
Lösche ich die Datei dann wieder, klappt es aber immernoch nicht, und das ist merkwürdig, oder?
-
hi, hab mir jetzt nicht alle beiträge durchgelesen ! aber du willst ein verzeichnis löschen (samt inhalt??).
ich mach das so :
void kill_dir(String &dir) {
int attr = faAnyFile;
TSearchRec F;
unsigned int erg = FindFirst(dir+String("\*.*"),attr,F);
while (erg == 0) {
if (F.Attr & faDirectory) {
if ((F.Name != ".") && (F.Name != "..")) {
kill_dir(dir+String("\")+F.Name);
}
} else {
DeleteFile(dir+String("\")+F.Name);
}
erg = FindNext(F);
}
FindClose(F);
RemoveDir(dir);
}aber damit sollte man vorsichtig umgehen
-
Da steht doch auch nur RemoveDir... Hab ich den wichtigen Unterschied überlesen? (Mit Code-Tags wäre das nicht passiert. Deswegen bestellen Sie noch heute: Code-Tags in der praktischen Vorratspa- Entschuldigung.)
Der Code macht doch auch nur vorher das Verzeichnis leer...?
-
Vielleicht hast du die schreibgeschützten oder versteckten Dateien vergessen?
-
Nein, auch im Explorer wird der Ordner als leer dargestellt. (Ja, ich habe im Explorer "versteckte Dateien anzeigen" aktiviert!) Aber danke, später könnte das wirklich ein Problem geben. Aber das ist ein anderes Thema.
Übrigens: Danke für die schnelle Antwort.
-
Hat sonst jemand ne Idee?
-
Plemplem,
Plemplem schrieb:
Hat sonst jemand ne Idee?
Vorschlag: vereinbare eine Testumgebung - z.B. irgendwas unter c:\temp und simuliere dort, was Du in Deiner Anwendung machen willst, damit wir diese Sitution leichter nachstellen können. Und gib uns für dieses Beispiel etwas mehr Code - insbesondere: was genau steht denn eigentlich in dem alles entscheidenden "TempDir" ???
-
http://www.winapi.net/index.php?inhalt=s21
Willst du kein Progress-Fenster angezeigt bekommen, dann schreibst du bei den Flags FOF_SILENT anstatt FOF_SIMPLEPROGRESS und lässt die letzte Zeile (shfs.lpszProgressTitle = ...) einfach weg.
-
dschensky, TempDir war nicht von mir... Das Problem von mir ist einfach RemoveDir. Da passiert einfach nichts. (Es gibt halt false zurück. Immer.) Wüsste daher nicht, was ich groß für Code schreiben könnte. Einfach RemoveDir mit den Parametern...
WebFritzi, der Link sieht gut aus. Werde ich mal ausprobieren; Danke.
-
Plemplem schrieb:
dschensky, TempDir war nicht von mir... Das Problem von mir ist einfach RemoveDir.
Na gut, dann eben anders herum: ich habe ein Verzeichnis erstellt: "c:\temp\deleteme" und dann das hier:
String dir = "c:\\temp\\deleteme"; RemoveDir(dir);
Und das Verz. wird gelöscht. Keine Probleme ...
Edit: ... es sei denn, das zu löschende Verz. wurde vorher zum current dir gemacht. Dann kann man es offenbar nicht löschen. Ich vermute mal, da liegt Dein Problem.
-
Wer Code will, soll auch Code haben
:
AnsiString file = "C:\\killme";//steht natürlich nicht SO im Code... if (!RemoveDir(file))//Klappt nie. ShowMessage("Verzeichnis konnte nicht gelöscht werden!");
Als ich vorher ein neues Projekt hatte und dein Beispiel ausprobiert habe, hat alles geklappt. Jetzt habe ich den gleichen Text in mein jetziges eingefügt und schon ging nix mehr. Wie kriege ich das Current Dir heraus?
-
hast es dir schon fast selber beantwortet: GetCurrentDir
-
Argh! Dieses blöde Get!!! So kann man ja nix finden!
Tja... leider ist mein CurrentDir nicht mein zu löschendes Dir...
Also wieder keinen Schritt weiter.
-
Plemplem,
Plemplem schrieb:
Tja... leider ist mein CurrentDir nicht mein zu löschendes Dir...
Also wieder keinen Schritt weiter.
dann bleibt noch die Möglichkeit, daß Dein eigener Quellcode, eine der in Deinem Programm verwendeten Komponenten oder ein anderes Programm gerade Zugriff auf das Verzeichnis hat. Um das alles herauszubekommen, kannst Du Deinen Code analysieren und verdächtige Stellen testhalber auskommentieren bzw. die verdächtigen Komponenten irgendwie deaktivieren. Falls ein externes Programm zugreift, kann ich den "Process Explorer" empfehlen, den es unter http://www.sysinternals.com/ als free ware gibt.
-
Alles unwahrscheinlich. So toll ist mein Programm nicht. Und andere Programme sollten sich nicht für nen mit Müll gefüllten Ordner interressieren...