Konvertierung: System::String <=> unmananaged String



  • OK, ich jetzt blicke ich entgültig durch die ganze convertierung nicht mehr durch

    bis jetzt habe ich:

    ...
    			shFile.wFunc = FO_DELETE;
    			String ^str = gcnew String(hFile.cFileName);
    			this->LBClean->Items->AddRange(gcnew cli::array< System::Object^  >(1) {str});
    			shFile.pFrom = str; //Error	error C2440: '=' : cannot convert from 'System::String ^' to 'LPCWSTR'
    			shFile.fFlags= FOF_ALLOWUNDO + FOF_NOCONFIRMATION;
    			SHFileOperation(&shFile);
    			...
    

    Wie bekomme ich das jetzt schon wieder in LPCWSTR convertiert?



  • -CH- schrieb:

    shFile.pFrom = str;

    Hier musst Du natürlich wieder den ursprünglichen String verwenden...

    shFile.pFrom = hFile.cFileName;
    

    Wobei ich gerade nicht weiss ob Du durch ein Verzeichnis durchgehen kannst (mittels FindFirstFile / Directory::Files) und gleichzeitig löschen kannst...



  • Das:

    shFile.pFrom = hFile.cFileName;
    

    hatte ich ja auch am Anfang (siehe erster Beitrag) und das geht auch zu compilieren nur, sagt mir das Programm dann immer:

    "Fehler beim Löschen der Datei oder des Ordners

    Die Datei kann nicht gelöscht werden: Die Quelldatei oder vom Qulldatenträger kann nicht gelesen werden."

    Wenn ich das mit absolutem Pfad schreibe funzt es:

    shFile.pFrom = L"C:\\*.txt";
    


  • Aber so soll es ja nicht sein dann müsste ich den Pfad ja nicht erst suchen lassen.

    Wie kann ich das hinbekommen das der das gescheit verarbeitet?



  • Dann musst Du halt noch den vollständigen Pfad dazufügen...
    Entweder in .NET mittels

    String ^str = "c:\\" + gcnew String(hFile.cFileName);
    

    und dann zuweisen via

    shFile.pFrom = StringConvT(str);
    

    Wobei Du das suchen gleich mit .NET machen könntest:

    System::IO::Directory::GetFiles("*.*");
    

    dann hättest Du das erste Problem nich...

    PS: Wenn Du eh nur native programmieren willst, dann solltest Du MFC verwenden!



  • Hierbei tritt immer noch der Fehler auf:
    "Fehler beim Löschen der Datei oder des Ordners

    Die Datei kann nicht gelöscht werden: Die Quelldatei oder vom Qulldatenträger kann nicht gelesen werden."

    ...
    	do
    	{
    		if (!( (hFile.cFileName[0]=='.') && ( (hFile.cFileName[1]=='.' && hFile.cFileName[2]==0) || hFile.cFileName[1]==0 ) ))
    		{
    			SHFILEOPSTRUCT shFile;
    			ZeroMemory(&shFile, sizeof(shFile));
    			shFile.wFunc = FO_DELETE;
    			String ^str = "C:\\" + gcnew String(hFile.cFileName);
    			this->LBClean->Items->AddRange(gcnew cli::array< System::Object^  >(1) {str});
    			shFile.pFrom = StringConvT(str);
    			shFile.fFlags= FOF_ALLOWUNDO + FOF_NOCONFIRMATION;
    			SHFileOperation(&shFile);
    		}
    	}
    	while (FindNextFile(fHandle,&hFile));
    	...
    

    Der gibt den Pfad ja richtig aus. Nur tritt immer der Fehler beim löschen auf.
    Wie gehabt funktioniert

    shFile.pFrom = L"C:\\x.txt";
    


  • Probier es doch zuerst mal direkt, ohne das suchen von Dateien... auch solltest Du die Flags mit "|" verknüpfen und nicht mit "+"...

    Auch solltest Du die Doku korrekt lesen und z.B. folgendes beachten:

    pFrom schrieb:

    Address of a buffer to specify one or more source file names. These names must be fully qualified paths. Standard Microsoft MS-DOS wild cards, such as "*", are permitted in the file-name position. Although this member is declared as a null-terminated string, it is used as a buffer to hold multiple file names. Each file name must be terminated by a single NULL character. An additional NULL character must be appended to the end of the final name to indicate the end of pFrom.

    PS: Es ist Zufall dass Dein anderer Code funktioniert...



  • Probier es doch zuerst mal direkt, ohne das suchen von Dateien...

    Das hatte ich auch schon vorher, die Dateien einfach so in den Papierkorb zu schieben. Aber ich schreibe die Dateien ja erst in dem Programm in die ListBox. Ausserdem hab ich auch Dateien, die nicht nur txt Dateien sind, die aus zB dem Windows Temp Ordner (und auch andere Ordner, die ich nicht alle hier gepostet habe) gelöscht werden sollen. Diese Dateien haben alle möglichen Endungen mit dem Problem das zB die index.dat nicht gelöscht werden kann. Daher würde ich Dateien gerne erst auslesen und dann bestimmt Dateien löschen.

    auch solltest Du die Flags mit "|" verknüpfen und nicht mit "+"...

    #geändert

    PS: Es ist Zufall dass Dein anderer Code funktioniert...

    Wie soll ich das denn sonst machen mit pFrom? Ich komme da nicht weiter... 😞



  • Dieser Thread wurde von Moderator/in Jochen Kalmbach aus dem Forum FAQ - C++/CLI in das Forum C++/CLI mit .NET verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.




Anmelden zum Antworten