Augusto Humire Martinez web blog

algo de web-in

crear directorios en el servidor web dinamicamente

No sabemos ni tenemos nada hasta que lo necesitamos, esa es la frase.

entonces…

La idea era crear un directorio o carpeta en el servidor web usando aspx para luego crear uno o varios archivos dentro de este directorio para los fines que ud. crea necesitar, pero al tratar de crearlo no bastaba con ejecutar

Directory.CreateDirectory(targetDirectory);

esta linea de codigo no lanzaba ningun error pero tampoco creaba ninguna carpeta o directorio, busque y busque (sople y sople) y al fin lo encontre (y la casa derrumbe), espero les pueda ser util por que he visto por alli un sin fin de foros donde no se especifica la respuesta concreta, el codigo es similar al anterio solo que con un ligero cambio

string idUsuario = “215487”
string targetDirectory = HttpContext.Current.Server.MapPath(string.Format(“~/ueDocumentosTemp/{0}”, idUsuario));
Directory.CreateDirectory(targetDirectory);

y finalmete este codigo creo el directorio “ueDocumentosTemp/215487/”  y alli se podra escribir los archivos que necesite.

saludos.

mayo 14, 2011 Posted by | .NET | Deja un comentario

Acceso a Archivos en .NET

De vez en cuando me toca leer, escribir, crear entre otras tareas archivos planos, y de pronto me salta la pregunta ¿como se hacia? claro, como es de esperarse uno no se puede recordar de todo lo que tiene en la cabeza, asi que pondre estos apuntes para cuando los necesite y si a Ud. le sirve, enhorabuena.

Para acceder a los archivos planos en .NET podemos usar la clase Stream, StreamReader, StreamWriter entre otras como BufferedStream, el hecho es que BufferedStream es mas eficiente para hacer uso de stream, entonces, hare la aclaracion del caso, si su trabajo con archivos planos es extramadamente fuerte en su aplicacion le sugiero que utilice BufferedStream y no las clases Stream por unconcepto de rendimiento o performance como algunos tambien le dicen.

Para agregar y/o crear Texto en un archivo

//Crea y/o Agrega texto en un archivo
        public static void AgregarTextoArchivoPlano(string FileFullPath)
        {
            using (StreamWriter sw = File.AppendText(FileFullPath))
            {
                sw.WriteLine(string.Format(“Archivo modificado el {0}”, DateTime.Now.ToString()));
                //sw.Flush();
                //sw.Close();
            }
        }

Para crear y sobreescribir texto en un archivo

//Crea y/o sobreescribe el texto en un archivo
        public static void EscribirArchivoPlano(string FileFullPath)
        {
            using (StreamWriter sw = new StreamWriter(FileFullPath))
            {
                sw.WriteLine(string.Format(“Archivo creado el {0}”,DateTime.Now.ToString()));
                //sw.Flush();
                //sw.Close();
            }
        }

Para Leer un archivo de texto existente

//Leyendo un archivo de texto existente
        public static void LeerArchivoPlano(string FileFullPath)
        {
            using (StreamReader sr = new StreamReader(FileFullPath))
            {
                while (!sr.EndOfStream)
                {
                    Console.WriteLine(sr.ReadLine());
                }
                //sr.Close();
            }
            Console.ReadLine();
        }

Como ven crear, editar archivo de texto puede ser muy sencillo en C# .NET, solo para aclarar, como habran podido observar he comentado el metodo Flush() y el metodo Close(), es importante esta aclaracion porque en realidad se debe especificar estas lineas no solo para que escriba realmente en el archivo de texto, si no para soltar el recurso y el archivo no quede colgado del proceso sin que nadie lo pueda volver a acceder a el a no ser que se mate el proceso que lo tomó y asi liberar el recurso, entonces utilizo la clausula using para asegurarme que el objeto stream muera cuando termine la esta clausula.

mayo 1, 2009 Posted by | .NET | Deja un comentario

Como redimensionar una imagen en .NET

alguna vez les ocurrio que quisieron hacer su backup de sus archivos y se dieron cuenta que en fotos tenian GIGAS que ocupaban el disco?

Bueno a mi me paso y es asi que rapidamente trate de buscarla razon, y la razon era que el tamaño de las imagenes era muy grandes por foto en mi caso eran 2.8Mb/f   y me puse a buscar como reducir el tamaño de mis imagenes par que no me ocupen espacio, y encontre nuestro infaltable paint, pero me aburri tratando de reducir el tamaño uno a uno, asi que pense si seria dificil reducirlas en batch usando algun tipo de programa de esos que editan imagenes, y la verdad de todo lo que busque (no soy un guru en imagenes) no encontre a ninguno que reduzca el tamaño en batch, asi que se me ocurrio escribir uno (a falta de pan, …bizcocho), y les contare como lo hice, ahi les va.

Lenguaje: C#
Plataforma: .NET
version Plataforma: 3.5
Codigo: aqui (Cambie la extension por “.rar” y luego descomprima)
Ejecutable: aqui (Cambie la extension por “.rar” y luego descomprima)

El codigo en realidad es sencillo (escrito en C# .NET) pero ayudará, las tres clases principalmente usadas son Image, Bitmap, Graphics y MemoryStream, y el codigo principal es como el que tienen a continuacion:

primero las referencias

using System.IO;
using System.Drawing;
using System.Drawing.Imaging;
using System.Drawing.Drawing2D;

ahora el metodo principal o core como le dicen algunos

private Image Redimensionar(Image Imagen, int Ancho, int Alto, int resolucion)
{
//Bitmap sera donde trabajaremos los cambios
using (Bitmap imagenBitmap = new Bitmap(Ancho, Alto, PixelFormat.Format32bppRgb))
{
imagenBitmap.SetResolution(resolucion, resolucion);
//Hacemos los cambios a ImagenBitmap usando a ImagenGraphics y la Imagen Original(Imagen)
//ImagenBitmap se comporta como un objeto de referenciado

using (Graphics imagenGraphics = Graphics.FromImage(imagenBitmap))
{
imagenGraphics.SmoothingMode = SmoothingMode.AntiAlias;
imagenGraphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
imagenGraphics.PixelOffsetMode = PixelOffsetMode.HighQuality;
imagenGraphics.DrawImage(Imagen, new Rectangle(0, 0, Ancho, Alto), new Rectangle(0, 0, Imagen.Width, Imagen.Height), GraphicsUnit.Pixel);
//todos los cambios hechos en imagenBitmap lo llevaremos un Image(Imagen) con nuevos datos a travez de un MemoryStream
MemoryStream imagenMemoryStream = new MemoryStream();
imagenBitmap.Save(imagenMemoryStream, ImageFormat.Jpeg);
Imagen = Image.FromStream(imagenMemoryStream);
}
}
return Imagen;
}

la siguiente porcion de codigo en un metodo sobrecargado de Redimensionar solo contiene el calculo del nuevo ancho, alto y la resolucion, argumentos para realizar una llamada a private Image Redimensionar(Image Imagen, int Ancho, int Alto, int resolucion), es decir calcula los valores nuevos antes de realizar el verdadero cambio de tamaño de imagen

private Image Redimensionar(Image image, int SizeHorizontalPercent, int SizeVerticalPercent)
{
//Obntenemos el ancho y el alto a partir del porcentaje de tamaño solicitado
int anchoDestino = image.Width * SizeHorizontalPercent / 100;
int altoDestino = image.Height * SizeVerticalPercent / 100;
//Obtenemos la resolucion original
int resolucion = Convert.ToInt32(image.HorizontalResolution);

return this.Redimensionar(image, anchoDestino, altoDestino, resolucion);
}

la siguiente porcion de codigo es la que dispara los metodos mencionados arriba

//Obtenemos la imagen del filesystem
Image image = Image.FromFile(“C:\MisImagenes\foto1.jpg”);
//Redimensionamos la imagen
image = this.Redimensionar(image, 30, 30);
//Guardamos la imagen modificada
image.Save(“C:\OtraCarpeta\foto1.jpg”);
image.Dispose();

Recuerde el metodo private Image Redimensionar(Image image, int SizeHorizontalPercent, int SizeVerticalPercent) la usamos para redimensionar y le bridamos el porcentaje que queremos de tamaño de nuestra imagen usando como referencia el tamaño de la imagen original y este metodo despues de calcular los nuevos tamaños recien llama a private Image Redimensionar(Image Imagen, int Ancho, int Alto, int resolucion). Es decir para nuestro ejemplo decimos que la imagen nueva sea redimensionada al 30% de su tamaño original de ancho y de alto, si nuestra imagen original fuera de 3000   x   3000 el nuevo tamaño sera de 900   x   900   que es el equivalente a el 30% de 3000 pixeles. bueno eso es todo.

Y recuerden… “no destruyan el planeta”, …que no tenemos otro.

Preguntas, comentarios o Sugerencias por este mismo canal.

febrero 17, 2009 Posted by | .NET | 8 comentarios