// 02/04/2013 by aldentea : 一時ファイルの名前をAPIから取得。 // 05/17/2007 by aldente #region *ファイルに書き込む(WriteTo) /// <summary> /// 指定したファイルにタグを書き込みます. /// 既存のタグは上書きされます. /// </summary> /// <param name="dstFilename">書き込み先のファイル名.</param> public async Task WriteTo(string dstFilename) { if (!File.Exists(dstFilename)) { // どうしてくれよう? } bool v1_exists = await ID3v1Tag.Exists(dstFilename); //string tempFilename = "namunamu.mp3"; string tempFilename = Path.GetTempFileName(); using (var reader = new ID3Reader(dstFilename)) { bool exists = await Exists(reader); int old_tag_size = exists ? (await Generate(reader, true)).GetTotalSize() : 0; // 11/10/2008 by aldente // FileModeをCreateNewからCreateに変更. using (var writer = new FileStream(tempFilename, FileMode.Create, FileAccess.Write)) { ID3v1Tag v1Tag = new ID3v1Tag(); // タグを書き込む. await writer.WriteAsync(this.GetBytes(this.char_code, 0x100)); // 本体を書き込む. reader.Seek(old_tag_size, SeekOrigin.Begin); if (v1_exists) { var contents = await reader.ReadBytes((int)reader.Length - old_tag_size - 128); await writer.WriteAsync(contents); await v1Tag.Initialize(reader, false); } else { var contents = await reader.ReadBytes((int)reader.Length - old_tag_size); await writer.WriteAsync(contents); } // ID3v1タグを書き込む. v1Tag.Title = this.Title; v1Tag.Artist = this.Artist; byte[] buf = v1Tag.GetBytes(); await writer.WriteAsync(buf, 0, buf.Length); } } File.Delete(dstFilename); File.Move(tempFilename, dstFilename); }