Files
swift-nio/Sources/_NIOFileSystem/ByteBuffer+FileSystem.swift
George Barnett 66a85ba0e2 Add back _NIOFileSystem (#3367)
Motivation:

In #3363 we converted `_NIOFileSystem` to `NIOFileSystem` and removed
the (unreleased) overloads for FilePath/NIOFilePath. This change adds
back `_NIOFileSystem` such that it matches the API it had at 2.86.0.

Modifications:

- Add back `_NIOFileSystem` and `_NIOFileSystemFoundationCompat` such
that their API is at 2.86.0

Result:

- `NIOFileSystem` uses `NIOFilePath`
- `_NIOFileSystem` uses `FilePath`
2025-09-02 14:56:58 +01:00

98 lines
3.5 KiB
Swift

//===----------------------------------------------------------------------===//
//
// This source file is part of the SwiftNIO open source project
//
// Copyright (c) 2025 Apple Inc. and the SwiftNIO project authors
// Licensed under Apache License v2.0
//
// See LICENSE.txt for license information
// See CONTRIBUTORS.txt for the list of SwiftNIO project authors
//
// SPDX-License-Identifier: Apache-2.0
//
//===----------------------------------------------------------------------===//
import NIOCore
@available(macOS 10.15, iOS 13.0, watchOS 6.0, tvOS 13.0, *)
extension ByteBuffer {
/// Reads the contents of the file at the path.
///
/// - Parameters:
/// - path: The path of the file to read.
/// - maximumSizeAllowed: The maximum size of file which can be read, in bytes, as a ``ByteCount``.
/// - fileSystem: The ``FileSystemProtocol`` instance to use to read the file.
public init(
contentsOf path: FilePath,
maximumSizeAllowed: ByteCount,
fileSystem: some FileSystemProtocol
) async throws {
self = try await fileSystem.withFileHandle(forReadingAt: path) { handle in
try await handle.readToEnd(
fromAbsoluteOffset: 0,
maximumSizeAllowed: maximumSizeAllowed
)
}
}
/// Reads the contents of the file at the path using ``FileSystem``.
///
/// - Parameters:
/// - path: The path of the file to read.
/// - maximumSizeAllowed: The maximum size of file which can be read, as a ``ByteCount``.
public init(
contentsOf path: FilePath,
maximumSizeAllowed: ByteCount
) async throws {
self = try await Self(
contentsOf: path,
maximumSizeAllowed: maximumSizeAllowed,
fileSystem: .shared
)
}
/// Writes the readable bytes of the ``ByteBuffer`` to a file.
///
/// - Parameters:
/// - path: The path of the file to write the contents of the sequence to.
/// - offset: The offset into the file to write to, defaults to zero.
/// - options: Options for opening the file, defaults to creating a new file.
/// - fileSystem: The ``FileSystemProtocol`` instance to use.
/// - Returns: The number of bytes written to the file.
@discardableResult
public func write(
toFileAt path: FilePath,
absoluteOffset offset: Int64 = 0,
options: OpenOptions.Write = .newFile(replaceExisting: false),
fileSystem: some FileSystemProtocol
) async throws -> Int64 {
try await self.readableBytesView.write(
toFileAt: path,
absoluteOffset: offset,
options: options,
fileSystem: fileSystem
)
}
/// Writes the readable bytes of the ``ByteBuffer`` to a file.
///
/// - Parameters:
/// - path: The path of the file to write the contents of the sequence to.
/// - offset: The offset into the file to write to, defaults to zero.
/// - options: Options for opening the file, defaults to creating a new file.
/// - Returns: The number of bytes written to the file.
@discardableResult
public func write(
toFileAt path: FilePath,
absoluteOffset offset: Int64 = 0,
options: OpenOptions.Write = .newFile(replaceExisting: false)
) async throws -> Int64 {
try await self.write(
toFileAt: path,
absoluteOffset: offset,
options: options,
fileSystem: .shared
)
}
}