Поделиться через


Практическое руководство. Предупреждение нехватки места при изолированном хранении

Код, использующий изолированное хранилище, ограничивается квотой , указывающей максимальный размер отсека данных, в котором существуют изолированные файлы и каталоги хранилища. Квота определяется политикой безопасности и настраивается администраторами. Если максимальный допустимый размер превышается при попытке записи данных, IsolatedStorageException создается исключение и операция завершается ошибкой. Это помогает предотвратить вредоносные атаки типа "отказ в обслуживании", которые могут привести к отказу приложения от запросов, так как хранилище данных заполнено.

Чтобы определить, может ли данная попытка записи завершиться ошибкой по этой причине, IsolatedStorage класс предоставляет три свойства, доступные только для чтения: AvailableFreeSpace, UsedSizeи Quota. Эти свойства можно использовать для определения того, будет ли запись в хранилище привести к превышению максимального допустимого размера хранилища. Имейте в виду, что к изолированному хранилищу можно получить доступ одновременно; поэтому, когда вы вычисляете объем оставшегося пространства, оно может быть использовано к тому моменту, как вы попытаетесь записать данные в хранилище. Однако можно использовать максимальный размер хранилища, чтобы определить, достигнут ли верхний предел доступного хранилища.

Свойство Quota зависит от данных сборки для правильной работы. По этой причине необходимо получить это свойство только для IsolatedStorageFile объектов, созданных с помощью GetUserStoreForAssemblyметода , GetUserStoreForDomainили GetStore метода. IsolatedStorageFile Объекты, созданные каким-либо другим способом (например, объекты, возвращаемые из GetEnumerator метода), не возвращают точный максимальный размер.

Пример

Следующий пример кода получает изолированное хранилище, создает несколько файлов и извлекает AvailableFreeSpace свойство. Оставшееся пространство сообщается в байтах.

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.
}
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 Class

См. также