Compartir a través de


Cómo: Prever condiciones de espacio insuficiente con el almacenamiento aislado

Actualización: noviembre 2007

El código que usa almacenamiento aislado está restringido por una cuota que especifica el tamaño máximo del compartimiento de datos en el que se ubican los archivos y directorios de almacenamiento aislado. La directiva de seguridad define este valor y los administradores lo pueden configurar. Si se supera el tamaño máximo al intentar escribir datos, se inicia una IsolatedStorageException y se genera un error en la operación. Esto contribuye a impedir ataques de denegación de servicio maliciosos que podrían hacer que la aplicación rechazara solicitudes porque se ha llenado el almacén de datos. Para ayudarle a determinar si es probable que un intento de escritura determinado genere un error por este motivo, el almacenamiento aislado proporciona dos propiedades de sólo lectura: IsolatedStorage.CurrentSize y IsolatedStorage.MaximumSize. Estas dos propiedades se pueden usar para determinar si escribir en el almacén hará que se sobrepase el tamaño máximo permitido del almacén. Cuando se usan estas propiedades hay que tener en cuenta el hecho de que puede haber accesos simultáneos al almacenamiento aislado. Por ello, si se calcula la cantidad de almacenamiento que queda, el espacio de almacenamiento podría haberse consumido en el momento en que se intenta escribir en el almacén. Sin embargo, esto no impide el uso del tamaño máximo del almacén para ayudar a determinar si el límite superior del almacenamiento disponible está a punto de alcanzarse.

Otra consideración importante es que la propiedad de tamaño máximo depende de la evidencia del ensamblado para funcionar correctamente. En consecuencia, sólo se debe llamar a este método en objetos IsolatedStorageFile creados utilizando GetUserStoreForAssembly(), GetUserStoreForDomain(), o GetStore(). Los objetos IsolatedStorageFile que se han creado de cualquier otro modo (por ejemplo devueltos por el argumento GetEnumerator()) no devolverán un tamaño máximo preciso.

Ejemplo de AnticipatingOutOfSpaceConditions

El siguiente ejemplo de código obtiene un almacén aislado, crea unos cuantos archivos y calcula el espacio que queda en el almacén. El espacio que queda se indica en bytes.

Imports System
Imports System.IO
Imports System.IO.IsolatedStorage

Public Module modmain

   Sub Main()

      ' Get an isolated store for user, domain, and assembly and put it into 
      ' an IsolatedStorageFile object.

      Dim isoStore As IsolatedStorageFile
      isoStore = IsolatedStorageFile.GetStore(IsolatedStorageScope.User Or IsolatedStorageScope.Assembly Or IsolatedStorageScope.Domain, Nothing, Nothing)

      ' Create a few placeholder files in the isolated store.

      Dim aStream As New IsolatedStorageFileStream("InTheRoot.txt", FileMode.Create, isoStore)
      Dim bStream As New IsolatedStorageFileStream("Another.txt", FileMode.Create, isoStore)
      Dim cStream As New IsolatedStorageFileStream("AThird.txt", FileMode.Create, isoStore)
      Dim dStream As New IsolatedStorageFileStream("AFourth.txt", FileMode.Create, isoStore)
      Dim eStream As New IsolatedStorageFileStream("AFifth.txt", FileMode.Create, isoStore)

      ' Use the CurrentSize and MaximumSize methods to find remaining
      ' space.
      ' Cast that number into a long type and put it into a variable.

      Dim spaceLeft As Long
      spaceLeft = CLng((isoStore.MaximumSize.ToString) - isoStore.CurrentSize.ToString)

      Console.WriteLine("CurrentSize: " + isoStore.CurrentSize.ToString)

      Console.WriteLine("Space Left: " + spaceLeft.ToString + " (might be very large if no quota is set)")

   End Sub
End Module
using System;
using System.IO;
using System.IO.IsolatedStorage;

public class CheckingSpace{

   public static void Main(){

      // Get an isolated store for this assembly and put it into an
      // IsolatedStoreFile object.

      IsolatedStorageFile isoStore =  IsolatedStorageFile.GetStore(IsolatedStorageScope.User | IsolatedStorageScope.Assembly, null, null);

      // Create a few placeholder files in the isolated store.

      new IsolatedStorageFileStream("InTheRoot.txt", FileMode.Create, isoStore);
      new IsolatedStorageFileStream("Another.txt", FileMode.Create, isoStore);
      new IsolatedStorageFileStream("AThird.txt", FileMode.Create, isoStore);
      new IsolatedStorageFileStream("AFourth.txt", FileMode.Create, isoStore);
      new IsolatedStorageFileStream("AFifth.txt", FileMode.Create, isoStore);

      // Use the CurrentSize and MaximumSize methods to find remaining 
      // space.
      // Cast that number into a long type and put it into a variable.
      long spaceLeft =(long)(isoStore.MaximumSize - isoStore.CurrentSize);

      Console.WriteLine(spaceLeft+ " bytes of space remain in this isolated store.");
      
   }// End of Main.

}

Vea también

Conceptos

Cómo: Obtener almacenes para el almacenamiento aislado

Referencia

IsolatedStorageFile

Otros recursos

Realizar tareas de almacenamiento aislado