Dateien verschieben und umbenennen

james223

Mitglied
Hallo zusammen...

Ich würde gerne ein Programm in C oder C++ schreiben, womit ich Dateien,
nach besonderen kriterien, verscheiben und umbenennen kann...

Ich will damit ein bisschen meine iTunes Mediathek sortieren.

In einem Ordner in: "C:\Users\Tim\Desktop\Music" befindet sich Musik, die ich gerne nach
"C:\Users\Tim\Music" verschieben möchte.

Aber ich möchte nicht jede Datei verschieben, sondern nur die, die ich nocht nicht in diesem
Ordener sind (manche sind doppelt auf dem Computer vorhanden)

Ich möchte aber auch noch, das dieses Programm gerade den Pfad ändert, den iTunes gespeichert hat,
wo es auf die musik zugreiffen kann.


Den Pfad der iTunes verwendet ist in einer Datei namens "iTunes Music Library.xml" gespeichert, und sieht etwa so aus:
Diese Datei ist ein Log-File von iTunes, die die Daten von einer Datei speichert, oder so...^^
__________________________________________________________________________

<key>802</key>
<dict>
1 <key>Track ID</key><integer>802</integer>
2 <key>Name</key><string>Sugar Baby Love</string>
3 <key>Artist</key><string>Rubettes</string>
4 <key>Kind</key><string>MPEG-Audiodatei</string>
5 <key>Size</key><integer>5041890</integer>
6 <key>Total Time</key><integer>210076</integer>
7 <key>Date Modified</key><date>2008-10-26T14:39:52Z</date>
8 <key>Date Added</key><date>2009-01-07T18:17:09Z</date>
9 <key>Bit Rate</key><integer>192</integer>
10 <key>Sample Rate</key><integer>44100</integer>
11 <key>Play Count</key><integer>40</integer>
12 <key>Play Date</key><integer>3334436304</integer>
13 <key>Play Date UTC</key><date>2009-08-29T22:18:24Z</date>
14 <key>Skip Count</key><integer>1</integer>
15 <key>Skip Date</key><date>2009-03-01T01:37:58Z</date>
16 <key>Rating</key><integer>100</integer>
17 <key>Album Rating</key><integer>100</integer>
18 <key>Album Rating Computed</key><true/>
19 <key>Persistent ID</key><string>A72B6EAE6EB5614F</string>
20 <key>Track Type</key><string>File</string>
21 <key>Location</key><string>file://localhost/C:/Users/Tim/Desktop/Music/F00/PEDD.mp3</string>
22 <key>File Folder Count</key><integer>-1</integer>
23 <key>Library Folder Count</key><integer>-1</integer>
</dict>

__________________________________________________________________________



Das sind die Daten von einem einzelnen Musik stück, und wie ihr seht, ist es am falschen Ort gespeichert (Zeile 21),
es soll nach "C:\Users\Tim\Music" und es soll noch gerade den Dateiname ändern, den soll es von Zeile 2 und 3 übernehmen.

Und dann sollte es in dieser Datei zum schluss noch in Zeile 21 den richtigen Pfad einfügen.


Ich hoffe ihr versteht was ich meine, und hoffe ihr könnt mir helfen...
 
Das Problem ist, dass du die Einträge in der XML-Datei zwar ändern kannst, dies aber kein Bezug auf die Originaldateien haben. Im schlimmsten Fall verursachst du nur einen Fehler.

Um Änderungen gezielt vorzunehmen, müsstest du direkt die ID3-Tags der Originale bearbeiten.
 

M.Ä.N.E

Stammgast
Also wenn du nur deine Musik in ein anderes verzeichniss verschieben möchtest kannst du dazu ja Windows benutzen, dass merkt wenn Daten doppelt sind. Und in ITunes löschst du alle Titel und Importierst sie dann vom neuen Verzeichniss. Problem solved!

Fals nicht:
Wie viele Kentnisse hast du C/C++?
 

james223

Mitglied
das problem ist das die nicht alle gleich heissen...

kentnisse in c/c++ habe ich nicht viel, aber es geht ja darum ein bisschen etwas zu lernen...

also es müssta ja nicht unbedingt c oder c++ sein, es könten auch befehle von windows in einem batch-file sein...


ein beispiel wie es ungefähr ausehen sollte:

________________________________________

include: c:\users\tim\music\itunes\"iTunes Music Library.xml"

read: iTunes Music Library.xml

if{
location==c:\users\tim\desktop\music //zeile 21 unten
copy (den song wo es den pfad überprüft) to "c:\users\tim\music"
rename (den song den es gerade überprüft hat) [Artist] - [Name] //zeile 2 und 3
}

________________________________________


jeder song hat in dieser textdatei (iTunes Music Library.xml) so einen abschnitt,

<key>802</key>
<dict>
1 <key>Track ID</key><integer>802</integer>
2 <key>Name</key><string>Sugar Baby Love</string>
3 <key>Artist</key><string>Rubettes</string>
4 <key>Kind</key><string>MPEG-Audiodatei</string>
5 <key>Size</key><integer>5041890</integer>
6 <key>Total Time</key><integer>210076</integer>
7 <key>Date Modified</key><date>2008-10-26T14:39:52Z</date>
8 <key>Date Added</key><date>2009-01-07T18:17:09Z</date>
9 <key>Bit Rate</key><integer>192</integer>
10 <key>Sample Rate</key><integer>44100</integer>
11 <key>Play Count</key><integer>40</integer>
12 <key>Play Date</key><integer>3334436304</integer>
13 <key>Play Date UTC</key><date>2009-08-29T22:18:24Z</date>
14 <key>Skip Count</key><integer>1</integer>
15 <key>Skip Date</key><date>2009-03-01T01:37:58Z</date>
16 <key>Rating</key><integer>100</integer>
17 <key>Album Rating</key><integer>100</integer>
18 <key>Album Rating Computed</key><true/>
19 <key>Persistent ID</key><string>A72B6EAE6EB5614F</string>
20 <key>Track Type</key><string>File</string>
21 <key>Location</key><string>file://localhost/C:/Users/Tim/Desktop/Music/F00/PEDD.mp3</string>
22 <key>File Folder Count</key><integer>-1</integer>
23 <key>Library Folder Count</key><integer>-1</integer>
</dict>

_________

Ich bräuchte einfach die richtigen Befehle dazu...
 
Zuletzt bearbeitet:

M.Ä.N.E

Stammgast
Also als erstes musst du die Datei öfnnen mit fopen();

Beispiel
Code:
#include <stdio.h>
#include <stdlib.h>
int main(void) {
   FILE *datei;
   datei = fopen("c:\\users\\tim\\music\\itunes\\iTunes\ Music\ Library.xml", "r+");
   if(NULL == datei) {
      printf("Fehler!);
      getchar();
      return EXIT_FAILURE;
   }

   // Hier kommt nun deine Funktionen
   getchar();
   return EXIT_SUCCESS;
}

Nun kannst du Block für Block(Track) in den Arbeitsspeicher lesen und von da die werte für
Interpret, Titel und pfad raussuchen. Bin hier mir nicht ganz sicher du kannst dan mit fscanf(); in ein struktur schreiben die wie die Böcke sind. Oder du gehst die Datei durch mit fgets(); Zeile für Zeile und speicherst name und Interpret fals sie so vorkommen Du kannst die strings die fgets einliest mit sscanf(); auswerten und überprfüfen ob das was zwischen den <key>s steht name Interpret oder Pfad ist. dann wenn du beim Pfad bist kannst du ihn überprüfen und dann die datei unbenen mit rename(); und mit system("copy...") Wie batch.
dann musst du nur noch den Eintrag in der iTunes Datei ändern. Das wird ein bischen kompliziert Weiss noch nicht genau wie man das am besten macht.(Vielleicht sollte man die ganze Datei in ein Array von strukuren packen und dann die Datei ganz neu schreiben ist aber riskant du solltes eh am Anfang nicht an der Orginal Datei arbeiten)
Ich kann jetzt nicht alle genanten Funktionen erklären ->Google

P.S Code ist in C, würde dir empfehlen sie mal zu lernen auch wenn viele gleich mit c++ loslegen möchten.
C von A-Z

Ach ja und fals etwas nicht stimmen sollte das ich geschrieben habe, dann entschuldige ich mich dafür, aber es sollte schon stimmen.
 

Google

Stammgast
Gegenfrage:

Wenn du einfach alles verschiebst und bei den doppelten nicht verschieben wählst, dann geht das ja nicht weil nicht alle Lieder gleich heissen.

Jetzt willst du ein Programm schreiben, welches 2 Lieder als identisch erkennt, wenn die Dateinamen nicht identisch sind?

Nun, rein theoretisch ist das schon möglich, jedoch bezweifle ich das sich so etwas so auf die schnelle realisieren lässt..

Du könntest Hash Werte beider Dateien erzeugen und vergleichen, dann müsste es sich aber um die gleiche Datei handeln, nur der Name eben nicht, doch ich nehme an dass bei vielen Titeln nicht einfach nur der Name anders ist.

In diesem Fall müsstest du die Tonspur beider Dateien analysieren und vergleichen, was für erfahrene und gute Programmierer sicher möglich ist, für einen Hobbyprogrammierer wohl eher nicht..

Für die Aufgaben die du schilderst, gibt es bereits Freewareprogramme die das alles können..

Gruss
 

M.Ä.N.E

Stammgast
Ich glaube er wollte was lernen, ist schon komisch immer wenn jemand etwas programiernen will
Kommt immer einer(nicht persönlich nehmen).
 

james223

Mitglied
nein, ich will nicht das es die lieder miteinander vergleicht, ich will das es lieder - die in einem ordner sind, die auch in einem anderen ordner sind, aber nicht gleich heissen, aber von iTunes nicht verwendet werden, in einen ordner verschiebt und umbenennt, und auch noch gerade den pfad im log-file von iTunes ändert... ist jetzt ziemlich kompliziert...
 
Oben