将concat mp3文件放在一个文件中并检索任何特定的mp3文件

时间:2012-12-09 09:05:04

标签: c# file-io mp3

如何将多个(比方说500个)mp3文件连接成一个文件(任何类型),然后将任何特定文件解压缩为mp3格式?

目前我使用此代码获取所有文件:

int i = 0;
string[] files = new string[500];
foreach (var path in Directory.GetFiles(@"R:\abc\a\"))
{
    files[i++] = path;
}

提前致谢。

更新:如果我无法提取任何特定的mp3文件,那么我想将所有mp3文件解压缩到指定目录。 ZIP,RAR等是不够的,因为我必须阻止人类在没有我的程序的情况下提取mp3文件。

4 个答案:

答案 0 :(得分:2)

如果没有为您编写代码,您可以执行以下操作:

1)以二进制模式创建文件。

2)将空Int32值写入流。

3)将mp3文件的数量写入流中。

4)创建一个数组,mp3文件数量的大小。我们会在这里存储它们的偏移量。

5)对于每个文件,以二进制模式读取。将当前文件位置存储在上述数组中,并将mp3文件写入输出文件。

6)再次记下输出文件位置,并写出包含所有mp3文件位置的数组。

7)寻找文件的开头并覆盖我们最初写入的值,以及文件位置的偏移量。

8)关闭它!

现在,当我们想要获取特定的MP3时,我们可以打开这个文件,读取前两个Int32s,它们会告诉我们索引的偏移量,以及有多少。然后,您可以寻找合适的位置并提取mp3文件。

答案 1 :(得分:1)

如果将所有字节连在一起,则记住每个文件名以及可以使用该信息为每个音乐文件找到正确的字节段的字节数。没有测试过,但应该给你一个想法。

IEnumerable<FileInfo> Mp3Files = new DirectoryInfo(dir).GetFiles();

// catalog all names and their length in bytes (you can save this somewhere)
IEnumerable<Mp3File> musicFiles = Mp3Files.Select(o => new Mp3File() { Name = o.Name, Size = o.Length });

// concat all into one
byte[] musicData = files.SelecMany(o => File.ReadAllBytes(o.FullName)).ToArray();
File.WriteAllBytes("allmusic.data", musicData);

byte[] GetSingleMusicFile(string name)
{
    // find the music file by name, and get how many bytes it is
    int bytesToTake = musicFiles.First(o => o.Name == name).Length;

    // count all the music files BEFORE it and add up their bytes to find out how many bytes to skip
    int bytesToSkip = musicFiles.TakeWhile(o => o.Name != name).Sum(o => o.Size);

    // skip the bytes until you get to your music file then take its bytes
    byte[] singleMusicData = musicData.Skip(bytesToSkip).Take(bytesToTake).ToArray();
    return singleMusicData[]
}

答案 2 :(得分:1)

虽然家庭酿造的容器格式(例如此处其他答案中建议的那些)可能有用,但我建议使用众所周知的容器格式,例如.zip。虽然您不会从压缩中获得太多好处,但您将获得文件名,以及其他程序创建/提取文件存档的能力。

如果您需要有关如何以编程方式创建.zip的帮助,请研究网络(尤其是StackOverflow),如果您仍然不知道,请单独提问。

答案 3 :(得分:0)

谢谢你们有能力帮助我。我决定使用密码保护来压缩它们。所以,没有人可以提取我的文件:)