Manejando archivos de texto con C#

Un punto siempre importante es manejar archivos de textos en una plataforma, para esto C# nos proporciona de objetos que nos hacen mas fácil estas tareas.

El namespace System.IO es el que contiene tipos que permiten leer y escribir en los archivos y secuencias de datos, así como tipos que proporcionan compatibilidad básica con los archivos y directorios.  Las clases más relacionadas con la escritura y lectura de archivos (File Input/Output o File I/O) son:

FileStream, cuyo propósito es lectura y escritura de datos binarios (no de texto legible), a cualquier archivo de tipo binario, aunque se puede utilizar para acceder a cualquier tipo de archivo, inclusive los de texto.

StreamReader y StreamWriter, las cuales están diseñadas para lectura y escritura de archivos de texto. Estas clases se asumen como de un nivel más alto que FileStream.

La lectura y escritura a un archivo son hechas usando un concepto genérico llamado stream. La idea detrás del stream existe hace tiempo, cuando los datos son pensados como una transferencia de un punto a otro, es decir, como un flujo de datos.

El uso de streams para la lectura y escritura de archivo es directa pero lenta. Por esta razón la clase BufferedStream existe y es más eficiente. Puede ser utilizado por cualquier clase de stream. Para operaciones de archivo es posible utilizar FileStream, donde el buffering está ya incluido.

La clase base abstracta Stream es compatible con bytes de lectura y escritura. Stream tiene compatibilidad asincrónica. Sus implementaciones predeterminadas definen lecturas y escrituras sincrónicas según sus correspondientes métodos asincrónicos, y viceversa.

Todas las clases que representan secuencias se derivan de la clase Stream. La clase Stream y sus clases derivadas proporcionan una visión genérica de los orígenes de datos y los repositorios, aislando al programador de los detalles específicos del sistema operativo y sus dispositivos subyacentes.

Las secuencias comprenden estas operaciones fundamentales:

En las secuencias se puede leer. La lectura es la transferencia de datos desde una secuencia a una estructura de datos, como, por ejemplo, una matriz de bytes.

En las secuencias se puede escribir. La escritura consiste en la transferencia de información desde un origen de datos a una secuencia.

Las secuencias pueden admitir operaciones de búsqueda. Las operaciones de búsqueda consisten en la consulta y modificación de la posición actual en una secuencia.

Según el origen de datos o repositorio subyacente, las secuencias pueden admitir sólo algunas de estas características. Por ejemplo, NetworkStreams no admite operaciones de búsqueda. Las propiedades CanRead, CanWrite, y CanSeek de Stream y sus clases derivadas determinan las operaciones que son compatibles con diferentes secuencias.

Entre las clases suadas para entrada y salida de archivos tenemos Directory, DirectoryInfo, DriveInfo, File, FileInfo, FileStream, FileSystemInfo, Path, DeflateStream, GZipStream, DeflateStream, SerialPort, pero nosotros nos centraremos en FileStream.

De igual modo tenemos varias clases que nos permiten leer y escribir en secuencias BinaryReader, BinaryWriter, StreamReader, StreamWriter, StringReader, StringWriter, TextReader, TextWriter pero en este articulo nos centraremos en StreamReader y StreamWriter.

También tenemos clases para manejar secuencias de Entrada y Salida BufferedStream, CryptoStream (Aunque CryptoStream deriva de Stream, no forma parte del namespace System.IO, sino de System.Security.Cryptography), MemoryStream, NetworkStream (Aunque CryptoStream deriva de Stream, no forma parte del namespace System.IO, sino de System.Net.Sockets).

El FileStream actúa como un intermediario entre el sistema de archivos y nuestra aplicación, permitiendo realizar de una manera limpia y sencilla operaciones de escritura y lectura en archivos. Para utilizar el FileStream, lo primero que se debe hacer es crear una instancia que apunte al archivo deseado. usando el siguiente constructor inicializamos una nueva instancia de la clase FileStream con el permiso de uso compartido, el permiso de lectura/escritura, el modo de creación y la ruta de acceso especificados.

public FileStream(
   string path,
   FileMode mode,
   FileAccess access,
   FileShare share
)

Parámetros:

path
Tipo: System.String
Ruta relativa o absoluta del archivo que va a encapsular el objeto FileStream actual.

mode
Tipo: System.IO.FileMode
Constante que determina cómo abrir o crear el archivo.

access
Tipo: System.IO.FileAccess
Constante que determina cómo puede obtener acceso al archivo el objeto FileStream. Obtiene las propiedades CanRead y CanWrite del objeto FileStream. La propiedad CanSeek es true si path especifica un archivo de disco.

share
Tipo: System.IO.FileShare
Constante que determina cómo compartirán el archivo los procesos.

Una observación acerca de la declaración de nombres/rutas de archivos en C#. Usualmente, la ruta de un archivo contiene el carácter  ‘\’, que en C# se utiliza como caracter de control para símbolos especiales (como el cambio de línea: ‘\n’). Sin embargo, entendiendo que no es el mismo sentido el que se le quiere dar en la interpretación de rutas de archivos (por ej: “C:\Mis documentos\Programas\ejemplo.cs”), se utiliza una sintaxis particular, anteponiendo el símbolo ‘@’ antes del string con la ruta del archivo.  Por ejemplo:

string rutaarchivo = @”C:\Temp\archivo.txt”;

StreamReader y StreamWriter

StreamReader  implementa un TextReader que lee los caracteres de una secuencia de bytes en una codificación determinada.

StreamReader está diseñado para la entrada de caracteres mediante una codificación determinada, mientras que la clase Stream está diseñada para la entrada y salida de bytes. Se utiliza StreamReader para leer líneas de información desde un archivo de texto estándar.

StreamReader adopta la codificación UTF-8 de forma predeterminada, a menos que se especifique otra, en lugar de utilizar la página de códigos ANSI del sistema actual. UTF-8 utiliza los caracteres Unicode correctamente y ofrece resultados coherentes en versiones traducidas del sistema operativo.

Son básicamente tres los métodos propios de StreamReader que permiten efectuar lectura desde el stream (archivo) declarado.

ReadLine()
Al igual que el conocido Console.ReadLine(), este método lee una línea completa de un archivo de texto hasta el cambio de línea más próximo. Al igual que su equivalente de consola, StreamReader.ReadLine() no incluye en el string el carácter de cambio de línea.
string linea = sr.ReadLine()

ReadToEnd()
Este método, por su parte, se encarga de acumular la información que hay desde la lectura anterior (que pudo haberse hecho con ReadLine(), por ejemplo) hasta el final del archivo, todo en el mismo string.
string linea = sr.ReadToEnd()

Read ()
Finalmente, el método simple Read() se encarga de leer un caracter a la vez, lo que permite procesar símbolo por símbolo el contenido del archivo. Convenientemente, este método reconoce el cambio de línea y se lo salta como si no existiese. Cuando se encuentra con el fin de archivo, retorna un valor –1, considerando que su retorno es siempre un int (y no un char).
int SigCaracter = sr.Read();

Este mismo método ofrece una declaración alternativa (sobrecarga), donde es posible leer una cantidad específica de caracteres y almacenarlos en un arreglo de enteros.
char[] CharArray = new char[100];
int[] nChars = sr.Read(CharArray, 0, 100);

nChars es un arreglo con los enteros retornados por el método, y será menor si es que la cantidad de caracteres que quedan en el archivo es menor de 100.

StreamWriter implementa TextWriter para escribir los caracteres de una secuencia en una codificación determinada.

StreamWriter está diseñado para obtener caracteres como salida en una codificación determinada, mientras que las clases derivadas de Stream están diseñadas para entrada y salida de bytes.

StreamWriter utiliza de forma predeterminada una instancia de UTF8Encoding, a menos que se especifique lo contrario. Esta instancia de UTF8Encoding se construye de modo que el método Encoding.GetPreamble devuelva la marca de orden de bytes Unicode escrita en UTF-8. El preámbulo de la codificación se agrega a una secuencia cuando no se anexa a una secuencia existente. Esto significa que cualquier archivo de texto que se cree con StreamWriter tendrá tres marcas de orden de bytes al principio. UTF-8 utiliza todos los caracteres Unicode correctamente y ofrece resultados coherentes en versiones traducidas del sistema operativo.

Son básicamente dos los métodos propios de StreamWriter que permiten escribir hacia el stream (archivo) declarado y son los mismos que se usan para escribir en la consola: Write() y WriteLine().

WriteLine()
Totalmente equivalente a Console.WriteLine(), se utiliza la misma idea, y el mismo formato, sabiendo que se estará escribiendo el texto no a la consola, sino que al stream abierto con el constructor.
string linea = “Texto de prueba”;
sw.WriteLine(linea);
sw.WriteLine(“Los valores posibles son: {0} y {1}”, 3, 5);

Write ()
También presente, el método simple Write(), permite escribir texto en el stream, de la misma forma que su equivalente método de la clase Console. En este caso se reconocen las siguientes alternativas de uso:

Imprimir un string
string linea = “Texto de prueba”;
sw.Write(linea);

Imprimir un caracter
char caracter = ‘T’;
sw.Write(caracter);

Imprimir un arreglo de caracteres
char[] caracteres = new char[100];
for(int i=0; i<100; i++) caracteres[i] = ‘+‘;
sw.Write(caracteres);

Imprimir una porción de un arreglo de caracteres
char[] caracteres = new char[100];
for(int i=0; i<100; i++) caracteres[i] = ‘+‘;
sw.Write(caracteres, 25, 50); // Desde posición 25 se escriben 50 caracteres

 

Para culminar les dejo un pequeño ejemplo de manejo de cadenas y manejo de archivos, espero les sirva

Anuncios

Jugando con String en C#

Veamos algunas de las formas que tenemos en C# para el manejo de cadenas de caracteres, el manejo de caracteres siempre es un tema fundamental para el desarrollo de aplicaciones y C# nos proporciona varios métodos para el manejo de caracteres, algunos de los cuales los veremos en adelante.

Una cadena es un objeto de tipo String cuyo valor es texto. Internamente, el texto se almacena como una colección secuencial de solo lectura de objetos Char. Al final de una cadena de C# no hay un carácter null de terminación; por lo tanto, una cadena de C# puede contener cualquier número de caracteres null incrustados (”). La propiedad Length de una cadena representa el número de objetos Char que contiene, no el número de caracteres Unicode. Para obtener acceso a los puntos de código Unicode individuales de una cadena, utilice el objeto StringInfo.

El operador new no se utiliza para crear un objeto de cadena, salvo cuando se inicialice la cadena con una matriz de caracteres.  Por ejemplo:

char[] letters = { ‘A’, ‘B’, ‘C’ };
string alphabet = new string(letters);

Podemos inicializar una cadena de longitud cero con el valor constante Empty en lugar de null, puede reducir las posibilidades de que se produzca una excepción NullReferenceException la representación literal de cadena de una cadena de longitud cero es “” Utilice el método estático IsNullOrEmpty(String) para comprobar el valor de una cadena antes de accederla.

// Inicializar a null.
string message2 = null;

// Inicializar a un string vacio cuyo valor es “”
// Les recomiendo inicializar valores string de esta forma
string message3 = System.String.Empty;

//Implementacion del método IsNullOrEmpty

public static String Test(string s)
{
   if (String.IsNullOrEmpty(s))
      return “is null or empty”;
   else
      return String.Format(“(\”{0}\”) is not null or empty”, s);
}

Hay varios métodos para el manejo de subcadenas que nos ayudan a manipular segmentos de cadenas de string, hablemos de SubstringReplaceIndexOf.

Substring Recupera una subcadena de la instancia. La subcadena comienza en una posición de carácter especificada y tiene una longitud especificada.  Por ejemplo:

try
{
   MessageBox.Show(textBox1.Text.Substring(3, 6), “string”);
}
catch
{
    MessageBox.Show(“Error”,”ouch”,MessageBoxButton.OK,MessageBoxImage.Error);
}

Replace Devuelve una nueva cadena en la que todas las apariciones de un carácter Unicode o un objeto String especificado en la cadena actual se reemplazan por otro carácter Unicode o un objeto String especificado.  Por ejemplo:

{
   MessageBox.Show(textBox1.Text.Replace(“a”, “7”), “titulo”);
}

IndexOf Notifica el índice de la primera aparición de uno o más caracteres, o la primera aparición de una cadena, dentro de esta cadena.  Por ejemplo:

if (textBox2.Text.Length > 0)
{
   if (textBox1.Text.IndexOf(textBox2.Text.Trim()) < 0)
   {
      MessageBox.Show(“No se encuentra”, “titulo”, MessageBoxButton.OK, MessageBoxImage.Error);
   }
   else
   {
       MessageBox.Show(“Lo encontro”, “titulo”, MessageBoxButton.OK, MessageBoxImage.Information);
    }
}

También tenemos el método String.Split Como entrada, Split toma una matriz de caracteres que indican los caracteres que se utilizan como delimitadores. En este ejemplo, se utilizan espacios, comas, dos puntos, puntos y comas y tabuladores. Se pasa una matriz que contiene estos delimitadores a Split, y cada palabra de la frase se muestra por separado utilizando la matriz de cadenas resultante.  Por ejemplo:

foreach (string token in textBox1.Text.Split(‘ ‘))
{
    MessageBox.Show(token, “String”,MessageBoxButton.OK,MessageBoxImage.Information);
}

Ademas tenemos los métodos para convertir cadenas en mayúsculas y minúsculas ToLower() y ToUpper() por ejemplo:

MessageBox.Show(textBox1.Text.ToUpper(), “titulo”);
MessageBox.Show(textBox1.Text.ToLower(), “titulo”);

Podemos tener acceso a los caracteres individuales del string, por ejemplo:

string cadena=””;
for (int i = 0; i < textBox1.Text.Length; i++)
{
    cadena = cadena + textBox1.Text[textBox1.Text.Length – i – 1];
}
MessageBox.Show(cadena, “string”);

Para finalizar les dejo la tabla de Secuencias de escape de cadena

Secuencia de escape Nombre del carácter Codificación Unicode
\’ Comilla simple 0x0027
\” Comilla doble 0x0022
\\ Barra diagonal inversa 0x005C
NULL 0x0000
\a Alerta 0x0007
\b Retroceso 0x0008
\f Avance de página 0x000C
\n Nueva línea 0x000A
\r Retorno de carro 0x000D
\t Tabulación horizontal 0x0009
\U Secuencia de escape Unicode para pares suplentes. \Unnnnnnnn
\u Secuencia de escape Unicode \u0041 = “A”
\v Tabulación vertical 0x000B
\x Secuencia de escape Unicode similar a “\u” a excepción de la longitud variable. \x0041 = “A”

PUNTEROS EN C#

Los punteros siempre han sido de gran utilidad para los desarrolladores y aunque ya tenemos formas mas seguras y eficientes de desarrollar las tareas que teniamos que solíamos hacer con ellos, siempre seran de ayuda, ahora veremos como trabajar con punteros en C#

En C# para mantener la seguridad de tipos y la seguridad no se admite las operaciones con punteros de manera determinada, para ello se usa la palabra clave unsafe para definir un contexto no seguro para usar los punteros. En el Common Language Runtime (CLR) se refieren al código no seguro como código no comprobable lo cual no necesariamente significa que es peligroso sino que su seguridad no se puede comprobar por el CLR, básicamente la diferencia entre el código “unmanaged” y código definido como “unsafe” es que el primero corre fuera del CLR mientras que el “unsafe” tiene permiso del CLR para acceder directamente a la memoria.  Es importante tomar en cuenta que el hecho de que sea código unsafe deja al programador toda la responsabilidad del código dejándolo a cargo de garantizar que no introduce riesgos de seguridad ni errores de punteros.

Es importante tomar en cuenta ciertos detalles sobre el código no seguro:

  • Debe compilarse con la opción /unsafe Para establecer esta opción del compilador en el entorno de desarrollo de Visual Studio:
    • Abra la página Propiedades del proyecto.
    • Haga clic en la página de propiedades Generar.
    • Active la casilla de verificación Permitir código no seguro.
    • La opción /unsafe del compilador permite compilar el código que utiliza la palabra clave unsafe.
      • Para compilar in.cs en modo no seguro, ejecute:   csc /unsafe in.cs
      • Se pueden definir como no seguros los métodos, tipos y bloques de código.

UNSAFE

Podemos usar  el modificador unsafe en la declaración de un tipo o un miembro así toda la extensión textual del tipo o del miembro se considera, por lo tanto, como contexto no seguro.

Declaración de método:

unsafe static void FastCopy(byte[] src, byte[] dst, int count)

{

    // Unsafe context: can use pointers here.

}

Punteros entre los parámetros:

unsafe static void FastCopy ( byte* ps, byte* pd, int count ) {…}

Podemos tan solo usar un bloque no seguro en el código:

unsafe

{

    // Unsafe context: can use pointers here.

}

TIPOS DE PUNTEROS

En un contexto no seguro, un tipo puede ser un tipo de puntero, un tipo de valor o un tipo de referencia.

Una declaración de tipo de puntero debe tener una de las siguientes:

type* identifier;

void* identifier; //allowed but not recommended

Un puntero puede ser tipo sbyte, byte, short, ushort, int, uint, long, ulong, char, float, double, decimal o bool, cualquier tipo de enum, cualquier tipo de puntero (pointer), cualquier tipo de struct definido por el usuario que sólo contenga campos de tipos no administrados.

Para declarar varios punteros en una misma declaración debe tener en cuenta que únicamente debe escribir * junto al tipo subyacente, no debe escribirse como prefijo en cada nombre de puntero. Por ejemplo:

int* p1, p2, p3;   // Ok

int *p1, *p2, *p3;   // Invalid in C#

El valor de la variable de puntero de tipo myType* es la dirección de una variable de tipo myType .Veamos ejemplos de declaraciones de tipo:

Ejemplo Descripción
int* p p es un puntero a un entero
int** p p es un puntero a un puntero o a un entero
int*[] p p es una matriz unidimensional de punteros a enteros
char* p p es un puntero a un valor char
void* p p es un puntero a un tipo desconocido

Con el operador de direccionamiento indirecto de puntero * podemos tener acceso al contenido de la ubicación señalada por la variable de puntero. Por ejemplo:

int* myVariable;

Acá la expresión *myVariable denota la variable int que se encuentra en la dirección contenida en myVariable.

La tabla siguiente muestra los operadores e instrucciones que pueden funcionar sobre punteros en un contexto no seguro:

Operador/instrucción Utilice
* Realiza el direccionamiento indirecto del puntero.
-> Obtiene acceso a un miembro de un struct a través de un   puntero.
[] Indiza un puntero.
& Obtiene la dirección de una variable.
++ y — Incrementa y reduce los punteros.
+ y – Realiza la aritmética con punteros.
==, !=, <, >, <= y >= Compara los punteros.
stackalloc Asigna memoria en la pila.
fixed (Instrucción) Fija provisionalmente una variable para que pueda   encontrarse su dirección.

Acá les dejo un ejemplo de implementación de código de punteros en C#:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace PunteroCs

{

    class Program

    {

        static unsafe void Main(string[] args)

        {

            int* pi;

            int i, val; //declaraciones de variables i,val y el apuntador pi

                        i=100; //asignamos un valor para i

                        pi=&i; //asignamos la direccion de la variable i en el apuntador pi

                        val=*pi; //asignamos el valor del apuntador pi en la variable val

            Console.WriteLine(“El valor: \t{0,0}”,val); //Imprimimos el valor que pasamos de una variable a otra

                        Console.ReadLine();

            

         }

    }

}

Windows 7 y Microsoft Forefront

     Como parte de la linea de seguridad empresarial Microsoft Forefront tenemos al Microsoft Forefront Client Security el cual esta diseñado para trabajar con Windows 7 y para este sistema operativo proporciona protección unificada contra virus y spyware

     Hoy en dia las organizaciones necesitan proteger sus equipos y servidores contra virus y spyware. Por ello y para evitar los problemas de integracion con nuestra plataforma  IT y excesiva complejidad, algo que dificulta la identificación de amenazas y vulnerabilidades, contamos con las soluciones basadas en la protección unificada, la administración simplificada y la visibilidad y el control críticos que ofrece Microsoft Forefront Client Security.

    Microsoft Client Security se basa en la misma tecnologia de proteccion de Microsoft altamente exitosa y probada por millones de clientes a nivel mundial, de hecho al formar parte de la familia de productos Forefront estos se integran facilmente entre si y con la infraestructura IT de su organizacion y puede ser reemplazada a través de soluciones ínter operables de terceros, permitiendo soluciones de seguridad en profundidad y de fin a fin. Administración, análisis e implementación simplificada le permite proteger más eficientemente las Fuentes de información de su empresa y brinda acceso seguro a las aplicaciones y los servidores.

   En el caso de tener que instalarlo sobre Windows 7 la proteccion contra intrusiones de malware es excelente con una gran expriencia de usuario y como esta pensado para ambientes empresariales su integracion con la plataforma de seguridad supone una reduccion de costos en comparacion de productos de terceros.

    Puedes descargar ya el Beta 2 de Microsoft Forefront Protection Suite el cual incluye:

  • Servidor de administración y panel de información centrales de Forefront Protection Manager 2010 para facilitar la administración, la investigación y entregar respuestas más rápidas.
  • Las versiones de nueva generación de productos de protección Forefront, que incluyen:
  1. Forefront Protection 2010 para Exchange Server SP1
  2. Forefront Online Protection para Exchange
  3. Forefront Protection 2010 para SharePoint
  4. Forefront Threat Management Gateway 2010 con Feature Pack 1
  5. Forefront Endpoint Protection 2010

    Este ultimo producto Forefront Endpoint Protection 2010 proporciona seguridad para Windows 7, aca le dejo el link para que descarguen la version Release Candidate de esta suite:

Descargue Microsoft Forefront Protection Suite Release Candidate

Microsoft Security Essentials

 En el ultimo trimestre del 2009 se libero al publico la version del Microsoft Security Essentials completamente gratis, este antivirus de Microsoft tiene entre sus ventajas el hecho de ser bastante liviano y muy solido, en las pruebas que le hemos hecho se comporta muy bien, facil de instalar y definitivamente una opcion super válida a la hora de necesitar un antivirus
que sea agil y sobretodo gratuito

   Entre los requisitos esta obvamente, la licencia original de Windows, funciona para windows xp, Vista y 7, la instalacion es bastante rapida y sencilla de realizar, en fin un muy buen comienzo para Microsoft en el tema de los antivirus luego del Windows Defender que tuvo tambien muy buenos comentarios por parte de los experto en seguridad

    Aca les dejo el link para que lo descargen y comienzen a usarlo, claro cualquier comentario no duden en hacerlo

Microsoft Security Essentials

WS08 R2 Infraestructura para Trabajar En Cualquier Sitio

Gracias a las nuevas caracteristicas presentes en esta version, Windows Server 2008 R2 provee de toda la infraestructura necesaria para el trabajo desde cualquier localidad con las prestaciones a nivel de rendimiento y seguridad que si estuviesemos desde la red local, todo esto gracias a herramientas como Direct Access y Branch Cache

Vamos a hablar un poco en este articulo acerca de Branch Cache, veamos de que se trata, esta caracteristica se aplica para los casos en los cuales poseemos informacion almacenada en una oficina central y la cual accesamos mediante un enlace WAN desde una sucursal.  Dado que en estos casos es primordial optimizar el uso del ancho de banda del enlace WAN nos vamos a conseguir con situaciones en las que constamente se hace uso de este enlace, por parte de los usuarios de la sucursal, para accesar tal vez al mismo archivo.  Este procedimiento redundante no nos ayuda a optimizar los recursos del servidor, por el contrario puede disminuir considerablemente el performance de la red, es ahi donde entra Branch Cache.

Como funciona Branch Cache? Al realizarse la peticion de un archivo desde la sucursal hacia el servidor central, se guarda un hash que identifica este archivo, luego cuando desde la sucursal se vuelva a pedir el archivo con el mismo hash este archivo no se toma desde la central, usando el enlace WAN, sino que se toma desde la sucursal usando el archivo que previamente ya se pidio.  Exiten 2 formas de configurar Branch Cache, el modo Hosteado y el modo Distribuido, que se diferencian en de quien es que tomamos el archivo que se tomo del servidor principal, puede designarse un terminal para que almacene dicho archivo o simplemente se toma directo de quien lo descargo por primera vez.

Aca les dejo una presentacion para que se orienten un poco acerca de este tema

WS08 R2 Infraestructura para Trabajar En Cualquier Sitio

Nuevos Roles en Windows Server 2008 R2

 Windows ® Server ® 2008 es una plataforma de alto rendimiento, segura y fiable y R2 amplía sus posibilidad de conectividad y control sobre los recursos locales y remotos.

Esta es una versión que se realiza bajo la base  de la versión Windows ® Server ® 2008 y tomando en cuenta las experiencias de los usuarios y aunque Windows 7 está disponible en ambas versiones de 32 y 64 bits, R2 es la primera versión de Server sólo de 64 bits. Para las organizaciones supone un mayor beneficio en forma de reducción de costos y mayor eficiencia, fundamentalmente en las labores de gestión.

Para esta versión se tomaron en cuenta ciertas aéreas claves como lo son Virtualización y Consolidación,  área en la que ahora con mejoras como el Live migration Microsoft se pone a la vanguardia de la tecnología de virtualización, Gestión simplificada, en esta areas tenemos nuevas mejoras como el nuevo Active Directory Administrative Center (ADAC) contruida sobre Power Shell, Web, acá se incluyeron mejoras como IIS 7.5 y la integración de plataforma .NET en la versión Server Core por ultimo esta versión fue diseñada para dar a los usuarios un conjunto sin precedentes de herramientas de protección, monitoreo y mantenimiento de la infraestructura de servidores de su empresa. Eso incluye nuevas características actualizadas de escalabilidad y fiabilidad, como la soporte de hasta 256 núcleos lógicos para instancias sencillas de Windows Server 2008 R2 y hasta 32 núcleos en máquinas virtuales

Lo más interesante de esto es la compatibilidad con Windows 7 tenemos varias herramientas que fueron diseñadas para el trabajo con Windows 7 que sin duda serán de gran ayuda para los profesionales de IT algunas de ellas son DirectAccess, que permite el acceso desde ubicaciones remotas de modo seguro sin VPN, BranchCache, que permite usar más eficientemente accesos en enlaces WAN ya que obtiene los archivos del cache en lugar de usarlos del servidor principal a través del enlace WAN, BitLocker, para manejo y encriptación de datos de forma segura ahora también aplicada a dispositivos extraíbles como pendrives, memorias flash, etc, también características como AppLocker y mejoras en el User Account Control.

Todo esto hace de la versión R2 un hueso duro de roer para la competencia por sus características de seguridad, virtualizacion, estabilidad y escalabilidad, les invito a probarlo ya esta disponible la versión RC que puedes descargar desde el vinculo que les dejo acá y además les dejo la presentación del webcast del dia 13 de agosto de 2009 que habla un poco sobre esto.

 routemap Win server 2008 r2

Evalua Windows Server 2008 R2

Presentacion de los nuevos Roles en Windows Server 2008 R2