我正在尝试在Visual Basic(2010)中创建MP3 ID3v1标签编辑器
我没有问题读取标签,但是,我似乎无法正确更新标签。
我使用FileStream打开文件,然后使用BinaryWriter。我想在“ TAG”标头之后找到,该标头距文件末尾125个字节。
第一个字段是标题字段,该字段长30个字符。
因此,在编写新标签之前,我将通过写入30个空格来清除它。
然后,我重新开始,并尝试写入新数据。但这最终会覆盖下一个字段中的数据。
Dim file As New System.IO.FileStream(songpath, IO.FileMode.Open)
Dim bw As New System.IO.StreamWriter(file)
file.Seek(-125, IO.SeekOrigin.End)
bw.Write(" ")
file.Seek(-125, IO.SeekOrigin.End)
bw.Write(data(0))
bw.Close()
file.Close()
这是结果的屏幕截图。我试图在标题字段中写“ Test”,然后写数据,然后重新打开文件,这就是我得到的。
答案 0 :(得分:1)
我将像这样设置file.Seek
属性,而不是使用.Position
:
Imports System.IO
Imports System.Text
Module Module1
Sub Main()
Dim f = "C:\temp\sample.MP3"
Dim newTitle = "This is a test."
Dim dataLen = 30
Dim titleData(dataLen - 1) As Byte
Dim newTitleBytes = Encoding.ASCII.GetBytes(newTitle)
Array.Copy(newTitleBytes, titleData, Math.Min(dataLen, newTitleBytes.Length))
Using str As New FileStream(f, FileMode.Open, FileAccess.Write, FileShare.None)
Dim titlePosition = str.Length - 125
str.Position = titlePosition
str.Write(titleData, 0, dataLen)
End Using
End Sub
End Module
标题的未使用部分应该是值为零的字节-创建数组时,其值将为您* *。然后,您可以用代表ASCII字符串的字节填充标题字节的开头。我怀疑如果您需要带重音符号的字符,那么可以不使用ISO-8859-1,但是不要依赖于此。
Using
的构造可确保即使出现问题也可以关闭文件。
*如果它是数字类型的数组,例如Byte或Integer等。