예제 #1
0
        // 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);
        }