Hallo Besucher, der Thread wurde 4,5k mal aufgerufen und enthält 8 Antworten

letzter Beitrag von Tale-X am

C++ Dateinamen auslesen und ändern

  • Hallo,
    vor einiger Zeit habe ich hier schon mal eine Batch mit eurer Hilfe geschrieben.
    ich will ein Virenscannerupdate auf einem USB-Stick weitergeben. Gleichzeitig läuft ein Erfassungsprogramm ab... Dazu muss der Benutzer dann nur auf die Exe klicken und alles soll automatisch ablaufen.
    Ich will aber nicht jedes mal die Virenscanner 80xxxdat.exe umbenennen, wenn ich den Stick wieder rausgebe.
    Also wollte ich in c++ etwas schreiben, was den aktuellen Namen der Virenscanner Update Datei umbenennt.


    Ich habe jetzt gerade erst mit c++ angefangen und habe schon mal einen Taschenrechner gebastelt und so einige kleine Programme. (http://orangeonblack.de/2014/c-crashkurs) Weiter bin ich noch nicht.


    Also auf diesem Stick befinden sich folgende Dateien:


    8058xdat.exe
    update.exe (die zu schreibende Datei)
    erfassung.exe
    \unterordner



    Die Datei 8058xdat.exe (bei welcher sich der Name ja täglich ändert) soll in z.B. xdat.exe umbenannt werden.
    Ich habe irgendwie noch keine Möglichkeit gefunden die Datei mit z.B. *xdat.exe oder %-Zeichen irgendwie zu finden und umzubenennen.


    Kann mir da jemand helfen??


    Vielen Dank schon mal.

  • Wenn Du mit MS Boardmitteln unterwegs bist, hilft die CFileFind-Klasse: https://msdn.microsoft.com/de-de/library/f33e1618.aspx


    Oder mal hier etwas querlesen: http://stackoverflow.com/quest…-a-directory-using-c-or-c

  • Wenn du unter Windows programmierst, hast du die Funktionen _splitpath und _makepath zum bearbeiten von Pfaden und Dateinamen.


    Das funktioniert so:



    Für das Traversieren von Verzeichnissen sind die Windows-Funktionen FindFirstFile, FindNextFile und FindClose zu benutzen. Die benötigen dann noch eine lokale Struktur vom Typ WIN32_FIND_DATA.

  • Ich habe irgendwie noch keine Möglichkeit gefunden die Datei mit z.B. *xdat.exe oder %-Zeichen irgendwie zu finden und umzubenennen.

    Mein C++ ist etwas eingerostet, aber wie Tale-X schon auf MSDN referenziert hat und du es richtig erkannt hast: Du brauchst eine Filesuche-Funktion, welche es Dir erlaubt, sog. "Wildcards" zu benutzern.
    Damit sind die Datei/Directory-Namen Ersatzzeichen wie * oder ? gemeint.


    Bei dir wäre das sowas: 8058*dat.exe


    Ich weiss nicht, ob das von Tale-X verlinkte CFileFind::FindFile sowas erlaubt (probier es mal aus, falls es geht, würde ich auch dies verwenden statt Win32 API), da steht nichts Konkretes auf der Page, aber die Win32 API/Kernal FindFirstFile Funktion kann das und findet die erste Datei, welche Deinem Wildcard-Schema entspricht.
    Damit hast Du dann den Handle und den ersten Filenamen im FindFirstFile.cFilename und kannst es mit einer Rename Funktion, z.B. CFile::Rename umbenamsen.


    <Edit>Ich sehe gerade, dass die CFileFind::FindFile Funktion aus der üblen MFC Ecke kommt. :bgdev@Tale-X: Funktioniert sowas auch in einer Consolen-App?
    Sonst könnte man hier auch die Win32 API Funktion MoveFile verwenden.

  • So fast alles was nach Schema C<Klassenname> benannt ist, kommt aus der MFC-Ecke. Man kann MFC in ne Konsolenanwendung verwenden, gibt ja auch einiges an nützlichen Komponenten da drin :bgdev Wenn man aber bis jetzt ohne MFC auskommt, sollte es wegen der Dateisuche nicht extra eingebunden werden. Einige der MFC-Elemente sind auch nur hübsch verpackte Systemfunktionen... Da ist FindFirstFile etc. besser geeignet(*)


    (*) Letztendlich steht und fällt es mit den vorhandenen/verfügbaren Libraries - c++ bietet von Haus aus keine Funktionen um Verzeichnisse zu durchforsten. Deshalb gibt es eigentlich viele Wege, Verzeichnisse zu traversieren - je nachdem, welche Library man zur Verfügung hat. Gibt da (u. a.) noch die boost-library (die auch nette Features wie Regular Expression hat) und qt (plattformübergreifender Gegenpol zu MFC). Alternativ kann man noch schauen, ob man auf C zurückfallen kann - ich hab da Beispiele mit fopen und readdir gesehen, aber ich befürchte, die sind nur für die Linux/Unix-Welt gedacht... Naja, Versuch macht kluch ;)

  • Weil wir das gerade in der SB diskutiert haben: Warum machst du das nicht einfach in einer Batchdatei?


    Oder geht es Dir darum, in C++ das Handling mit Files zu lernen?

  • Warum kompliziert wenn es auch Einfach geht:

    Die Datei 8058xdat.exe (bei welcher sich der Name ja täglich ändert) soll in z.B. xdat.exe umbenannt werden.
    Ich habe irgendwie noch keine Möglichkeit gefunden die Datei mit z.B. *xdat.exe oder %-Zeichen irgendwie zu finden und umzubenennen.

    Einfach ein batchfile mit 1 Befehl anlegen und gut is:
    move ????xdat.exe xdat.exe


    Das klappt hervorragend, wenn Du jeweils nur 1 file als Quellfile im Ordner liegen hast.
    Da es ja so aussieht, dass es ein download-file ist was umbenannt werden soll, kannst Du auch vor dem Download folgendes vorausschicken, was die Ganze Sache dann halbwegs zuverlässig macht:


    del /F /Q ????xdat.exe


  • Ich kann LuxOculus verstehen - klar ist's in batch übersichtlicher, leichter veränderbar etc. Aber er will c++ lernen und dies dazu als Übung nehmen.


    Wobei es besser ist, mit einem guten Lehrbuch (Vorschläge?) c++ zu erlernen. C++ ist sehr mächtig - da ist's sinnvoll, gleich mit guter Methodik einzusteigen. Sonst schreibt man Basic- oder Pascalprogramme mit C++-Syntax ;)