Pfad umwandeln?



  • Das hat absolut keinen Sinn.



  • Hallo zusammen,

    ich verwende der struct "SHFILEOPSTRUCT". Er hat eine Variable "pFrom".
    Also:

    SHFILEOPSTRUCT foCopy;

    foCopy.pFrom = L"C:\\temp\*.zip\0";

    Das ist natürlich nicht mein Ziel, dass ich den Pfad hard codiere!

    Ich habe ein Array namens "szFullPathName" in diesem Array steht z. B. "C:\temp\".
    Wenn ich jetzt an der Variable "pFrom" nur C:\temp\ übergebe, wird es natürlich nicht
    funktionieren!

    Ich habe gedacht, dass da vielleicht schon eine Funktion existiert, dass sie an
    den "\" einen weitern "\" daran hängt!

    Ich werde jetzt selbst eine Funktion schreiben.

    Ich lege ein neues Array an wie z. B. validPath, dann kopiere ich zeichenweiser
    aus dem Array "szFullPathName" zu "validPath", bis ich im Array "szFullPathName" einen
    "\" bzw. '\' finde. Danach hänge ich einen weiteren "\" daran.



  • leonReif schrieb:

    Wenn ich jetzt an der Variable "pFrom" nur C:\temp\ übergebe, wird es natürlich nicht
    funktionieren!

    ...und wer hat Dir so einen Schwachsinn erzählt?

    Natürlich funktioniert das so!



  • Hi!

    Ich habe es getestet und es hat leider nicht funktioniert!

    Ich habe gerade das Problem gelöst. Es funktioniert.

    int pathIndex = 0;
            int validPathIndex = 0;
    
            for(pathIndex = 0; pathIndex < MAX_PATH; ++pathIndex)
            {
              if(path[pathIndex] != '\0')
              {
                if(path[pathIndex] !='\\')
                {
                  validPath[validPathIndex] = path[pathIndex];
                  validPathIndex++;
                }
                else
                {
                  validPath[validPathIndex] = path[pathIndex];
                  validPath[++validPathIndex] = '\\';
                  validPathIndex++;
                }
              }
              else
              {
                break;
              }
            }
    


  • Irgendwas scheint dann bei dir aber derbst kaputt zu sein!

    Wenn du ne Variable

    char blupp[500];
    strcpy(blupp,"c:\\test\\blupp\\*"); // Die doppelten Backslashes stellen eigentlich nur einen dar, \n z.B. wäre ein Zeilenumbruch, will man aber wirklich als text '\n' im String haben, müsste man hier \\n schreiben.
    

    ...hast du in der Variable blupp "c:\test\blupp\*" stehen
    Die SHFileOperation will bei .pFrom lediglich noch am Ende des Strings eine zusätzliche Nullterminierung haben...



  • Hallo,

    in der Variable "validPath" steht c:\\temp\*

    Die doppelten Backslashes stellen eigentlich nur einen dar, \n z.B. wäre ein >Zeilenumbruch, will man aber wirklich als text '\n' im String haben, müsste >man hier \\n schreiben.

    Danke für den Tipp, aber ich weiss es schon, dass '\' nur einen \ darstellt.

    Die SHFileOperation will bei .pFrom lediglich noch am Ende des Strings eine zusätzliche Nullterminierung haben...

    Ich habe am Anfang so probiert:

    .pFrom = L"C:\temp\test\\*.zip\0"
    

    Aber ich bekomme folgende Fehlermeldung:

    Die Datei kann nicht kopiert werden ... Die Quelle konnte nicht ...

    Seitdem ich aber einen zusätzlichen \ daran hänge, also in Form C:\\temp\\test\\ dann funktioniert es auch. Ich würde mal sagen, dass wir so stehen lassen.

    Danke für Deine Antwort 🙂



  • leonReif schrieb:

    Ich habe am Anfang so probiert:

    .pFrom = L"C:\temp\test\\*.zip\0"
    

    Aber ich bekomme folgende Fehlermeldung:

    Die Datei kann nicht kopiert werden ... Die Quelle konnte nicht ...

    Seitdem ich aber einen zusätzlichen \ daran hänge, also in Form C:\\temp\\test\\ dann funktioniert es auch. Ich würde mal sagen, dass wir so stehen lassen.

    Du hast eben nicht überall ein \\ 😉

    .pFrom = L"C:\\temp\\test\\*.zip\0"
    


  • Hi!

    Du hast eben nicht überall ein ...

    Ich weiss es. Ich sagte doch, das war am Anfang.

    Deshalb:

    int pathIndex = 0;
            int validPathIndex = 0;
    
            for(pathIndex = 0; pathIndex < MAX_PATH; ++pathIndex)
            {
              if(path[pathIndex] != '\0')
              {
                if(path[pathIndex] !='\\')
                {
                  validPath[validPathIndex] = path[pathIndex];
                  validPathIndex++;
                }
                else
                {
                  validPath[validPathIndex] = path[pathIndex];
                  validPath[++validPathIndex] = '\\';
                  validPathIndex++;
                }
              }
              else
              {
                break;
              }
            }
    

    Dann klappt’s auch mit dem Nachbarn 😉



  • Da kann man manchmal echt nur mit dem Kopf schütteln...

    Benutz weiterhin Deine Funktion, aber akzeptiere bitte die Tatsache, das sie unnütz ist, wenn man die Pfade gleich richtig angibt.





  • Hi!

    Sorry, Du hast vollkommen recht 😉

    Ich habe heute morgen gemerkt.

    Ich habe die alte Schleife durch dieser ersetzt:

    wchar_t szSourcePath[MAX_PATH]  = {0};
            char szPath[MAX_PATH] = {0};
    
            //Code ....
    
            strcat(szPath, "*.zip\0");
    
            for(int j = 0; j < MAX_PATH; ++j)
            { 
              if(szPath[j] != '\0')
              {
                szSourcePath[j] = (unsigned short)szPath[j];
              }
              else
              {
                szSourcePath[j] = '\0';
                break;
              }
            }
    




  • leonReif schrieb:

    dEUs schrieb:

    http://www.c-plusplus.net/forum/viewtopic.php?t=39458

    Gut erklärt 😃

    Ironisch gemeint?



  • Was hälst du eigentlich davon:

    wchar_t szSourcePath[MAX_PATH]  = "";
            char szPath[MAX_PATH] = "";
    
            //Code ....
    
            strcat(szPath, "*.zip");
            strcpy(szSourcePath,szPath, strlen(szPath));
    

    Die Schleife ist nämlich sinnlos.



  • dEUs schrieb:

    leonReif schrieb:

    dEUs schrieb:

    http://www.c-plusplus.net/forum/viewtopic.php?t=39458

    Gut erklärt 😃

    Ironisch gemeint?

    Ironisch gemeint?

    Nein auf gar keinen Fall. Ich bin direkt. Wenn mir etwas nicht passt, dann sage ich es ...

    😉



  • Hi!

    Mit

    strcpy
    

    funktioniert nicht, da die Funktion

    strncpy
    

    nur zwei Parameter aufnimmt. Aber es gibt die Funktion

    char *strncpy( char *strDest, const char *strSource, size_t count )
    

    Aber ich bekomme folgende Fehlermeldung bei kompilieren:

    error C2664: 'strncpy' : cannot convert parameter 1 from 'unsigned short [260]' to 'char *'
    

    Ich habe vorher nach eine Funktion gesucht, die man eine unsigned short Array in ein char Array oder umgekehrt konvertieren kann. Deshalb habe ich die Schleife geschreiben!



  • dann nimm strcpy und lass den letzten parameter weg. Und mach vor die ersten beiden ein (char*)



  • Hi!

    Ich habe es gerade probiert.

    Das Ergebnis voher mit der Schleife:

    C:\temp\10.zip

    Das Ergebnis nachher mit strcpy:

    strcpy((char*)szSourcePath, (char*)szPath);
    

    C\ep\.i

    Anscheind gehen Informationen verloren!



  • strcpy frißt Zeichen auf?

    Auch nicht schlecht... da Du sicherlich der erste Entdecker dieses Verhaltens bist, darfst Du diesem Phänomen einen Namen geben.

    ...könnte aber auch sein das Du da schlichtweg überhaupt nicht weißt, was Du da tust und daher einen jenes Verhalten hervorrufende Fehler selber reingebaut hast.

    Ist alles möglich... 😉



  • Ich denke, du brauchst eher sowas wie WideCharToMultiByte


Anmelden zum Antworten