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


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

Использующий изолированное хранилище код ограничен квотой, определяющей максимальный размер ячейки данных, в которой располагаются файлы и каталоги изолированного хранилища. Ее значение определяется политикой безопасности и конфигурируется администраторами. Если при попытке записи данных превышен максимально допустимый размер, создается исключение IsolatedStorageException и операция завершается с ошибкой. Это помогает предотвратить злонамеренные атаки типа "отказ в обслуживании", которые могут привести к отказу приложения от обслуживания запросов из-за переполнения хранилища данных. Чтобы помочь определить, завершится ли неудачей попытка записи по этой причине, класс IsolatedStorage предоставляет три свойства, доступные только для чтения: AvailableFreeSpace, UsedSize и Quota. Эти свойства позволяют определить, будет ли максимально допустимый размер хранилища превышен при попытке записи. При использовании этих свойств следует иметь в виду, что доступ к изолированному хранению может быть параллельным. Поэтому к моменту попытки записи в хранилище оставшееся в нем свободное место, которое было рассчитано таким способом, может быть уже использовано. Тем не менее, это не означает, что нельзя использовать максимальный размер хранилища для определения вероятности достижения верхней границы доступного места хранения.

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

Пример

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

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();
}

См. также

Ссылки

IsolatedStorageFile

Основные понятия

Изолированное хранилище

Практическое руководство. Получение хранилищ для изолированного хранения

Журнал изменений

Дата

Журнал

Причина

Декабрь 2010

Добавлены сведения о свойстве AvailableFreeSpace.

Улучшение информации.