Problem bei SHFileOperation...
-
Hi!
Könnt ihr mir bei folgendem Probelm helfen?? Ich brauche eine Möglichkeit, eine oder auch mehrere Dateien (mit Wildcards) zu löschen (bzw. zu kopieren und zu moven). Folgendes Funktioniert auch wunderbar:string test = "*.txt" + (char) NULL + (char) NULL; SHFILEOPSTRUCT fileop = { NULL, FO_DELETE, (LPCTSTR) test.c_str(), NULL, FOF_SILENT | FOF_NOERRORUI | FOF_NOCONFIRMATION, NULL, NULL, NULL }; if(SHFileOperation(&fileop) == 0) { MessageBox(NULL, "Dateien geloescht!", "", 0); } else { MessageBox(NULL, "Dateien NICHT geloescht!", "error", 0); }
Aber eines Funktioniert nicht: Wenn es die angegebene Datei nämlich nicht gibt, dann liefert diese blöde SHFileOperation-Funktion trotzdem 0 zurück. Im Fehlerfall soll aber eine Aktion ausgeführt werden, die natürlich nie eintritt. Wo liegt der Fehler?????
Gruss, ~cp
-
Vielleicht wird fAnyOperationsAborted entsprechend gesetzt
- also einfach mal statt NULL eine Variable nehmen und anschließend den Wert abfragen
-
Hi!
Nein habe ich grad getestet, geht nicht. Es wird immer FALSE zurückgeliefert, also "die aktion wäre errfolgreich" ... nee isse aber nicht ... und in der MSDN steht auch, das die Variable nur gesetzt wird, wenn der User es abbricht. Wo könnte das Problem noch liegen?? Oder ist das ein API-Bug????Gruss ~cp
-
Vielleicht hilft GetLastError()
-
flenders schrieb:
Vielleicht hilft GetLastError()
Hi!
Nein, liefert immer 0Da muss es doch eine Lösung geben.... oder ist was an den Parametern falsch, das es unterbindet, das er einen Fehler zurückgeben soll?? ... HMMM...
grüsse, ~cp
-
ehh das kann doch nicht sein. Jetzt hab ich es mal so probiert:
#include <windows.h> #include <shellapi.h> #include <string.h> #include <iostream.h> #pragma hdrstop #include <condefs.h> //--------------------------------------------------------------------------- #pragma argsused WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) { //string test = "*.txt" + (char) NULL + (char) NULL; char *test = "c:\\winnt\\profiles\\mueller\\desktop\\wildcards\\test.txt\0\0"; SHFILEOPSTRUCT fileop; fileop.hwnd = NULL; fileop.wFunc = FO_DELETE; fileop.pFrom = test; fileop.pTo = NULL; fileop.fFlags = FOF_SILENT | FOF_NOERRORUI | FOF_NOCONFIRMATION; fileop.fAnyOperationsAborted = NULL; fileop.hNameMappings = NULL; fileop.lpszProgressTitle = NULL; if(SHFileOperation(&fileop) == 0) { MessageBox(NULL, "Dateien geloescht!", test, 0); } else { MessageBox(NULL, "Dateien NICHT geloescht!", test, 0); } return 0; }
ES EXISTIERT KEINE TEST.TXT, und diese drecksfunktion liefert trotzdem 0 zurück. Ich hasse Microsoft. Selbst wenn ich bei fFlags nix angebe, dann kommt zwar von Windows die Meldung "Die Datei wurde nicht gefunden", aber die scheiss Funktion gibt trotzdem 0 zurück. Microsoft's tolle Superfunktionen, auf die kann man sich verlassen wie auf die Deutsche Bahn.
Und ich kann nicht die existenz der Datei(en) prüfen, da ja auch Wildcards unterstützt werden sollen, oder muss ich erst mit einem beschissenen FindFirstFile- und FindNextFile-Konstrukt rausfinden, ob es die scheiss Dateien gibt, weil Microsoft's Drecksfunktion ja nciht dazu in der Lage ist...ACH ES REGT MICH EINFACH AUF ... BILL GATES MACHT AUS SCHEISSE GELD ...
gruss, ~cp
-
ACH ES REGT MICH EINFACH AUF ... BILL GATES MACHT AUS SCHEISSE GELD ...
Was soll denn der Scheiss?
Wenn eine Datei gelöscht wurde, wurde ist die Funktion genauso ordnungsgemäss ausgeführt, wie wenn sie gar nicht existiert. Was anderes wäre es, eine nicht existierende Datei zum Lesen öffnen zu wollen.
-
Ich muss aber wissen, ob die Kopier/Lösch/Move-Funktion erfolgreich verlief oder nicht. Und das tut sie nicht, wenn die Datei nicht existiert. Wenn ich eine nicht existierende Datei löschen oder eine nicht existierende Datei kopieren will, soll diese blöde SHFileOperation-Funktion nicht zurückliefern: "Es ist kein Fehler aufgetreten!", wenn die Datei, die nicht existiert, nicht kopiert wurde. Was soll denn das? Und in der MSDN steht:
Returns zero if successful, or nonzero otherwise.
Also! Was lernt man daraus? Das M-eigenen Doku steht, gerecht zu werden.
*grummel*
~cp
-
AHA! Folgendes:
Windows 98: SHFileOperation == 0, auch bei Fehler
Windows NT: SHFileOperation == 0, auch bei Fehler
Windows 2000: SHFileOperation != 0, bei FehlerWas lernen wir daraus? Das Micro$oft einen Bug behoben hat. Trotzdem finde ich das jetzt irgendwie mist, das es nicht unter älteren Windows 95/98 und NT läuft, wenn in der Doku steht: Minimum Requirements Windows 95 or NT
Sacht mal, muss ich die shell32.lib vielleicht explizit einbinden oder wie oder was?
...
~cp