Problem mit rename()



  • Hi,

    hast Du schonmal versucht, die "Windowskonvention für Pfadnamen" zu verwenden ?
    Also statt slash ('/') backslash ('\') ?

    Wichtig hierbei: Weil ein einfacher backslash als "ecape-Character" interpretiert wird, braucht's ihn doppelt:

    filename ="C:\\TOOLS\\dat\\log_pvr\\fail";
    

    Gruß,

    Simon2.



  • Hallo, leider ändert sich auch bei der neuen Notation das Ergebnis nicht.
    Ich habe aus "Spaß" mal die Pfadangabe direkt in den rename-Aufruf eingetragen:

    int result = rename("C:\\Tools\\dat\\fail.txt","C:\\Tools\\dat\\log_pvr\\fail2.txt");
    

    So funktioniert es. Aber das ist leider nicht das, was ich benötige.Ich brauch eine Möglichkeit, um die Datei zu verschieben und mit einem eindeutigen Namen zu versehen.
    Vielleicht sollte ich die Datei einfach mit mit Hilfe eines Streams einlesen und "an der richtigen Stelle" wieder ausgeben.

    Gruß André



  • andrewz schrieb:

    Hallo, leider ändert sich auch bei der neuen Notation das Ergebnis nicht.
    Ich habe aus "Spaß" mal die Pfadangabe direkt in den rename-Aufruf eingetragen:

    int result = rename("C:\\Tools\\dat\\fail.txt","C:\\Tools\\dat\\log_pvr\\fail2.txt");
    

    So funktioniert es. ...

    Dann liegt es mit ziemlicher Sicherheit an dem "falschen slash" + Du machst noch einen anderen Fehler.

    Hast Du mal Das Ergebnis von

    filename ="C:\\TOOLS\\dat\\log_pvr\\fail";
        filename += time;
        filename +=".txt";
    

    ausgegeben ?

    Ach ja:

    const char* pNewFile= filename.c_str();
    

    Den braucht's nicht.
    Du kannst direkt schreiben:

    int result= rename("C:\\TOOLS\\dat\\fail.txt", filename.c_str());
    

    Gruß,

    Simon2.



  • @Simon2
    Windows akzeptiert auch die normalen Slashs (natürlich nicht doppelt) in Pfadangaben.



  • Ah ... stimmt !!

    Kann es sein, dass ctime() am Ende einen Zeilenumbruch anhängt ?

    Außerdem ist es ungünstig, eine Variable ("time") genauso zu nennen wie ein Funktion...

    mein Vorschlag:

    int main() {
        time_t rawtime;
        string fromFilename;
        string toFilename;
    
        /*reads the systemtime and use the systemtime
          to name the logfile with an unique name*/
        time (&rawtime);
        string timeStr = ctime(&rawtime);
    
        /*delete weekday,blanks,seconds and year*/
        timeStr.erase(0,4);
        for (int i=0;i<5;i++)
            timeStr.erase(3+(2*i),1);
        timeStr.erase(9); // Alles nach Pos 9 löschen
    
        fromFilename = "C:/tools/dat/fail.txt";
        toFilename ="C:/tools/dat/log_pvr/fail" + timeStr + ".txt";
    
        int result= rename(fromFilename.c_str(), toFilename.c_str());
        if (result!=0)
            perror("Fehler:");
       return 0;
    

    funktioniert jedenfalls bei mir...

    Gruß,

    Simon2.



  • Simon2 schrieb:

    Ah ... kann es sein, dass ctime() am Ende einen Zeilenumbruch anhängt ?

    So ist es:

    C++ Reference (cplusplus.com) schrieb:

    The string is followed by a new-line character ('\n') and the terminating null-character.

    Greetz



  • Braunstein schrieb:

    @Simon2
    Windows akzeptiert auch die normalen Slashs (natürlich nicht doppelt) in Pfadangaben.

    Hi,

    ist das eigentlich eine Eigenschaft von Windows ? Oder von einer bestimmten StdLib ? Oder ... ?

    Im Standard habe ich jedenfalls keine Aussage dazu gefunden, wie systemspezifische Pfad-/Filenamen zu handhaben seien.

    Gruß,

    Simon2.



  • @Simon2
    Herzlichen Dank für die Hilfe! Mit Deinem Vorschlag funktioniert es jetzt.

    Gruß André



  • Simon2 schrieb:

    Braunstein schrieb:

    @Simon2
    Windows akzeptiert auch die normalen Slashs (natürlich nicht doppelt) in Pfadangaben.

    Hi,

    ist das eigentlich eine Eigenschaft von Windows ? Oder von einer bestimmten StdLib ? Oder ... ?

    Im Standard habe ich jedenfalls keine Aussage dazu gefunden, wie systemspezifische Pfad-/Filenamen zu handhaben seien.

    Das funktioniert ganz allgemein in Windows. Im Explorer beispielsweise kannst du auch Pfade mit einem Slash ansteuern, du kannst auch Slash mit Backslashes mischen. Das ist ganz gut bei Headern, da kann man dann auch '/' statt '\' benutzen (oder ging das da schon immer?). Auf jedenfall hab ich nirgends Probleme mit der Verwendung von Slashes. Ich glaub das geht sogar in der cmd.exe (zumindest bei Vista) und in der PowerShell ja sowieso. Ich persönlich finds gut das es geht.

    Greetz



  • Vellas schrieb:

    ...
    Das funktioniert ganz allgemein in Windows. ...

    Aha !!!

    Vielen Dank. Eigentlich finde ich das auch gut (löst ein Plattformspezifikum teilweise) ... ein wenig skeptisch bin ich bei einem Randthema (das sich bei Std-C++ zum Glück nicht stellt): Wenn man die Möglichkeit hat/hätte, den Namen eines Files herauszubekommen, könnte das zu unerwartetem Verhalten kommen:

    string fileName("MyPath/MyFile.txt");
    ifstream in(fileName.c_str());
    
    if(myGetFileName(in) != fileName) {
        cout << "Huuups, wie kann das sein ?\n";
    }
    

    myGetFileName() kann es eigentlich nur falsch machen: Entweder gibt es den Namen windowspezifisch ('\') raus, dann knallt's bei obigem Code ... oder er gibt es Unix-spezifisch raus, dann kracht's bei "echten Windowsfilenamen"...
    Einzige Alternative: myGetFileName() gibt den Namen raus, mit dem das File geöffnet wurde ... aber da wird man wohl einiges an Fingerbrechen für veranstalten müssen (und da konsequent auch so Sachen wie rename() etc. unterzubringen, halte ich auch für sehr schwierig).

    Danke für die Info,

    Simon2.



  • Stimmt genau. Diese doppeldeutigkeit führt eigentlich mehr zu Problemen.
    Egal wie man es bevorzugt, als Programmierer in Windows muss man auf diese Gegebenheit halt irgendwie reagieren. Sei es nun den Pfad zu splitten und dann zu vergleichen oder im Programm alle Pfade in eine der beiden Möglichkeiten umwandeln.

    Mit boost::path kann man sich da aber schon etwas an Arbeit ersparen. Da kann man auch beides nutzen (wenn man native verwendet).

    Greetz



  • Genau deswegen nutze ich nur noch boost::filesystem::path und Konsorten. Ich mußte mal ein Programm auf einem japanischen Rechner zum laufen bringen. Dort nehmen sie das Yen-Zeichen als Slash. 🙂



  • Hi,

    da ich gerade mit einem Arbeitskollegen drüber diskutierte: Wie macht Jxxx (um mal das "böse Wort" zu vermeiden 😉 ) das eigentlich ?
    Seine Aussage war:
    - Da kann man immer auch mit '/' arbeiten und
    - man kann bei einem "File" auch dessen (Pfad)Namen abfragen.
    Allerdings wusste er auch nicht, ob man dann die '/'- oder die '\'-Variante oder etwas ganz Anderes bekommt.
    Weiß das hier zufällig jemand ?
    Bitte bitte bitte hier keinen Flame ... ich will nur wissen, wie die das machen.

    Gruß,

    Simon2.


Anmelden zum Antworten