Datei löschen mit Standard Explorer Abfrage?



  • Hallo,

    ist es möglich beim Löschen einer Datei die Standard Windows (z.B. im Explorer) Löschabfrage ("Möchten Sie die Datei ... wirklich löschen?") einzubinden? (via WINAPI Call?)

    Danke für eure Hilfe

    Daniel



  • SHFileOperation



  • if(MessageBox("Datei löschen","Möchten Sie die Datei wirklich löschen?",MB_YESNO)==ID_YES)
      // Datei tatsächlich löschen
    /* else Abbruch */
    


  • CStoll schrieb:

    if(MessageBox("Datei löschen","Möchten Sie die Datei wirklich löschen?",MB_YESNO)==ID_YES)
      // Datei tatsächlich löschen
    /* else Abbruch */
    

    😃 👍



  • Naja, dachte ich mir schon das ich über die MessageBox Funktion gehen muss. Wäre schön gewesen wenn es etwas gegeben hätte indem man Windows die Abfrage machen lassen kann (bzgl. Übersetzung, etc).

    if(MessageBox(NULL, "Datei löschen","Möchten Sie die Datei wirklich löschen?",MB_YESNO)==IDYES)
    	{
    		return DeleteFile( lpFileName );
    	}
    	else
    		return FALSE;
    

    Aber danke für die Rückmeldungen.

    Schönes WE



  • DanielG schrieb:

    Naja, dachte ich mir schon das ich über die MessageBox Funktion gehen muss. Wäre schön gewesen wenn es etwas gegeben hätte indem man Windows die Abfrage machen lassen kann (bzgl. Übersetzung, etc).

    Aber danke für die Rückmeldungen.

    Schönes WE

    Siehe 2. Beitrag.



  • Oh, hatte ich ganz übersehen, danke.

    Habe nun folgendes implementiert:

    SHFILEOPSTRUCT sh; 
    	  sh.hwnd = NULL; 
    	  sh.fFlags = NULL;
    	  sh.wFunc = FO_DELETE;               
    	  sh.pFrom = "C:\\FileInfo.cpp";
    	  sh.pTo = NULL;
    	  sh.hNameMappings = NULL;
    	  sh.lpszProgressTitle = NULL;
    
    	  SHFileOperation (&sh);
    

    Komisch ist das dies wunderbar in einem testkonsolenprogramm funktioniert, jedoch nicht in meiner Anwendung. Hab jedoch die gleichen Includes, etc... (arbeite jedoch nicht mit MFC).

    Jemand eine Idee an was dies liegen könnte?



  • ich seh schonmal den fehler das pFrom nicht mit 2 Nullen terminiert ist.



  • Oha, ja das ist richtig...

    aber, ich komme nicht dahinter, ich habe folgende Funktion:

    BOOL CFileHelper::RemoveFileWithQuery( string strFileName)
    {
    
    	SHFILEOPSTRUCT sh; 
    	sh.hwnd					= NULL; 
    	sh.fFlags				= NULL;
    	sh.wFunc				= FO_DELETE;
    	sh.pFrom				= strFileName.c_str();
    	sh.pTo					= NULL;
    	sh.hNameMappings		= NULL;
    	sh.lpszProgressTitle	= NULL;
    
    	SHFileOperation (&sh);
    
    	return TRUE;
    
    }
    

    und folgenden Aufruf:

    std::string filename("C:\\FileInfo.cpp");
    CFileHelper::RemoveFileWithQuery(filename)
    

    und es funktioniert einfach nicht...
    wobei ein string doch standardmäßig mit \0 abgeschlossen ist...

    selbst wenn ich einen anhänge funktioniert es nicht...
    Was mache ich denn falsch?

    Wenn ich:

    sh.pFrom				= "C:\\FileInfo.cpp";
    

    direkt eintrage funktioniert alles wunderbar...

    Gruß
    Daniel



  • Ich kenn mich mit der Shellapi nicht besonders aus, aber ist ziemlich seltsam. Wird wahrscheinlich wirklich daran liegen, dass pFrom doppeltnull terminiert werden will.

    pFrom 
    Address of a buffer to specify one or more source file names. Multiple names must be null-separated. The list of names must be double null-terminated.
    

    Dann eben mit C-String Arrays...das API Interface ist ja auch bloss C.



  • häng mal mit append noch ein '\0' an.



  • Hi,

    danke für die Antworten.

    Habe es auch mit append probiert...
    Geht leider auch nicht...

    Hier mein komplettes Beispielprogramm:

    #include <windows.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <string>
    #include <shellapi.h>
    
    using namespace std; 
    
    int KillDirectory(string DirName);
    int SetIcon();
    
    int main(int argc, char* argv[])
    {
    
    	string dir	= "C:\\FileInfo.cpp";
    
    	dir.append("\0");
    	KillDirectory(dir);  
    	return 0;
    }
    
    int KillDirectory(string DirName)
    {
      SHFILEOPSTRUCT sh; 
      sh.hwnd = NULL; 
      sh.fFlags = NULL;
      sh.wFunc = FO_DELETE;               
      sh.pFrom = DirName.c_str();         
      sh.pTo = NULL;
      sh.hNameMappings = NULL;
      sh.lpszProgressTitle = NULL;
      return SHFileOperation (&sh);       
    }
    

    Mit CStrings kann ich leider nicht arbeiten da ich in meinem Projekt nicht mit der MFC arbeite..

    Und was ich ja wie gesagt nicht verstehe ist, daß es mit

    sh.pForm="C:\\FileInfo.cpp"
    

    funktioniert...

    Gruß
    Daniel



  • DanielG schrieb:

    Und was ich ja wie gesagt nicht verstehe ist, daß es mit

    sh.pForm="C:\\FileInfo.cpp"
    

    funktioniert...

    Ich tippe auf Glück - hinter dem String-Literal war (zufällig oder durch bestimmte Compiler-Optimierungen) der Wert 0 abgelegt, hinter dem von string reserviertem Speicher irgendwelcher Datenmüll.



  • Ja gut, mag sein, das es an Compileroptimierungen lag, aber wie bekomme ich dann einen Wert übergeben?

    Wie passe ich meinen String entsprechend an? Mit append geht es ja auch nicht...

    Ich mein, vielleicht geht es ja bei jemandem mit meinem Beispielprogramm? Vielleicht liegt es ja an meinen Compilereinstellungen das es nicht geht, wobei ich die Standardeinstellungen habe...

    Seltsam, seltsam



  • Und was ich ja wie gesagt nicht verstehe ist, daß es mit

    C/C++ Code:
    sh.pForm="C:\\FileInfo.cpp"
    C/C++ Code:
    sh.pForm="C:\\FileInfo.cpp"
    funktioniert...

    Wird evtl. daran liegen, dass nach pFrom pTo in der Struktur im Speicher liegt, und pTo ist ein 4 Byte langer Pointer der aus 0en besteht.
    Denke mal SHFileOperation liest in pTo rein, wenn es pFrom auslesen will.

    Aber nur reine Spekulation meinerseits, hab die Funktion noch nie benutzt.
    Gib pTo auch mal einen Wert, und schau obs dann immernoch funktioniert.

    WM_CHEERS



  • Ja funktioniert dann immernoch 😉



  • dir.append(1, '\0');
    


  • Super, danke, jetzt gehts 🙂

    Danke für alle Antworten.

    Gruß Daniel



  • So auf die Schnelle steig ich grad nicht durch.
    Warum funktioniert das jetzt?



  • pZy schrieb:

    So auf die Schnelle steig ich grad nicht durch.
    Warum funktioniert das jetzt?

    *Vermutung hat* Ich nehme an, weil string::append(char*) die Länge des angehängten Textes mit strlen() ermittelt - und das liefert für "\0" die Länge 0, weil es das erste Zeichen bereits als Stringende sieht. string::append(size_type,char) hängt dagegen genau die übergebene Anzahl von Zeichen an.


Log in to reply