| Autor |
Beitrag |
Criz
      
Beiträge: 18
Win XP Prof.
D6 Ent, D7 Ent
|
Verfasst: Do 11.09.03 23:18
Hi,
ich möchte gerne mit folgendem Code den ID3-Tag einer MP3 auslesen.
Leider wird der Vorgang mir der Meldung 'E/A-Fehler 32' abgebrochen.
Ich habe den Verdacht, dass es an meinem Delphi liegt, denn den Code
habe ich von jemand anderem übernommen.
Was soll ich tun?
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| type TID3Tag = record ID: string[3]; Title: string[30]; Artist: string[30]; Album: string[30]; Year: string[4]; Comment: string[30]; Genre: byte; end; |
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| procedure readID3(fname: string); var buff: array[1..128] of char; f: file; begin AssignFile(f, fname); Reset(f, 1); Seek(f, FileSize(f) - 128); BlockRead(f, buff, SizeOf(buff)); CloseFile(f); with ID3Tag do begin ID := copy(buff, 1, 3); Title := copy(buff, 4, 30); Artist := copy(buff, 34, 30); Album := copy(buff, 64, 30); Year := copy(buff, 94, 4); Comment := copy(buff, 98, 30); Genre := ord(buff[128]); end; end; |
|
|
Brueggendiek
      
Beiträge: 304
Win 98, Win98SE, Win XP Home
D5 Std
|
Verfasst: Fr 12.09.03 00:14
Hallo Criz!
Das Problem kann ich nicht nachvollziehen - und 32 ist auch kein bei D5 Std bekannter Fehlercode.
Es gibt zwei mögliche Ursachen für sowas:
1.: Die Datei existiert gar nicht (nicht lachen, vielleicht ist ja der Dateinamen irgendwo verfälscht worden oder die Dateierweiterung fehlt)!
2.: ein anderes Programm hat die betreffende Datei zum Schreiben geöffnet bzw. sperrt zum Lesen geöffnete Dateien für andere Programme - die klassischen Dateiroutinen sind da nicht sehr flexibel. Die stammen nämlich noch von MS-DOS - und da lief nur ein Programm.
Nebenbei: Du solltest über Compilerschalter {$I-} die Fehlerbehandlung selber übernehmen und Ioresult abfragen. Außerdem könnte eine Prüfung der Dateigröße nicht schaden - wenn Du eine Mini-Datei angibst, knallt es bei Deinem Seek nur einmal kurz, aber laut!
Nicht sagen, daß Du ja nur MP3-Dateien auswählen kannst - woher weißt Du denn, ob die Datei "DATEN.MP3" nicht von irgendeinem Programm als Parameterdatei angelegt wurde, weil der Programmierer nix von Musikdateien im MP3-Format wußte? Schließlich kann ich meine Dateien nennen, wie ich will! Wenn dann die Datei nur 100 Bytes hat - RRRUUUMMMSSS!
Gruß
Dietmar Brüggendiek
|
|
UC-Chewie
      
Beiträge: 531
WinXP
D5 Ent
|
Verfasst: Fr 12.09.03 00:32
| Brueggendiek hat folgendes geschrieben: | | ...und 32 ist auch kein bei D5 Std bekannter Fehlercode. |
Ob Delphi ihn kennt, spielt keine Rolle, es ist ja ein Win32-Errorcode. Genauer gesagt bedeutet er:
| Zitat: | | ERROR_SHARING_VIOLATION: The process cannot access the file because it is being used by another process. |
Also deine zweite mögliche Ursache.
Solange ein Programm die Datei mit exklusivem Lesezugriff geöffnet hat, wirst du nicht darran kommen, das hat AFAIK nichts damit zu tun, ob die Datei per WinAPI oder mit den alten Pascal-Routinen geöffnet wird.
_________________ Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
|
|
Criz 
      
Beiträge: 18
Win XP Prof.
D6 Ent, D7 Ent
|
Verfasst: Fr 12.09.03 00:40
Hi,
vielen Dank für eure ausführlichen Antworten!
| Brueggendiek hat folgendes geschrieben: |
2.: ein anderes Programm hat die betreffende Datei zum Schreiben geöffnet bzw. sperrt zum Lesen geöffnete Dateien für andere Programme - die klassischen Dateiroutinen sind da nicht sehr flexibel. Die stammen nämlich noch von MS-DOS - und da lief nur ein Programm. |
Ich hatte vor Aufruf der Prozedur mit dem TMediaPlayer die Datei geöffnet. Das habe ich jetzt geändert. Jetzt klappt alles prima!
|
|
Gausi
      
Beiträge: 8554
Erhaltene Danke: 481
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Fr 12.09.03 11:02
Hallo,
gehört nicht mehr zum eigentlichen Problem, aber vielleicht ist folgendes noch für dich interessant:
Diese Funktion liest den id3v1 Tag aus. Es gibt aber auch den (ebenfalls sehr einfachen) id3v1.1Tag. Einziger Unterschied:
Das Comment-Feld ist nur 28 Bytes lang. In diesem Fall wird buff[127] zur Speicherung der Track-Nr verwendet. Ob es ein v1 ist oder v1.1 Tag sein könnte, erkennt man, wenn man buff[126] auf 0 überprüft.
Wenn der Wert 0 ist, kann (muss aber nicht) die Track-Nr gespeichert sein, ansonsten nicht.
Ist kaum ein Mehraufwand, vielleicht baust du es ja noch ein 
_________________ We are, we were and will not be.
|
|
Criz 
      
Beiträge: 18
Win XP Prof.
D6 Ent, D7 Ent
|
Verfasst: Fr 12.09.03 16:32
Hallo,
danke für den Tipp. Werde ich gleich machen. 
|
|
|