blob: 8aa9e66deb2247961180b905d63450f0e0f949d4 [file] [log] [blame]
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using System;
using System.IO;
#nullable enable
namespace Lucene.Net.Support.IO
{
/// <summary>
/// Poached from dotnet runtime. This is only available on .NET 6+, so we just made a copy to
/// make passing parameters easier.
/// </summary>
internal sealed class FileStreamOptions
{
//private FileMode _mode = FileMode.Open;
private FileAccess _access = FileAccess.Write; // Changed from Read - we are creating a new file for writing
private FileShare _share = FileShare.Read;
private FileOptions _options;
//private long _preallocationSize;
private int _bufferSize = 8196; // NOTE: This is the default buffer size in Java's BufferedOutputStream
///// <summary>
///// One of the enumeration values that determines how to open or create the file.
///// </summary>
///// <exception cref="T:System.ArgumentOutOfRangeException">When <paramref name="value" /> contains an invalid value.</exception>
//public FileMode Mode
//{
// get => _mode;
// set
// {
// if (value < FileMode.CreateNew || value > FileMode.Append)
// {
// throw new ArgumentOutOfRangeException(nameof(value), "Enum value was out of legal range.");
// }
// _mode = value;
// }
//}
/// <summary>
/// A bitwise combination of the enumeration values that determines how the file can be accessed by the <see cref="FileStream" /> object. This also determines the values returned by the <see cref="System.IO.FileStream.CanRead" /> and <see cref="System.IO.FileStream.CanWrite" /> properties of the <see cref="FileStream" /> object.
/// </summary>
/// <exception cref="T:System.ArgumentOutOfRangeException">When <paramref name="value" /> contains an invalid value.</exception>
public FileAccess Access
{
get => _access;
set
{
if (value < FileAccess.Read || value > FileAccess.ReadWrite)
{
throw new ArgumentOutOfRangeException(nameof(value), "Enum value was out of legal range.");
}
_access = value;
}
}
/// <summary>
/// A bitwise combination of the enumeration values that determines how the file will be shared by processes. The default value is <see cref="System.IO.FileShare.Read" />.
/// </summary>
/// <exception cref="T:System.ArgumentOutOfRangeException">When <paramref name="value" /> contains an invalid value.</exception>
public FileShare Share
{
get => _share;
set
{
// don't include inheritable in our bounds check for share
FileShare tempshare = value & ~FileShare.Inheritable;
if (tempshare < FileShare.None || tempshare > (FileShare.ReadWrite | FileShare.Delete))
{
throw new ArgumentOutOfRangeException(nameof(value), "Enum value was out of legal range.");
}
_share = value;
}
}
/// <summary>
/// A bitwise combination of the enumeration values that specifies additional file options. The default value is <see cref="System.IO.FileOptions.None" />, which indicates synchronous IO.
/// </summary>
/// <exception cref="T:System.ArgumentOutOfRangeException">When <paramref name="value" /> contains an invalid value.</exception>
public FileOptions Options
{
get => _options;
set
{
// NOTE: any change to FileOptions enum needs to be matched here in the error validation
if (value != FileOptions.None && (value & ~(FileOptions.WriteThrough | FileOptions.Asynchronous | FileOptions.RandomAccess | FileOptions.DeleteOnClose | FileOptions.SequentialScan | FileOptions.Encrypted | (FileOptions)0x20000000 /* NoBuffering */)) != 0)
{
throw new ArgumentOutOfRangeException(nameof(value), "Enum value was out of legal range.");
}
_options = value;
}
}
///// <summary>
///// The initial allocation size in bytes for the file. A positive value is effective only when a regular file is being created, overwritten, or replaced.
///// Negative values are not allowed.
///// In other cases (including the default 0 value), it's ignored.
///// </summary>
///// <exception cref="T:System.ArgumentOutOfRangeException">When <paramref name="value" /> is negative.</exception>
//public long PreallocationSize
//{
// get => _preallocationSize;
// set => _preallocationSize = value >= 0 ? value : throw new ArgumentOutOfRangeException(nameof(value), "Non-negative number required.");
//}
/// <summary>
/// The size of the buffer used by <see cref="FileStream" /> for buffering. The default buffer size is 4096.
/// 0 or 1 means that buffering should be disabled. Negative values are not allowed.
/// </summary>
/// <exception cref="T:System.ArgumentOutOfRangeException">When <paramref name="value" /> is negative.</exception>
public int BufferSize
{
get => _bufferSize;
set => _bufferSize = value >= 0 ? value : throw new ArgumentOutOfRangeException(nameof(value), "Non-negative number required.");
}
}
}