File Splitter, partiendo y recomponiendo archivos

Este es un pequeño programa que he hecho para partir cualquier archivo en fragmentos más pequeños y poder volver a reconstruirlo después como apoyo a otra aplicación que estoy desarrollando.

Aunque no tiene mucha parafernalia aún estoy asegurando que funciona bien, asi que si alguien lo quiere probar puede instalarlo desde este enlace: http://vtortola.net/FileSplitter/publish.htm (ClickOnce), cuando este requete-probaodo y haya arreglado el desastre de nomenclatura que hay en el código 😀 lo subo a CodePlex todo junto.

 

image

image

File Splitter, partiendo y recomponiendo archivos| vtortola.NET

Obtener el hash de un archivo

Esto es un ejemplo de como obtener distintos tipos de hash de un archivo,  me apoyaré en una de las nuevas características de C# 3.0, los métodos extensores, para tener más a mano esta funcionalidad. Como se puede ver en el código implementar nuevos métodos para la obtención de otros tipos de hash es sumamente sencillo.

Hay distintos tipos de hash, en este ejemplo he utilizado MD5y dos versiones de SHA, SHA-1 y SHA256. La necesidad y cualidades de cada uno nos dirán que usar en cada momento.

Estos métodos extienden la funcionalidad de la clase FileStream:

static class FileStreamExtensions
{
    public static String GetMd5Hash(this FileStream fs)
    {
        return getHash(fs, new MD5CryptoServiceProvider());
    }
 
    public static String GetSha1Hash(this FileStream fs)
    {
        return getHash(fs, new SHA1Managed());
    }
 
    public static String GetSha256Hash(this FileStream fs)
    {
        return getHash(fs, new SHA256Managed());
    }
 
    private static String getHash(FileStream fs, HashAlgorithm hash)
    {
        Int64 currentPos = fs.Position;
        try
        {
            fs.Seek(0, SeekOrigin.Begin);
            StringBuilder sb = new StringBuilder();
            foreach (Byte b in hash.ComputeHash(fs))
            {
                sb.Append(b.ToString("X2"));
            }
            return sb.ToString();
        }
        finally
        {
            fs.Seek(currentPos, SeekOrigin.Begin);
        }
    }
}

Cuando delcaremos el namespace de esta clase en nuestra unidad, podemos acceder a los métodos y obtener directamente el hash deseado de un tiro 😀

static void Main(string[] args)
{
    FileStream fs = new FileStream(@"C:mylife.mp3",FileMode.Open);
    Console.WriteLine(fs.GetMd5Hash());
    Console.WriteLine(fs.GetSha1Hash());
    Console.WriteLine(fs.GetSha256Hash());
    fs.Close();
    Console.ReadKey(true);
}

Si extendiesemos directamente la clase Stream tendriamos el problema de que a alguien se le podría ocurrir hacerlo sobre un NetworkStream… con lo que tendríamos una excepción ya que no todos los tipos de Stream soportan Seek 😉

 

Obtener el hash de un archivo | vtortola.NET

Producer/Consumer con buffer

El modelo producer/consumer es un ejemplo de relación mediante semáforos ó monitores entre dos hilos que intercambian elementos de forma segura y controlada, de forma que cuando el «productor» introduce un elemento avisa a al «consumidor» de que ya puede leer. De esta forma, ambas partes están en idle mientras no hay nada que hacer y se ponen en marcha automáticamente cuando hay «faena» que hacer.

Podemos ver un ejemplo en C# mediante el uso de la clase Monitor en la web de Jon Skeet.

Este ejemplo, es una variación que utiliza un buffer de elementos y añade la posibilidad de indicar que un elemento es el último, de forma que se anule la condición de espera para el/los hilos de lectura cuando no haya elementos, cuando le reader obtenga un null… es que no hay ni habrá más elementos en el buffer:

 

public class ProducerConsumerBuffered<T> 
    where T: class
{
    private Queue<T> buffer = new Queue<T>();
    private readonly Int32 max;
    private Boolean last = false;
 
    public ProducerConsumerBuffered(Int32 Max)
    {
        this.max = Max;
    }
 
    /// <summary>
    /// Introduce un elemento.
    /// </summary>
    /// <param name="item">Elemento</param>
    /// <param name="last">Indica si es el último elemento</param>
    public void Put(T item, Boolean last)
    {
        lock (buffer)
        {
            if(!this.last)
                this.last = last;
 
            buffer.Enqueue(item);
 
            Monitor.Pulse(buffer);
 
            // Si se ha alcanzado el máximo
            // bloqueo hasta que alguien lea
            while (buffer.Count == max)
                Monitor.Wait(buffer);
        }
    }
 
    /// <summary>
    /// Obtiene un elemento.
    /// </summary>
    /// <returns>Elemento</returns>
    public T Pop()
    {
        T r = null;
        lock (buffer)
        {
            // Si no hay elementos y no ha
            // aparecido el elemento final espero
            while(buffer.Count == 0 && !last)
                Monitor.Wait(buffer);
 
            if (buffer.Count>0) 
                r = buffer.Dequeue();
 
            Monitor.Pulse(buffer);
        }
        return r;
    }
}

Para probarlo, podemos usar un simple programa de prueba :

static ProducerConsumerBuffered<Byte[]> bf = 
    new ProducerConsumerBuffered<Byte[]>(20);
static void Main(string[] args)
{
    new Thread(new ThreadStart(write)).Start();
    new Thread(new ThreadStart(read)).Start();
 
    Console.WriteLine("ok ");
    Console.ReadKey(true);
}
 
static void write()
{
    Random r = new Random(5);
    for(Int32 i = 0; i<100;i++)
    {
        bf.Put(Encoding.ASCII.GetBytes(i.ToString()),i==99);
    }
    Console.WriteLine("Writer Exited");
}
 
static void read()
{
    Random r = new Random(5);
    Byte[] value = new Byte[0];
    while (value!=null)
    {
        value = bf.Pop();
        if(value!=null) 
            Console.WriteLine(Encoding.ASCII.GetString(value));
        Thread.Sleep(r.Next(1, 50));
    }
    Console.WriteLine("Reader Exited");
}

 Vemos que el writer termina y el reader aun sigue con los 20 elementos del buffer.

Se aceptan sugerencias 😀

Producer/Consumer con buffer| vtortola.NET

Microsoft rebaja el precio de Windows Vista

Parece que las ventas no van como se pensó en un primer momento y habrá una rebaja de casi un 40% en el precio.

Después de ser el producto más decepcionante del 2007, tener que facilitar el downgrade a XP, las buenas críticas a Windows XP SP3, los fabricantes descontentos … decenas de historias más y hasta una petición online para salvar a XP:D… parece que es lo mejor que pueden hacer en este momento.

[more]

Lleva camino Vista de ser el nuevo WinME(entre los 25 peores productos de la historia)? ó ya lo es?  En fin, pienso que Vista me decepcionó bastante respecto a lo que Longhorn iba a ser(ojo al video… Comming October 2003) :

 

Microsoft rebaja el precio de Windows Vista| vtortola.NET