ScanMP3Folder (Edit1.Text, ListBox1.Items); procedure ScanMP3Folder (const AFolder : string; AMP3List : TStrings); var ds : TDirectoryScanner; a : TAudioInfo; Descr : string; i : integer; begin ds := TDirectoryScanner.Create; a := TAudioInfo.Create; try ds.Recursive := True; ds.RegExprMask := '\.mp[23]'; ds.BuildFileList (AFolder); for i := 0 to ds.Count - 1 do begin a.LoadFromFile (ds.Item [i].Name); if a.ID3.Ok then Descr := a.ID3.Artist + ' - ' + a.ID3.Title else Descr := ExtractFileName (ds.Item [i].Name); Descr := Descr + Format (' (%d sec)', [a.MpegDuration div 1000]); AMP3List.Add (Descr); end; finally begin a.Free; ds.Free; end; end; end; 需要使用两个控件 http://anso.virtualave.net/delphi_stuff.htm#TAudioInfo(TAudioInfo) http://www.delphi3000.com/article.asp?id=1083(TDirectoryScanner)
不用控件的:~! unit MP_ID3_Unit;interfaceuses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons;type TID3Tag = record Tag: array[0..2] of Char; Songname: array[0..29] of Char; Artist: array[0..29] of Char; Album: array[0..29] of Char; Year: array[0..3] of Char; Comment: array[0..29] of Char; Genre: Byte; end;type TID3Info = class(TForm) Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; Edit4: TEdit; Edit5: TEdit; Name: TLabel; Artist: TLabel; Album: TLabel; Year: TLabel; Comment: TLabel; Remove: TBitBtn; Update: TBitBtn; OK: TBitBtn; procedure RemoveClick(Sender: TObject); procedure UpdateClick(Sender: TObject); procedure FormShow(Sender: TObject); procedure OKClick(Sender: TObject); private { Private declarations } public { Public declarations } function ReadID3Tag(FileName: string): TID3Tag; function WriteID3Tag(FileName: string; ID3InfoTag: TID3Tag): Boolean; function RemoveID3Tag(FileName: string): Boolean; function ID3TagsAreEqual(ID3Tag1, ID3Tag2: TID3Tag): Boolean; end; var ID3Info: TID3Info; id3tag:tid3tag;implementationuses Mp_Unit,MP_List_Unit;{$R *.DFM}procedure TID3Info.RemoveClick(Sender: TObject); begin if list.SongListView.SelCount>0 then if fileexists(MP3PF.ItemToFileName(list.SongListView.Selected)) then if removeid3tag(MP3PF.ItemToFileName(list.SongListView.Selected)) then begin showmessage('Remove ok!'); edit1.Text:=''; edit2.Text:=''; edit3.Text:=''; edit4.Text:=''; edit5.Text:=''; end else ShowMessage('Remove fail!'); end;function TID3Info.ID3TagsAreEqual(ID3Tag1, ID3Tag2: TID3Tag): Boolean; begin with ID3Tag1 do if (string(ID3Tag2.Tag) <> string(Tag)) or (string(ID3Tag2.Songname) <> string(SongName)) or (string(ID3Tag2.Artist) <> string(Artist)) or (string(ID3Tag2.Album) <> string(Album)) or (string(ID3Tag2.Year) <> string(Year)) or (string(ID3Tag2.Comment) <> string(Comment)) or (ID3Tag2.Genre <> Genre) then Result := False else Result := True; end;function TID3Info.ReadID3Tag(FileName: string): TID3Tag; var F: file; begin {$I-} AssignFile(F, FileName); Reset(F, 1); Seek(F, Filesize(F) - SizeOf(TID3Tag)); Result.Tag[1] := 'N'; BlockRead(F, Result, SizeOf(TID3Tag)); CloseFile(F); {$I+} end;function TID3Info.RemoveID3Tag(FileName: string): Boolean; var FileHandle: integer; attr:Integer; begin {$I-} attr:=FileGetAttr(FileName); FileSetAttr(FileName,faArchive); FileHandle := FileOpen(FileName, fmOpenReadWrite or fmShareDenyWrite); if FileHandle > 0 then if ID3Tag.Tag = 'TAG' then begin FileSeek(FileHandle, 0 - SizeOf(TID3Tag), 2); SetEndOfFile(FileHandle); end; FileClose(FileHandle); result := FileHandle <> 0; FileSetAttr(FileName,attr); {$I+} end;function TID3Info.WriteID3Tag(FileName: string; ID3InfoTag: TID3Tag): Boolean; var F: file; X: Integer; attr:Integer; begin {$I-} attr:=FileGetAttr(FileName); FileSetAttr(FileName,faArchive); AssignFile(F, FileName); Reset(F, 1); X:=0; if ReadID3Tag(FileName).Tag <> 'TAG' then Seek(F, FileSize(F)) else Seek(F, FileSize(F) - SizeOf(TID3Tag)); BlockWrite(F, ID3Tag, SizeOf(TID3Tag), X); Result := (X <> 0); CloseFile(F); FileSetAttr(FileName,attr); {$I+} end;procedure TID3Info.UpdateClick(Sender: TObject); var S: string; begin if list.SongListView.SelCount>0 then if list.SongListView.Items[list.SongListView.Selected.index].Caption<>'' then with ID3Tag do begin Tag := 'TAG'; S := edit1.text; if length(S) > 30 then setlength(S, 30); StrPCopy(Songname, S); S := edit2.text; if length(S) > 30 then setlength(S, 30); StrPCopy(Artist, S); S := edit3.text; if length(S) > 30 then setlength(S, 30); StrPCopy(Album, S); S := edit4.text; if length(S) > 4 then setlength(S, 4); StrPCopy(Year, S); S := edit5.text; if length(S) > 30 then setlength(S, 30); StrPCopy(Comment, S); if WriteID3Tag(MP3PF.ItemToFileName(list.SongListView.Selected), ID3Tag) then showmessage('Update OK!') else begin showmessage('Update fail!'); FormShow(nil); end; end; end;procedure TID3Info.FormShow(Sender: TObject); begin if list.SongListView.SelCount>0 then if fileexists(MP3PF.ItemToFileName(list.SongListView.Selected)) then ID3Tag:=ReadID3Tag(MP3PF.ItemToFileName(list.SongListView.Selected)); if (ID3Tag.Tag = 'TAG') and (trim(ID3Tag.songname) <> '') then begin //Display the Songname etc.. in the Label edit1.Text := Trim(ID3Tag.songname); edit2.Text := Trim(ID3Tag.Artist); edit3.Text := Trim(ID3Tag.Album); edit4.Text := Trim(ID3Tag.Year); edit5.Text := Trim(ID3Tag.Comment); end else begin edit1.Text := ExtractFileName(list.SongListView.Items[list.SongListView.Selected.index].Caption); edit2.Text := ''; edit3.Text := ''; edit4.Text := ''; edit5.Text := ''; end; end;procedure TID3Info.OKClick(Sender: TObject); begin close; end;end.
ScanMP3Folder (Edit1.Text, ListBox1.Items); procedure ScanMP3Folder (const AFolder : string; AMP3List : TStrings);
var
ds : TDirectoryScanner;
a : TAudioInfo;
Descr : string;
i : integer;
begin
ds := TDirectoryScanner.Create;
a := TAudioInfo.Create;
try
ds.Recursive := True;
ds.RegExprMask := '\.mp[23]';
ds.BuildFileList (AFolder);
for i := 0 to ds.Count - 1 do begin
a.LoadFromFile (ds.Item [i].Name);
if a.ID3.Ok
then Descr := a.ID3.Artist + ' - ' + a.ID3.Title
else Descr := ExtractFileName (ds.Item [i].Name);
Descr := Descr + Format (' (%d sec)', [a.MpegDuration div 1000]);
AMP3List.Add (Descr);
end;
finally begin
a.Free;
ds.Free;
end;
end;
end; 需要使用两个控件
http://anso.virtualave.net/delphi_stuff.htm#TAudioInfo(TAudioInfo)
http://www.delphi3000.com/article.asp?id=1083(TDirectoryScanner)
unit MP_ID3_Unit;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Buttons;type
TID3Tag = record
Tag: array[0..2] of Char;
Songname: array[0..29] of Char;
Artist: array[0..29] of Char;
Album: array[0..29] of Char;
Year: array[0..3] of Char;
Comment: array[0..29] of Char;
Genre: Byte;
end;type
TID3Info = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
Edit5: TEdit;
Name: TLabel;
Artist: TLabel;
Album: TLabel;
Year: TLabel;
Comment: TLabel;
Remove: TBitBtn;
Update: TBitBtn;
OK: TBitBtn;
procedure RemoveClick(Sender: TObject);
procedure UpdateClick(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure OKClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
function ReadID3Tag(FileName: string): TID3Tag;
function WriteID3Tag(FileName: string; ID3InfoTag: TID3Tag): Boolean;
function RemoveID3Tag(FileName: string): Boolean;
function ID3TagsAreEqual(ID3Tag1, ID3Tag2: TID3Tag): Boolean;
end;
var
ID3Info: TID3Info;
id3tag:tid3tag;implementationuses Mp_Unit,MP_List_Unit;{$R *.DFM}procedure TID3Info.RemoveClick(Sender: TObject);
begin
if list.SongListView.SelCount>0 then
if fileexists(MP3PF.ItemToFileName(list.SongListView.Selected)) then
if removeid3tag(MP3PF.ItemToFileName(list.SongListView.Selected)) then
begin
showmessage('Remove ok!');
edit1.Text:='';
edit2.Text:='';
edit3.Text:='';
edit4.Text:='';
edit5.Text:='';
end else ShowMessage('Remove fail!');
end;function TID3Info.ID3TagsAreEqual(ID3Tag1, ID3Tag2: TID3Tag): Boolean;
begin
with ID3Tag1 do
if (string(ID3Tag2.Tag) <> string(Tag)) or
(string(ID3Tag2.Songname) <> string(SongName)) or
(string(ID3Tag2.Artist) <> string(Artist)) or
(string(ID3Tag2.Album) <> string(Album)) or
(string(ID3Tag2.Year) <> string(Year)) or
(string(ID3Tag2.Comment) <> string(Comment)) or
(ID3Tag2.Genre <> Genre) then Result := False
else Result := True;
end;function TID3Info.ReadID3Tag(FileName: string): TID3Tag;
var
F: file;
begin
{$I-}
AssignFile(F, FileName);
Reset(F, 1);
Seek(F, Filesize(F) - SizeOf(TID3Tag));
Result.Tag[1] := 'N';
BlockRead(F, Result, SizeOf(TID3Tag));
CloseFile(F);
{$I+}
end;function TID3Info.RemoveID3Tag(FileName: string): Boolean;
var
FileHandle: integer;
attr:Integer;
begin
{$I-}
attr:=FileGetAttr(FileName);
FileSetAttr(FileName,faArchive);
FileHandle := FileOpen(FileName, fmOpenReadWrite or fmShareDenyWrite);
if FileHandle > 0 then
if ID3Tag.Tag = 'TAG' then
begin
FileSeek(FileHandle, 0 - SizeOf(TID3Tag), 2);
SetEndOfFile(FileHandle);
end;
FileClose(FileHandle);
result := FileHandle <> 0;
FileSetAttr(FileName,attr);
{$I+}
end;function TID3Info.WriteID3Tag(FileName: string; ID3InfoTag: TID3Tag): Boolean;
var
F: file;
X: Integer;
attr:Integer;
begin
{$I-}
attr:=FileGetAttr(FileName);
FileSetAttr(FileName,faArchive);
AssignFile(F, FileName);
Reset(F, 1);
X:=0;
if ReadID3Tag(FileName).Tag <> 'TAG' then Seek(F, FileSize(F))
else Seek(F, FileSize(F) - SizeOf(TID3Tag));
BlockWrite(F, ID3Tag, SizeOf(TID3Tag), X);
Result := (X <> 0);
CloseFile(F);
FileSetAttr(FileName,attr);
{$I+}
end;procedure TID3Info.UpdateClick(Sender: TObject);
var
S: string;
begin
if list.SongListView.SelCount>0 then
if list.SongListView.Items[list.SongListView.Selected.index].Caption<>'' then
with ID3Tag do
begin
Tag := 'TAG';
S := edit1.text;
if length(S) > 30 then setlength(S, 30);
StrPCopy(Songname, S);
S := edit2.text;
if length(S) > 30 then setlength(S, 30);
StrPCopy(Artist, S);
S := edit3.text;
if length(S) > 30 then setlength(S, 30);
StrPCopy(Album, S);
S := edit4.text;
if length(S) > 4 then setlength(S, 4);
StrPCopy(Year, S);
S := edit5.text;
if length(S) > 30 then setlength(S, 30);
StrPCopy(Comment, S);
if WriteID3Tag(MP3PF.ItemToFileName(list.SongListView.Selected), ID3Tag)
then showmessage('Update OK!')
else begin
showmessage('Update fail!');
FormShow(nil);
end;
end;
end;procedure TID3Info.FormShow(Sender: TObject);
begin
if list.SongListView.SelCount>0 then
if fileexists(MP3PF.ItemToFileName(list.SongListView.Selected)) then
ID3Tag:=ReadID3Tag(MP3PF.ItemToFileName(list.SongListView.Selected));
if (ID3Tag.Tag = 'TAG') and (trim(ID3Tag.songname) <> '') then
begin
//Display the Songname etc.. in the Label
edit1.Text := Trim(ID3Tag.songname);
edit2.Text := Trim(ID3Tag.Artist);
edit3.Text := Trim(ID3Tag.Album);
edit4.Text := Trim(ID3Tag.Year);
edit5.Text := Trim(ID3Tag.Comment);
end else
begin
edit1.Text := ExtractFileName(list.SongListView.Items[list.SongListView.Selected.index].Caption);
edit2.Text := '';
edit3.Text := '';
edit4.Text := '';
edit5.Text := '';
end;
end;procedure TID3Info.OKClick(Sender: TObject);
begin
close;
end;end.