FileStreamOptions.PreallocationSize Свойство

Определение

Начальный размер выделения в байтах для файла. Положительное значение действует только при создании или перезаписи обычного файла (Create или CreateNew). Отрицательные значения не допускаются. В других случаях (включая значение по умолчанию 0) он игнорируется. Это значение является подсказкой и не является надежной гарантией. Он не поддерживается в веб-сборках (WASM) и FreeBSD (значение игнорируется). Для Windows, Linux и macOS мы попытаемся предварительно выделить место на диске, чтобы заполнить запрошенный размер выделения. Если это окажется невозможным, операция вызовет исключение. Окончательная длина файла (EOF) будет определяться количеством байтов, записанных в файл.

public:
 property long PreallocationSize { long get(); void set(long value); };
public long PreallocationSize { get; set; }
member this.PreallocationSize : int64 with get, set
Public Property PreallocationSize As Long

Значение свойства

Не отрицательное число, представляющее начальный размер выделения файла в байтах.

Исключения

Если value является отрицательным.

Примеры

В следующем примере кода показано, как использовать PreallocationSize при работе с FileStream объектами:

using System.IO;

public static class PreallocationSizeExample
{
    public static void Main()
    {
        string destinationPath = "destination.dll";

        var openForReading = new FileStreamOptions { Mode = FileMode.Open };
        using var source = new FileStream(typeof(PreallocationSizeExample).Assembly.Location, openForReading);

        var createForWriting = new FileStreamOptions
        {
            Mode = FileMode.CreateNew,
            Access = FileAccess.Write,
            PreallocationSize = source.Length // specify size up-front
        };
        using var destination = new FileStream(destinationPath, createForWriting);

        source.CopyTo(destination); // copies the contents of the assembly file into the destination file
    }
}
Imports System.IO

Module PreallocationSizeExample

    Sub Main()

        Dim destinationPath As String = "destination.dll"
        Dim openForReading = New FileStreamOptions With {
            .Mode = FileMode.Open
        }

        Using source = New FileStream(GetType(PreallocationSizeExample).Assembly.Location, openForReading)

            Dim createForWriting = New FileStreamOptions With {
                .Mode = FileMode.CreateNew,
                .Access = FileAccess.Write,
                .PreallocationSize = source.Length ' specify size up-front
            }

            Using destination = New FileStream(destinationPath, createForWriting)
                source.CopyTo(destination) ' copies the contents of the assembly file into the destination file
            End Using

        End Using

    End Sub

End Module

Комментарии

PreallocationSize можно запрашивать только для режима записи (Access должно быть задано значение Write), а при создании новых файлов (Mode должно быть задано значение Create или CreateNew). В противном FileStream случае конструктор создаст исключение.

Если операционная система, платформа или файловая система не поддерживают предварительное размещение, то PreallocationSize игнорируется. Это относится к веб-сборке (WASM) и FreeBSD.

Если недостаточно места на диске или файловая система не поддерживает файлы заданного размера (например, файл размером 5 ГБ в FAT32), создается исключение.

Длина файла определяется количеством байтов, записанных в файл.

Если файл закрыт, а в не все выделенное пространство записывается, то, что происходит с оставшимся пространством, зависит от платформы. В Windows это пространство больше не зарезервировано для файла. На других платформах, таких как Linux и macOS, он остается выделенным для файла.

Например, предположим, что для файла предварительно выделить 2 ГБ, но записывается только 1 ГБ. После закрытия файла длина файла составляет 1 ГБ во всех операционных системах. В Windows выделенный размер также составляет 1 ГБ, но в Linux и macOS выделенный размер по-прежнему составляет 2 ГБ.

Допустимо написать больше, чем было изначально предраспределлено. Если дискового пространства достаточно, операция должна завершиться успешно.

Применяется к