Compartir a través de


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

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 malintencionados que podrían hacer que la aplicación rechazara solicitudes porque se ha llenado el almacenamiento de datos. Para ayudarle a determinar si es probable que un intento de escritura determinado genere un error por este motivo, la clase IsolatedStorage proporciona tres propiedades de solo lectura: AvailableFreeSpace, UsedSize y Quota. Estas propiedades se pueden usar para determinar si la escritura en el almacén hará que se supere 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 IsolatedStorage.Quota depende de la evidencia del ensamblado para funcionar correctamente. Como resultado, esta propiedad se debe recuperar solo en los objetos IsolatedStorageFile creados mediante el método GetUserStoreForAssembly, GetUserStoreForDomain o GetStore. Los objetos IsolatedStorageFile creados de cualquier otra forma (como objetos devueltos por el método GetEnumerator) no devolverán un tamaño máximo preciso.

Ejemplo

En el ejemplo de código siguiente se obtiene un almacén aislado, se crean unos cuantos archivos y se recupera la propiedad AvailableFreeSpace. El espacio restante se indica en bytes.

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

Public Class CheckingSpace
    Public Shared Sub Main()
        ' Get an isolated store for this assembly and put it into an
        ' IsolatedStoreFile object.
        Dim isoStore As IsolatedStorageFile = _
            IsolatedStorageFile.GetStore(IsolatedStorageScope.User Or _
            IsolatedStorageScope.Assembly, 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)

        Console.WriteLine(isoStore.AvailableFreeSpace + " bytes of space remain in this isolated store.")
    End Sub ' End of Main.
End Class
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);

        Console.WriteLine(isoStore.AvailableFreeSpace + " bytes of space remain in this isolated store.");
    } // End of Main.
}
using namespace System;
using namespace System::IO;
using namespace System::IO::IsolatedStorage;

public ref 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, (Type ^)nullptr, (Type ^)nullptr);

        // Create a few placeholder files in the isolated store.
        gcnew IsolatedStorageFileStream("InTheRoot.txt", FileMode::Create, isoStore);
        gcnew IsolatedStorageFileStream("Another.txt", FileMode::Create, isoStore);
        gcnew IsolatedStorageFileStream("AThird.txt", FileMode::Create, isoStore);
        gcnew IsolatedStorageFileStream("AFourth.txt", FileMode::Create, isoStore);
        gcnew IsolatedStorageFileStream("AFifth.txt", FileMode::Create, isoStore);

        Console::WriteLine(isoStore->AvailableFreeSpace + " bytes of space remain in this isolated store.");
    } // End of Main.
};

int main()
{
    CheckingSpace::Main();
}

Vea también

Referencia

IsolatedStorageFile

Conceptos

Almacenamiento aislado

Cómo: Obtener los almacenes de almacenamiento aislado

Historial de cambios

Fecha

Historial

Motivo

Diciembre de 2010

Agregada información sobre la propiedad AvailableFreeSpace.

Mejora de la información.