Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: .::IT::. en 1 Noviembre 2010, 01:10 am



Título: Determinar el tipo de archivo independientemente de la extensión que tengan
Publicado por: .::IT::. en 1 Noviembre 2010, 01:10 am
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:


Título: Re: Determinar el tipo de archivo independientemente de la extensión que tengan
Publicado por: 43H4FH44H45H4CH49H56H45H en 1 Noviembre 2010, 04:50 am
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.


Título: Re: Determinar el tipo de archivo independientemente de la extensión que tengan
Publicado por: .::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!!!!!!!!!!!!!!!!!


Título: Re: Determinar el tipo de archivo independientemente de la extensión que tengan
Publicado por: raul338 en 1 Noviembre 2010, 16:16 pm
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 (http://www.id3.org/id3v2.3.0#head-697d09c50ed7fa96fb66c6b0a9d93585e2652b0b) 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.


Título: Re: Determinar el tipo de archivo independientemente de la extensión que tengan
Publicado por: 43H4FH44H45H4CH49H56H45H en 1 Noviembre 2010, 16:27 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.


Título: Determinar el tipo de archivo independientemente de la extensión que tengan
Publicado por: .::IT::. en 1 Noviembre 2010, 17:07 pm
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!!!!!!!!!!!!!!!!!!! ;-)
Código:
 
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));
}


Título: Re: Determinar el tipo de archivo independientemente de la extensión que tengan
Publicado por: .::IT::. en 1 Noviembre 2010, 19:53 pm
Pues bueno acabo de sacrificarme con el siguiente codigo:

Código:
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!!!!!!!!!


Título: Re: Determinar el tipo de archivo independientemente de la extensión que tengan
Publicado por: .::IT::. en 1 Noviembre 2010, 20:10 pm
Bueno estoy contento con los resultados ya que tener 118 canciones sin saver 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...................


Título: Re: Determinar el tipo de archivo independientemente de la extensión que tengan
Publicado por: [D4N93R] en 1 Noviembre 2010, 20:30 pm
 .::IT::.

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

Un saludo y gracias.


Título: Re: Determinar el tipo de archivo independientemente de la extensión que tengan
Publicado por: Keyen Night en 2 Noviembre 2010, 00:14 am
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:

Código:
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