Determinar el tipo de archivo independientemente de la extensión que tengan

Iniciado por .::IT::., 1 Noviembre 2010, 01:10 AM

0 Miembros y 1 Visitante están viendo este tema.

.::IT::.

Bueno ahora si me vi en la urgencia de pedir ayuda aquí en el foro ya un tiempo atrás estaba reproduciendo mi música en Linux con amaroK, bueno pues una de sus opciones no recuerdo cual que me quito todas las exenciones a mis archivos de música y bueno en ese tiempo como aun así lo reproducía la música sin ningún problema no le di tanta importancia, pero ahora que tengo algo de tiempo libre pues decidí hacer un programa para devolverles sus respectivas extensiones ah mi querida musica que son como 10 000 y picos canciones las cuales no todas son .mp3, entonces el
problema es como determinar el tipo de archivo independientemente de la extensión que tengan ya que en este caso no tienen extensión alguna
. Espero su ayuda, de momento seguiré googleando ah ver que encuentro saludos..... :laugh:
Simplemente .::IT::.

43H4FH44H45H4CH49H56H45H

Solo necesitas un editor Hexadecimal y lees los primeros bytes (depende del tipo archivo) para diferenciarlo, en el caso de .mp3 se puede obtener mas datos los primeros 100 a 130 bytes (esto tb es variable).
Ya teniendo los bytes a buscar, codificar el programa para que lea los mismos, en base a esos datos los ordene y añada su extensión.

-R IP
:0100
-A 100 
2826:0100 MOV AH,09
2826:0102 MOV DX,109
2826:0105 INT 21
2826:0105 MOV AH,08
2826:0105 INT 21
2826:0107 INT 20
2826:0109 DB 'MI NICK ES CODELIVE.$' 
2826:0127 
-R BX
:0000
-R CX
:20
-N CODELIVE.COM
-W

.::IT::.

si ya hice eso pero la verdad los primeros bytes de unos 10 mp3 que tome de muestran son todos diferentes!!!!!!!!!!!!!!!!!
Simplemente .::IT::.

raul338

SI los ultimos 128 bytes del mp3 empiezan con "TAG" o "ID3" (no me acuerdo bien) es porque tiene id3tag v1 por lo que es un mp3
La version 2 se encuentra al principio (creo que los primero 20 bytes) o algo asi, fijate la documentacion :P

EDIT:

ID3v2 3.0 Header son 10 bytes y debe empezar con "ID3" seguido de 2 bytes que son la version mayor y menor respectivamente

En la ID3v1 (1.0 o 1.1) en los ultimos 128 bytes debe empezar con "TAG" seguido de caracteres ascii que son 30 por cada variable (titulo, artista, album) y demas informacion (año, genero, numero de pista)

Ojo, puede ser que no tenga ninguno los tag pero es poco probable, en ese caso... no queda mas que intentar reproducirlos y si se puede reproducir lo renombras.

43H4FH44H45H4CH49H56H45H

Cita de: .::IT::. en  1 Noviembre 2010, 14:53 PM
si ya hice eso pero la verdad los primeros bytes de unos 10 mp3 que tome de muestran son todos diferentes!!!!!!!!!!!!!!!!!

Solo tengo a mano poco mas de 1000 .mp3 y todos tienen "ID3" en los primeros 3 bytes, si nos es tu caso, prueba lo que escribió raul338.

-R IP
:0100
-A 100 
2826:0100 MOV AH,09
2826:0102 MOV DX,109
2826:0105 INT 21
2826:0105 MOV AH,08
2826:0105 INT 21
2826:0107 INT 20
2826:0109 DB 'MI NICK ES CODELIVE.$' 
2826:0127 
-R BX
:0000
-R CX
:20
-N CODELIVE.COM
-W

.::IT::.

Acabo de escribir lo siguiente y supongo que ah de funcionar para los mp3, me arriesgare a ver que tal funciona gracias a todos lo que contestaron y hasta pronto. ;D, los que son .wma les cambiare la extensión ah mano porque ya me dio flojera programar, igual son muy pocos!!!!!!!!!!!!!!!!!!! ;-)

public static bool IsMp3(string path)
{
  if (File.Exists(path))
  {

     FileStream myFileMusic = new FileStream(path, FileMode.Open);

     if (myFileMusic.Length < 3)
        return false;

     byte[] mysPrimariBytes = new byte[3];

     myFileMusic.Read(mysPrimariBytes, 0, 3);
     myFileMusic.Close();

     string myPrimariString = Encoding.UTF8.GetString(mysPrimariBytes);

     if (myPrimariString == "ID3")
        return true;
     else
        return false;
  }
  else
     throw new Exception(String.Format("No existe el archivo \"{0}\"", path));
}
Simplemente .::IT::.

.::IT::.

Pues bueno acabo de sacrificarme con el siguiente codigo:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace testmp3
{
   class Program
   {
       static void Main()
       {
           string NewName;

           DirectoryInfo _DirectoryInfo = new DirectoryInfo(System.AppDomain.CurrentDomain.BaseDirectory);
           FileInfo[] mysFiles = _DirectoryInfo.GetFiles();

           Console.WriteLine("Presione uan tecla para comenzar");
           Console.ReadKey();  
           foreach (FileInfo myFile in mysFiles)
           {
               try
               {
                   if (myFile.Extension == "")
                   {
                       if (IsMp3(myFile.FullName))
                       {
                           NewName  = String.Format("{0}.mp3", myFile.Name);
                           myFile.MoveTo(NewName);
                       }
                       else
                       {
                           NewName = string.Format(System.AppDomain.CurrentDomain.BaseDirectory + @"wma\" + myFile.Name);
                           myFile.MoveTo(NewName);
                       }
                   }
               }
               catch (Exception ex)
               {
                   Console.WriteLine(ex.Message);
               }
           }

           Console.WriteLine("Todo termino precione una tecla para terminar");
           Console.ReadKey();
       }

       public static bool IsMp3(string path)
       {
           if (File.Exists(path))
           {

               FileStream myFileMusic = new FileStream(path, FileMode.Open);

               if (myFileMusic.Length < 3)
                   return false;

               byte[] mysPrimariBytes = new byte[3];

               myFileMusic.Read(mysPrimariBytes, 0, 3);
               myFileMusic.Close();

               string myPrimariString = Encoding.UTF8.GetString(mysPrimariBytes);

               if (myPrimariString == "ID3")
                   return true;
               else
                   return false;
           }
           else
               throw new Exception(String.Format("No existe el archivo \"{0}\"", path));
       }
   }
}


Al parecer todo funciono pero tengo algunos archivos de musica(118 par ser precisos)
algunos son .wma  pero algunos "son .wma y .mp3 " jaja lo digo porque al ponerles .wma el windows media player lo reproduce normal sin ninugun mensaje lo mismo pasa si le pongo .mp3 entonces no se que pensar son .wma o .mp3??? expero sus opiniones!!!!!!!!!
Simplemente .::IT::.

.::IT::.

Bueno estoy contento con los resultados ya que tener 118 canciones sin saber que formato es en comparacion de los 10000 y picos ya es mucho de todos modos pienso que eso de la extructura de los mp3, wma o otros formatos es mucho rollo para un cerebro tan pobre como el mio asi que de mi parte doy gracias ah todos y concluido el terma...................
Simplemente .::IT::.

[D4N93R]

 .::IT::.

No postaes doble y menos triple! , usa editar el post.

Un saludo y gracias.

Keyen Night

Ya sabes que la cabecera de los archivos contienen ciertas palabras que indican su extension, pero imaginate hacer una función IsXXX por cada una de las extensiones existentes :xD y si la información que contiene la extensión no está en la cabecera?

Si lo quisiera hacer, seguiria los siguientes pasos...

Hacer un archivo (no se si lo quieras cifrar), en el cual se carguen un conjunto de 3 valores por cada extensión (podrías tambien hacer una clase que administre el archivo en el cual se cargan y guardan los valores) string, List Of String y List Of Long, los llamaremos A, B Y C.

A debe contener el nombre real de la extesión Ej: .txt
B debe contener una lista de string que leyendo las direcciones que existen en C respectivamente para B retornen el valor actual de B (No se si se entendio :xD)

Más sencillo si:

A = ".jpg"
B = {"siempre", "contienen", "esta", "frase"}
C = {123, 456, 789, 101112}


Quiere decir que leyendo 7 Bytes la dirección 123 del archivo debes obtener la palabra "siempre", obtener "contienen" leyendo 9 Bytes de la dirección 456 y así con todas las direcciones, sí todas resultan ciertas entonces estas en presencia de un archivo jpg.

Esto lo deberás hacer por que si yo creo una extension .ej que guarda texto plano, no podrás diferenciar si este es .txt o .ej o cualquier otra extensión de texto plano, eso agregado a que el texto plano no tiene estructura particular, es simplemente texto plano.

Debes analizar la estructura tu mismo con editor Hexadecimal de cada extensión o buscar en San Google como estan estructuradas las extensiones más conocidas, si decides hacerlo tu mismo debes ver los valores que son constantes y que las direcciones de los valores sean unicas en comparacion con la lista de extensiones que quieres que abarque tu sistema.

Espero que te haya servido :D
La Fé Mueve Montañas...
                                    ...De Dinero

La programación es más que un trabajo es más que un hobby es una pasión...