Jag försöker göra ett program som kan ändra och lägga till ID3 information för en mp3 fil. Jag har lyckats fått den att kunna ändra på informationen men inte att lägga till. Värt att veta är att ID3 alltid ligger i slutet av filen och börjar med "TAG". Löste det själv, dock tack vare en annan tråd i forumet som tipsade mig om att använda stingbuilderFilhantering, ID3
Felmedelandet jag får är att index ligger utanför arrayen.
public void ChangeID3(string path, getID3 myID3)
{
byte[] buffer = new byte[1024];
int pos = 0;
try
{
using (FileStream fs = File.OpenRead("C:\\test.txt"))
{
byte[] b = new byte[1024];
while (fs.Read(b,0,b.Length) > 0)
{
for(int i = 0; i < b.Length; i++)
{
pos = i;
//Kollar om "TAG" är i slutet av filen isf finns id3 info
if(b[i] == 84 && b[i + 1] == 65 && b[i + 2] == 71)
{
buffer = ReturnBuffer(buffer, i, myID3);
i = b.Length;
}
else if (i == b.Length - 1)
{
//Här genereras felet.
buffer[i] = b[i];
buffer = ReturnBuffer(buffer, i, myID3);
}
else
{
buffer[i] = b[i];
}
}
}
fs.Close();
}
using (FileStream fs = File.OpenWrite("C:\\test.txt"))
{
for(int i = 0; i < buffer.Length; i++)
{
if(buffer[i] != Convert.ToByte('|') && buffer[i+1] != Convert.ToByte('|') && buffer[i+2] != Convert.ToByte('|'))
fs.WriteByte(buffer[i]);
else
{
fs.SetLength(Convert.ToInt64(i));
i = buffer.Length;
}
}
fs.Close();
}
}
catch (Exception e)
{
MessageBox.Show(e.ToString());
}
}
private byte[] ReturnBuffer(byte[] buffer, int pos, getID3 myID3)
{
char[] charArray;
buffer[pos] = Convert.ToByte('T');
pos++;
buffer[pos] = Convert.ToByte('A');
pos++;
buffer[pos] = Convert.ToByte('G');
pos++;
charArray = myID3.Title.ToCharArray();
for(int i = 0; i < charArray.Length; i++)
{
if(charArray[i] != 0)
buffer[pos] = Convert.ToByte(charArray[i]);
pos++;
}
for(int i = 0; i < 30-charArray.Length; i++)
{
buffer[pos] = 0;
pos++;
}
charArray = myID3.Artist.ToCharArray();
for(int i = 0; i < charArray.Length; i++)
{
if(charArray[i] != 0)
buffer[pos] = Convert.ToByte(charArray[i]);
pos++;
}
for(int i = 0; i < 30-charArray.Length; i++)
{
buffer[pos] = 0;
pos++;
}
charArray = myID3.Album.ToCharArray();
for(int i = 0; i < charArray.Length; i++)
{
if(charArray[i] != 0)
buffer[pos] = Convert.ToByte(charArray[i]);
pos++;
}
for(int i = 0; i < 30-charArray.Length; i++)
{
buffer[pos] = 0;
pos++;
}
charArray = myID3.Year.ToCharArray();
for(int i = 0; i < charArray.Length; i++)
{
if(charArray[i] != 0)
buffer[pos] = Convert.ToByte(charArray[i]);
pos++;
}
for(int i = 0; i < 4-charArray.Length; i++)
{
buffer[pos] = 0;
pos++;
}
charArray = myID3.Comment.ToCharArray();
for(int i = 0; i < charArray.Length; i++)
{
if(charArray[i] != 0)
buffer[pos] = Convert.ToByte(charArray[i]);
pos++;
}
for(int i = 0; i < 30-charArray.Length; i++)
{
buffer[pos] = 0;
pos++;
}
charArray = myID3.Track.ToCharArray();
for(int i = 0; i < charArray.Length; i++)
{
if(charArray[i] != 0)
buffer[pos] = Convert.ToByte(charArray[i]);
pos++;
}
for(int i = 0; i < 2-charArray.Length; i++)
{
buffer[pos] = 0;
pos++;
}
buffer[pos] = Convert.ToByte('|');
pos++;
buffer[pos] = Convert.ToByte('|');
pos++;
buffer[pos] = Convert.ToByte('|');
pos++;
return buffer;
}
Sv: Filhantering, ID3
public void ChangeID3(string path, getID3 myID3)
{
StringBuilder myString = new StringBuilder();
try
{
using (FileStream fs = File.OpenRead(path))
{
byte[] b = new byte[1024];
while (fs.Read(b,0,b.Length) > 0)
{
for(int i = 0; i < b.Length; i++)
{
//Kollar om "TAG" är i slutet av filen isf finns id3 info
if(b[i] == 84 && b[i + 1] == 65 && b[i + 2] == 71)
i = b.Length;
else
myString.Append(Convert.ToChar(b[i]));
}
myString.Append(ReturnBuffer(myID3));
}
fs.Close();
}
using (FileStream fs = File.OpenWrite(path))
{
for(int i = 0; i < myString.Length; i++)
{
if(myString[i] != Convert.ToByte('|') && myString[i+1] != Convert.ToByte('|') && myString[i+2] != Convert.ToByte('|'))
fs.WriteByte(Convert.ToByte(myString[i]));
else
{
fs.SetLength(Convert.ToInt64(i));
i = myString.Length;
}
}
fs.Close();
}
}
catch (Exception e)
{
MessageBox.Show(e.ToString());
}
}
private StringBuilder ReturnBuffer(getID3 myID3)
{
StringBuilder myString = new StringBuilder();
myString.Append("TAG");
//Title
for(int i = 0; i < myID3.Title.Length; i++)
{
if(myID3.Title[i] != 0)
myString.Append(myID3.Title[i]);
}
for(int i = 0; i < 30-myID3.Title.Length; i++)
{
myString.Append(Convert.ToChar(Convert.ToByte(0)));
}
//Artist
for(int i = 0; i < myID3.Artist.Length; i++)
{
if(myID3.Artist[i] != 0)
myString.Append(myID3.Artist[i]);
}
for(int i = 0; i < 30-myID3.Artist.Length; i++)
{
myString.Append(Convert.ToChar(Convert.ToByte(0)));
}
//Album
for(int i = 0; i < myID3.Album.Length; i++)
{
if(myID3.Album[i] != 0)
myString.Append(myID3.Album[i]);
}
for(int i = 0; i < 30-myID3.Album.Length; i++)
{
myString.Append(Convert.ToChar(Convert.ToByte(0)));
}
//Year
for(int i = 0; i < myID3.Year.Length; i++)
{
if(myID3.Year[i] != 0)
myString.Append(myID3.Year[i]);
}
for(int i = 0; i < 4-myID3.Year.Length; i++)
{
myString.Append(Convert.ToChar(Convert.ToByte(0)));
}
//Comment
for(int i = 0; i < myID3.Comment.Length; i++)
{
if(myID3.Comment[i] != 0)
myString.Append(myID3.Comment[i]);
}
for(int i = 0; i < 30-myID3.Comment.Length; i++)
{
myString.Append(Convert.ToChar(Convert.ToByte(0)));
}
//Track
for(int i = 0; i < myID3.Track.Length; i++)
{
if(myID3.Track[i] != 0)
myString.Append(myID3.Track[i]);
}
for(int i = 0; i < 2-myID3.Track.Length; i++)
{
myString.Append(Convert.ToChar(Convert.ToByte(0)));
}
//Genre
myString.Append(myID3.GenreNr);
myString.Append("|||");
return myString;
}