2012-12-09 3 views
0

Comment concaténer grand nombre (500) des fichiers mp3 dans un seul fichier (tout type), puis extraire un fichier spécifique au format mp3?Concat fichiers mp3 dans un fichier et récupérer tout fichier mp3 spécifique

Actuellement je reçois tous les fichiers en utilisant ce code:

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

Merci à l'avance.

Mise à jour: Si je ne peux pas extraire un fichier mp3 spécifique, je veux extraire tous les fichiers mp3 dans un répertoire spécifié. ZIP, RAR etc ne sont pas assez parce que je dois empêcher les humains d'extraire des fichiers mp3 sans mon programme.

+0

Est-ce une partie d'un plus gros problème ..? Je ne vois pas comment cela sera utile. Mais je peux me tromper. –

Répondre

1

Alors qu'un format conteneur infusé à la maison (comme celles proposées dans d'autres réponses ici) pourrait fonctionner, je recommande d'utiliser un format conteneur bien connu tel que .zip. Bien que vous n'obtiendriez pas beaucoup d'avantages de la compression, vous obtiendrez le nom du fichier, plus la possibilité pour d'autres progs de créer/extraire votre archive de fichiers.

Si vous avez besoin d'aide pour créer un fichier .zip par programme, recherchez le web (et en particulier StackOverflow), et si vous ne savez toujours pas, posez une question distincte.

+0

Merci les gars pour vos moyens de m'aider. J'ai décidé de les compresser en utilisant la protection par mot de passe.Donc, personne ne peut extraire mes fichiers :) – whoone

+0

Great. Vous voulez marquer cela comme la réponse à votre question? – Jonathan

2

sans écrire le code pour vous, vous pouvez faire quelque chose comme ceci:

1) Créez un fichier en mode binaire.

2) Ecrire une valeur Int32 vide dans le flux.

3) Écrivez le nombre de fichiers mp3 dans le flux.

4) Créer un tableau, la taille du nombre de fichiers mp3. Nous allons stocker leurs compensations ici.

5) Pour chaque fichier, lisez-le en mode binaire. Stockez la position actuelle du fichier dans le tableau ci-dessus, et écrivez le fichier mp3 dans notre fichier de sortie.

6) Prenez note de la position du fichier de sortie une nouvelle fois, et écrire sur le tableau contenant les positions de tous les fichiers mp3.

7) Saute au début du fichier et remplacez la valeur que nous avons écrit à l'origine, avec le décalage de l'endroit où les positions de fichiers sont.

8) Fermez-le!

Maintenant, quand on veut obtenir un MP3 spécifique, nous pouvons ouvrir ce fichier, lisez les deux premiers INT32 qui nous dira l'offset à notre index, et combien il y a. Vous pouvez alors chercher à la position appropriée et extraire le fichier mp3.

1

Si vous concat tous les octets ensemble, puis rappelez-vous chaque nom de fichier et le nombre d'octets, il est vous pouvez utiliser cette information pour trouver le bon segment d'octets pour chaque fichier musical. N'a pas testé cela mais devrait vous donner une idée.

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[] 
} 
0

Merci les gars pour vos moyens de m'aider. J'ai décidé de les compresser en utilisant la protection par mot de passe. Donc, aucun ne peut extraire mes fichiers :)