0

多くの(たとえば500)mp3ファイルを1つのファイル(任意のタイプ)に連結してから、特定のファイルをmp3形式として抽出するにはどうすればよいですか?

現在、このコードを使用してすべてのファイルを取得しています。

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

前もって感謝します。

更新:特定のmp3ファイルを抽出できない場合は、すべてのmp3ファイルを指定したディレクトリに抽出したいと思います。プログラムなしで人間がmp3ファイルを抽出するのを防ぐ必要があるため、ZIP、RARなどでは不十分です。

4

4 に答える 4

2

実際にコードを記述しなくても、次のようなことができます。

1)バイナリモードでファイルを作成します。

2)空のInt32値をストリームに書き込みます。

3)mp3ファイルの数をストリームに書き込みます。

4)mp3ファイルの数のサイズの配列を作成します。ここにオフセットを保存します。

5)ファイルごとに、バイナリモードで読み取ります。現在のファイル位置を前述の配列に保存し、mp3ファイルを出力ファイルに書き込みます。

6)出力ファイルの位置をもう一度メモし、すべてのmp3ファイルの位置を含む配列を書き出します。

7)ファイルの先頭を探し、最初に書き込んだ値を、ファイルの位置のオフセットで上書きします。

8)閉じてください!

これで、特定のMP3を取得するときに、このファイルを開いて、インデックスへのオフセットとその数を示す最初の2つのInt32を読み取ることができます。その後、適切な位置を探して、mp3ファイルを抽出できます。

于 2012-12-09T09:16:27.780 に答える
1

自家製のコンテナ形式(ここで他の回答で提案されているものなど)が機能する場合もありますが、.zipなどのよく知られたコンテナ形式を使用することをお勧めします。圧縮によるメリットはあまりありませんが、ファイル名に加えて、他のプログラムがファイルアーカイブを作成/抽出する機能を利用できます。

プログラムで.zipを作成する方法についてサポートが必要な場合は、Web(特にStackOverflow)を調べてください。それでもわからない場合は、別の質問として質問してください。

于 2012-12-09T09:46:34.150 に答える
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[]
}
于 2012-12-09T09:33:10.427 に答える
0

私を助けるためにあなたの余裕をありがとうみんな。パスワード保護を使用してそれらを圧縮することにしました。だから、誰も私のファイルを抽出することはできません:)

于 2012-12-09T10:24:54.563 に答える