Mostrando entradas con la etiqueta Archivos. Mostrar todas las entradas
Mostrando entradas con la etiqueta Archivos. Mostrar todas las entradas

miércoles, 22 de julio de 2015

Receta C# No. 5-22: Cómo Manipular la Lista de Control de Acceso (ACL) de un Archivo o Directorio

Índice

0. Introducción
1. Problema
2. Solución
3. Discusión de la Solución
3.1 ¿Qué es una Lista de Control de Acceso (ACL)?
3.2 Método GetAccessControl
3.3 Clase FileSecurity
3.4 Clase DirectorySecurity
4. Práctica: Código C#
5. Conclusiones
6. Glosario
7. Literatura & Enlaces

0. Introducción

Nueva receta C# en la que aprenderemos a modificar la lista de control de acceso (o Access Control List) de un archivo o directorio. Describiremos varios de los elementos de programa disponibles para llevar a cabo esta tarea, como son: GetAccessSecurity, SetAccessSecurity, FileSecurity, y DirectorySecurity. Además, definiremos el concepto una Access Control List (ACL) en el ámbito de un sistema de archivos. ¡Empecemos!

1. Problema

Se nos ha pedido modificar la lista de control de acceso (ACL) de un archivo o directorio en uno de los equipos de acceso restringido.

2. Solución

Las clases System.IO.File y System.IO.Directory permiten obtener y establecer los permisos de una lista de control de acceso por medio de los métodos GetAccessControl y SetAccessControl, respectivamente.

3. Discusión de la Solución

3.1 ¿Qué es una Lista de Control de Acceso (ACL)?

Una Lista de Control de Acceso en lo que se refiere a un sistema de archivos, consiste en una lista de permisos de un objeto (e.g., archivo, directorio). Los permisos especifican los usuarios y procesos que tienen autorización para acceder a un determinado objeto. Además de los permisos, se especifican cuáles operaciones están permitidas sobre ese objeto.

Una ejemplo podría ser:

Objeto1:ACL{
John: Lectura; Escritura
Edward: Lectura
}

Esta pseudo-estructura nos está diciendo que el usuario John tiene acceso de Lectura más Escritura sobre el objeto Objeto1; mientras tanto, el usuario Edward tiene únicamente el permiso de Lectura.

3.2 Método GetAccessControl

El método GetAccessControl de las clases File [2] y Directory [3] retorna la lista de control de acceso (ACL) de un archivo o directorio, respectivamente. Ambas ediciones de este método ofrecen versiones sobrecargadas.
Método File.GetAccessControl
Figura 1. Método sobrecargado File.GetAccessControl [2].
Método sobrecargado Directory.GetAccessControl
Figura 2. Método sobrecargado Directory.GetAccessControl [3].

3.3 Clase FileSecurity

La clase FileSecurity [4] (namespace System.Security.AccessControl) representa el control de acceso a un archivo. Este control de acceso es establecido por un conjunto de reglas. Al mismo tiempo, cada regla es representada por un objeto de la clase FileSystemAccessRule [5]. (Nota: Una regla es análoga a una entrada de un control de acceso (ACE [6]), es decir el registro o entrada en la estructura de datos que representa la lista de control de acceso.)

3.4 Clase DirectorySecurity

La clase DirectorySecurity [7] (namespace System.Security.AccessControl) representa el control de acceso a un directorio.

4. Práctica: Código C#

Escribamos una aplicación consola en C# para demostrar la manipulación de la ACL de un archivo. Específicamente llevaremos a cabo las siguientes operaciones:
  • Creación de un archivo temporal, 
  • Denegación de acceso al archivo a todos los usuarios, y 
  • Intento de acceso al archivo.
Con la invocación de Path.GetRandomFileName (línea 23) creamos un nombre de archivo aleatorio (Receta C# No. 5-21: Cómo Obtener un Nombre de Archivo Aleatorio). Se crea un archivo con el nombre recién generado en la línea 25.


En la invocación del método EstablecerRegla (línea 34) ocurren las siguientes operaciones en su cuerpo de declaración:
  • Línea 65: Se obtiene un objeto FileSecurity a partir del archivo referenciado con rutaArchivo.
  • Línea 68: Agregar el permiso al archivo rutaArchivo para la cuenta "Todos".
  • Línea 72: Establece la nueva regla para el archivo pasado como argumento con el método File.SetAccessControl.
En el bloque try/catch (líneas 42-54) se intenta crear un archivo con el mismo nombre asignado a la variable nombreArchivo. Esto ocasionará que se generé una excepción.

Compilación: 

  1. csc /target:exe AccesoArchivo.cs

Ejecución assembly

  1. .\AccesoArchivo.exe

> Prueba de ejecución: 
Ejecución assembly AccesoArchivo.exe
Figura 3. Ejecución assembly AccesoArchivo.exe.
En la Figura 3 se muestra resaltado el mensaje de excepción. Este mensaje se debe al intento de alterar el archivo 32ej20wp.jgl.

5. Conclusiones

Ha quedado demostrado que es posible asignar permisos de acceso a un archivo por medio de la manipulación de la lista de control de acceso (ACL). Este tipo de controles son necesarios cuando queremos restringir el acceso a lectura, escritura a un archivo o directorio; por ejemplo, archivos o directorios de trabajo de un usuario o una aplicación.


En la próxima receta C# haremos algo interesante: compresión de datos.

6. Glosario

  • .NET
  • ACE
  • ACL
  • Archivo
  • Control de acceso
  • Cuenta
  • Lista de control de acceso
  • Restricción
  • Usuario

7. Literatura & Enlaces

[1]: Visual C# 2010 Recipes by Allen Jones and Adam Freeman. Copyright 2010 Allen Jones and Adam Freeman, 978-1-4302-2525-6.
[2]: File.GetAccessControl Method (System.IO) - https://msdn.microsoft.com/en-us/library/System.IO.File.GetAccessControl(v=vs.110).aspx
[3]: Directory.GetAccessControl Method (System.IO) - https://msdn.microsoft.com/en-us/library/System.IO.Directory.GetAccessControl(v=vs.110).aspx
[4]: FileSecurity Class (System.Security.AccessControl) - https://msdn.microsoft.com/en-us/library/system.security.accesscontrol.filesecurity(v=vs.110).aspx
[5]: FileSystemAccessRule Class (System.Security.AccessControl) - https://msdn.microsoft.com/en-us/library/system.security.accesscontrol.filesystemaccessrule(v=vs.110).aspx
[6]: Access Control Entries (Windows) - https://msdn.microsoft.com/en-us/library/windows/desktop/aa374868(v=vs.85).aspx
[7]: DirectorySecurity Class (System.Security.AccessControl) - https://msdn.microsoft.com/en-us/library/system.security.accesscontrol.directorysecurity(v=vs.110).aspx
[8]: Receta C# No. 5-21: Cómo Obtener un Nombre de Archivo Aleatorio - http://ortizol.blogspot.com/2015/07/receta-csharp-no-5-21-como-obtener-un-nombre-de-archivo-aleatorio.html


V

lunes, 20 de julio de 2015

Receta C# No. 5-20: Cómo Acceder a un Puerto COM

Índice

0. Introducción
1. Problema
2. Solución
3. Discusión de la Solución
3.1 Clase SerialPort
3.2 Método static GetPortNames
4. Práctica: Código C#
5. Conclusiones
6. Glosario
7. Literatura & Enlaces

0. Introducción

Podríamos en algún momento requerir comunicarnos con un dispositivo que cuente únicamente con la interfaz serial COM, ya sea para escribir o recuperar datos; es por eso que en esta receta C# explicaremos el procedimiento para acceder a un puerto de esta categoría y escribir información sobre él. Para ello utilizaremos la clase SerialPort (NS: System.IO.Ports).

1. Problema

Debemos escribir datos sobre un puerto serial COM.

2. Solución

El namespace System.IO.Ports ofrece la clase SerialPort; clase diseñada para representar un puerto serial y permitir la comunicación para escritura y lectura de datos.

3. Discusión de la Solución

3.1 Clase SerialPort

La clase SerialPort [2] (System.IO) representa un puerto serial. Podemos usar la funcionalidad de esta clase para controlar un puerto serial. Entre las funcionalidades específicas de esta clase están [2]:
  • Lectura/escritura sincrónica y orientada a eventos, 
  • Acceso a propiedades del controlador, 
Por otra parte, entre los sistemas de codificación de caracteres soportados por esta clase están:
  • ASCIIEncoding
  • UTF8Encoding
  • UnicodeEncoding
  • UTF32Encoding

3.2 Método static GetPortNames

Para obtener los nombres de los puertos seriales del equipo local usamos el método GetPortNames [3].

Ejemplo de uso:

Con la invocación del método static SerialPort.GetPortNames (línea 16) obtenemos un arreglo de objetos string con los nombres de los puertos seriales instalados en el equipo local. Con el ciclo foreach (línea 19-22) mostramos los nombres de los puertos en salida estándar.

Compilación: 


  1. csc /target:exe UsoGetPortNames.cs

Ejecución assembly:


  1. .\UsoGetPortNames.exe

> Prueba de ejecución: http://ideone.com/hFMK8w

> Prueba de ejecución: 
Ejecución assembly UsoGetPortNames.exe
Figura 1. Ejecución assembly UsoGetPortNames.exe.

4. Práctica: Código C#

Con la siguiente aplicación consola escribiremos una cadena de caracteres en el puerto serial COM1:

En la sentencia contextual using creamos un objeto SerialPort (línea 15) con el cual referenciamos el puerto serial COM1. En las líneas establecemos propiedades propias de esta categoría de puertos: velocidad de transmisión, paridad, tiempo de espera de lectura, etc. (líneas 18-21).

Con 

puerto.Open();


(línea 24) abrimos la conexión del puerto COM1. Con puerto.Write escribimos la cadena de caracteres Blog xCSw en el puerto.


Compilación: 


  1. csc /target:exe EscrituraEnCom1.cs

Ejecución assembly


  1. .\EscrituraEnCom1.exe

> Prueba de ejecución: 
Ejecución assembly EscrituraEnCom1.exe
Figura 2. Ejecución assembly EscrituraEnCom1.exe.

5. Conclusiones

Aprendimos que el namespace System.IO.Ports provee la clase SerialPort para permitir establecer conexión con puertos seriales COM para permitir la escritura y lectura de datos. En código C# vimos que las operaciones para establecer conexión con un puerto COM son relativamente sencillas: basta con instanciar, establecer propiedades, abrir el puerto, y empezar a escribir datos.


En la receta C# número 21 aprenderemos a obtener un nombre aleatorio para un archivo.

8. Glosario

  • COM1
  • Dato
  • Orientado a eventos
  • Puerto
  • Puerto serial

9. Literatura & Enlaces

[1]: Visual C# 2010 Recipes by Allen Jones and Adam Freeman. Copyright 2010 Allen Jones and Adam Freeman, 978-1-4302-2525-6.
[2]: SerialPort Class (System.IO.Ports) - https://msdn.microsoft.com/en-us/library/system.io.ports.serialport(v=vs.110).aspx
[3]: SerialPort.GetPortNames Method (System.IO.Ports) - https://msdn.microsoft.com/en-us/library/system.io.ports.serialport.getportnames(v=vs.110).aspx


V

Receta C# No. 5-19: Monitorización de Cambios en un Sistema de Archivos

Índice

0. Introducción
1. Problema
2. Solución
3. Discusión de la Solución
3.1 Generalidades
3.2 Clase FileSystemWatcher
4. Práctica: Código C#
5. Conclusiones
6. Glosario
7. Literatura & Enlaces

0. Introducción

Haremos algo muy interesante en esta receta C# número 19: monitorizar los cambios realizados sobre un sistema de archivos: creación, renombramiento, eliminación, modificación. Este tipo de monitorización resulta útil para aplicaciones y procesos de negocio que se activan una vez se detecta la creación de un archivo, o cambios efectuados sobre archivos existentes. Estudiáremos la clase FileSystemWatcher que ofrece la funcionalidad para detectar cambios en un sistema de archivos.

1. Problema

Debemos monitorizar los cambios en un sistema de archivos y ejecutar operaciones de acuerdo al evento (e.g., modificación, creación, eliminación) generado.

2. Solución

La clase FileSystemWatcher (System.IO) permite especificar una ruta a monitorizar y ejecutar operaciones asociadas a eventos de archivos.

3. Discusión de la Solución

3.1 Generalidades

La monitorización de un sistema de archivos es una tarea común en cierto tipo de aplicaciones y procesos de negocio, donde una vez se detecte un cambio en una o varias rutas del sistema de archivos se disparan acciones para reaccionar a esos cambios. Esta monitorización se puede llevar a cabo de dos maneras:
  • Escaneo periódico. Este enfoque resulta útil cuando se requiere una constante monitorización sobre el sistema de archivos. Sin embargo es costoso a nivel de recursos.
  • Escaneo con temporizador. Este tipo de enfoque tiene en consideración los recursos (e.g., tiempo de procesador y espacio de memoria), sin embargo la detección de cambios puede retrasarse debido a que el escaneo se realiza cada cierto período.
La solución al trade-off de los dos enfoques anteriores es recurrir a eventos de archivos de Windows [1]. Para ello debemos utilizar la clase FileSystemWatcher.

3.2 Clase FileSystemWatcher

La clase FileSystemWatcher [2] está diseñada para escuchar la notificaciones generadas por el sistema de archivos y lanzar eventos cuando se detecten cambios en directorios y archivos.

Entre las propiedades sobresalientes de esta clase tenemos:
  • Path: ruta a monitorizar, 
  • Filter: tipos de archivos a monitorizar, 
  • NotifyFilter: tipos de cambios a monitorizar.
Y los eventos clave a los que reacciona:
  • Created
  • Deleted
  • Renamed, y 
  • Changed.
Ejemplo de uso:

En las línea 27 validamos el número de argumentos pasados desde la línea de comandos por parte del usuario. Sobre la línea 34 creamos un objeto FileSystemWatcher . Asignamos el directorio a monitorizar: monitor.Path = args[1];.


Con la propiedad NotifyFilter (línea 40) especificamos los tipos de cambios a monitorizar. Los valores asignados se realizan con la operación bitwise y la enumeración NotifyFilters [3].

Más adelante, línea 44, especificamos los tipos de archivos a monitorizar; en este caso todos los archivos con extensión .txt.


Adicionamos los manejadores de eventos (líneas 47-50). Y damos inicio a la monitorización con: 

monitor.EnableRaisingEvents = true;


La aplicación no se detiene hasta que el usuario presione la tecla q.

Compilación: 


  1. csc /target:exe Monitor.cs

Ejecución assembly


  1. .\Monitor.exe


> Prueba de ejecución:
Ejecución assembly Monitor.exe
Animación 1. Ejecución assembly Monitor.exe.

4. Práctica: Código C#

A continuación un ejemplo práctico para afianzar nuestro conocimiento de la clase FileSystemWatcher:

Crearemos una aplicación consola que monitoriza la creación y eliminación de un archivo. El usuario simplemente presiona la tecla Enter para continuar con una operación: creación y eliminación.

Con la sentencia using creamos un objeto FileSystemWatcher (línea 16). Asignamos la ruta a monitorizar con: 

monitor.Path = Application.StartupPath;


Luego, línea 22, indicamos que se debe monitorizar todo tipo de archivo. Además, se deben monitorizar todos los subdirectorios:

monitor.IncludeSubdirectories = true;


Establecemos el manejador de eventos para la creación y eliminación de archivo (líneas 28 y 29):

monitor.Created += new FileSystemEventHandler(OnCreatedODeleted);
monitor.Deleted += new FileSystemEventHandler(OnCreatedODeleted);


Habilitamos el inicio de la monitorización (línea 32):

monitor.EnableRaisingEvents = true;

El usuario deberá presionar Enter para crear y eliminar el archivo. Cuando esto suceda se mostrará un mensaje de notificación en la salida estándar.

Compilación:


  1. csc /target:exe MonitorCreacionEliminacionArchivo.cs

Ejecución assembly:


  1. .\MonitorCreacionEliminacionArchivo.exe

> Prueba de ejecución:
Ejecución assembly MonitorCreacionEliminacionArchivo.exe
Animación 2. Ejecución assembly MonitorCreacionEliminacionArchivo.exe.

5. Conclusiones

Hemos comprendido los básicos para la monitorización de cambios en un sistema de archivos. Conocimiento útil para ser utilizado en aquellas aplicaciones o procesos de negocios que interactúan cuando se genera un cambio en archivos y directorios. La clase FileSystemWatcher definitivamente ofrece esta funcionalidad de forma intuitiva.


En la próxima receta C# veremos cómo acceder a un puerto COM.

6. Glosario

  • Archivo
  • Bitwise
  • Clase
  • Directorio
  • Evento
  • Manejador de evento
  • Monitorizar
  • Proceso de negocio
  • Usuario

7. Literatura & Enlaces

[1]: Visual C# 2010 Recipes by Allen Jones and Adam Freeman. Copyright 2010 Allen Jones and Adam Freeman, 978-1-4302-2525-6.
[2]: FileSystemWatcher Class (System.IO) - https://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher(v=vs.110).aspx
[3]: NotifyFilters Enumeration (System.IO) - https://msdn.microsoft.com/en-us/library/system.io.notifyfilters(v=vs.110).aspx


V

Receta C# No. 5-18: Cómo Usar Almacenamiento Aislado

Índice

0. Introducción
1. Problema
2. Solución
3. Discusión de la Solución
3.1 Generalidades
3.2 Políticas de seguridad de la CLR
3.3 Clase IsolatedStorageFile
3.4 Clase IsolatedStorageFileStream
4. Práctica: Código C#
5. Conclusiones
6. Glosario
7. Literatura & Enlaces

0. Introducción

Receta C# número 18. En esta receta C# aprenderemos a usar el mecanismo de almacenamiento aislado para crear archivos de trabajo, ya sea de aplicación o de usuario, en la ubicación del perfil de usuario. Esto como ya veremos es útil debido a restricciones de acceso/escritura sobre medios de almacenamiento impuestas por las políticas de FileIOPermission. Para ello tendremos que usar dos clases especializadas en almacenamiento aislado: IsolatedStorageFile, y IsolatedStorageFileStrea. ¡Manos a la obra!

1. Problema

Nuestra aplicación requiere crear archivos extra para almacenamiento de datos de usuario y de aplicación, sin embargo las políticas de acceso impuestas por FileIOPermission restringen el acceso a la unidad de disco duro local.

2. Solución

El namespace System.IO.IsolatedStorage contiene las clases IsolatedStorageFile y IsolatedStorageFileStream. Con estas clases podemos pasar por alto los requerimientos de seguridad impuestos por FileIOPermission, y en consecuencia, poder escribir en el directorio del perfil de usuario.

3. Discusión de la Solución

3.1 Generalidades

Entre las características que soporta .NET Framework está la de permitir a una aplicación de confianza acceder a almacenamiento aislado. Esto quiere decir que desde una aplicación podemos escribir y leer datos en un sistema de archivos virtual que la Common Language Runtime (CLR) gestiona. Cuando una aplicación requiere trabajar con archivos adicionales externamente para escribir datos de aplicación o de usuario, con este sistema de archivos virtual podemos crear archivos en el directorio del perfil de usuario; i.e.:
  • Windows XPC:\Documents and Settings\[Usuario]\Local Settings\Application Data\isolated storage
  • Windows 7 (o superior): C:\Users\Usuario\AppData\Local\IsolatedStorage
Continuando, una de las razones que justifica el uso de almacenamiento es [1]
"One reason you might use isolated storage is to give a partially trusted application limited ability to store data."
Además: 
"Another reason you might use an isolated store is to better secure data. For example, data in one user's isolated store will restricted from another nonadministrative user."

3.2 Políticas de Seguridad de la CLR

De manera predeterminada, la CLR permite a aplicaciones locales acceder a cualquier archivo, debido a que no tiene impuestas políticas de seguridad por FileIOPermission [2].

Esta última clase está diseñada para establecer políticas de acceso a archivos y directorios. Por ejemplo:

FileIOPermission f = new FileIOPermission(PermissionState.None);
f.AllLocalFiles = FileIOPermissionAccess.Read;

try
{
f.Demand();
}
catch(SecurityException s)
{
Console.WriteLine(s.Message);
}

En las primeras dos líneas se especifican los niveles de permisos, que en esta caso corresponden con el acceso de sólo lectura a todos los archivos de las unidades de disco configuradas en el sistema operacional.

Por otra parte, las aplicaciones que se ejecutan desde un servidor remoto de manera automática la CLR les asigna menos permisos de acceso y lectura a las unidades de disco locales; sin embargo, es posible acceder a almacenamiento aislado gracias a IsolatedStoragePermission [3]. Es importante considerar [1]:
"The security policy also limits the maximum amount of space that can be used in an isolated store."

3.3 Clase IsolatedStorageFile

La clase IsolatedStorageFile [4] representa un área de almacenamiento aislada para contener archivos y directorios.

Entre las funcionalidades sobresalientes tenemos [4]:
  • las aplicaciones pueden usar el almacenamiento aislado para crear archivos y carpetas sin necesidad de especificar ninguna ruta específica en el sistema de archivos.
  • no es posible que otras aplicaciones de código administrado accedan a este almacenamiento aislado, debido a que el almacenamiento corresponde a un ámbito de assembly específico.
Ejemplo de uso:

En la línea 14 creamos un objeto IsolatedStorageFile para la obtención de almacenamiento aislado para la aplicación y assembly actuales. En las líneas 17-24:
  • Línea 18: Creamos un directorio en la raíz llamado DirectorioSuperior con el método CreateDirectory.
  • Línea 19: Dentro del directorio recién creado, añadimos un subdirectorio llamado Subdirectorio.
  • Línea 23: Creamos un archivo llamado ArchivoTexto.txt con el método CreateFile.
Compilación:

  1. csc /target:exe UsoIsolatedStorageFile.cs

Ejecución assembly:

  1. .\UsoIsolatedStorageFile.exe

> Prueba de ejecución:
Ejecución assembly UsoIsolatedStorageFile.exe
Figura 1. Ejecución assembly UsoIsolatedStorageFile.exe.

Después de haberse ejecutado este assembly buscamos por los archivos y directorios creados en el directorio de almacenamiento aislado:
Resultado ejecución assembly UsoIsolatedStorageFile.exe
Figura 2. Resultado ejecución assembly UsoIsolatedStorageFile.exe.

3.4 Clase IsolatedStorageFileStream

La clase IsolatedStorageFileStream [5] está diseñada para la permitir la escritura, lectura, creación de archivos en almacenamiento aislado.

(Nota: En la siguiente sección usaremos esta clase para demostrar sus capacidades de escritura en almacenamiento aislado.)

4. Práctica: Código C#

Demostración de acceso a una locación de almacenamiento aislado en C#:

En la línea 16 creamos un objeto IsolatedStorageFile a partir de la invocación de GetUserStoreForAssembly para la obtención de almacenamiento aislado de ámbito local para el assembly actual. Creamos un directorio en la raíz del almacenamiento aislado con CreateDirectory: línea 19.


Más adelante, línea 22, creamos un objeto Stream para la escritura de datos sobre el archivo Resportes.txt. Apartir del objeto anterior instanciamos un objeto tipo StreamWriter para escribir datos sobre el archivo en cuestión.

Después: 
  • Línea 32: Muestra el tamaño en bytes del espacio utilizado por el almacenamiento aislado: almacenamiento.UsedSize.
  • Línea 33: Mostramos el ámbito del almacenamiento aislado: almacenamiento.Scope.
  • Línea 38: Obtenemos arreglo de objetos String con los nombres de archivos contenidos en el almacenamiento aislado: almacenamiento.GetFileNames("*.*").
Compilación:


  1. csc /target:exe AlmacenamientoAislado.cs

Ejecución assembly:

\AlmacenamientoAislado.exe

> Prueba de ejecución:
Ejecución assembly AlmacenamientoAislado.exe
Figura 2. Ejecución assembly AlmacenamientoAislado.exe.

5. Conclusiones

Aprendimos que es posible asignar almacenamiento aislado (isolated store) para aquellas aplicaciones que poseen restricciones de acceso para escritura y lectura en los sistemas de archivos locales. Vimos que este tipo de solución es práctico para aplicaciones de confianza que requieren escribir datos. También notamos que el almacenamiento es gestionado por la CLR en un sistema de archivos virtual.


En la siguiente receta C# aprenderemos a monitorizar cambios en el sistema de archivos.

6. Glosario

  • Aplicación
  • Archivo
  • CLR
  • Directorio
  • Política de seguridad
  • Restricción
  • Servidor remoto

7. Literatura & Enlaces

[1]: Visual C# 2010 Recipes by Allen Jones and Adam Freeman. Copyright 2010 Allen Jones and Adam Freeman, 978-1-4302-2525-6.
[2]: FileIOPermission Class (System.Security.Permissions) - https://msdn.microsoft.com/en-us/library/system.security.permissions.fileiopermission(v=vs.110).aspx
[3]: IsolatedStoragePermission Class (System.Security.Permissions) - https://msdn.microsoft.com/en-us/library/system.security.permissions.isolatedstoragepermission(v=vs.110).aspx
[4]: IsolatedStorageFile Class (System.IO.IsolatedStorage) - https://msdn.microsoft.com/en-us/library/system.io.isolatedstorage.isolatedstoragefile(v=vs.110).aspx
[5]: IsolatedStorageFileStream Class (System.IO.IsolatedStorage) - https://msdn.microsoft.com/en-us/library/system.io.isolatedstorage.isolatedstoragefilestream(v=vs.110).aspx


V