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 ГБ.
Допустимо писать больше, чем было первоначально выделение. Если дискового пространства достаточно, операция должна завершиться успешно.