.some
This commit is contained in:
109
Sources/Path+FileManager.swift
Normal file
109
Sources/Path+FileManager.swift
Normal file
@@ -0,0 +1,109 @@
|
||||
import Foundation
|
||||
|
||||
public extension Path {
|
||||
/**
|
||||
Copies a file.
|
||||
- Note: `throws` if `to` is a directory.
|
||||
- Parameter to: Destination filename.
|
||||
- Parameter overwrite: If true overwrites any file that already exists at `to`.
|
||||
- Returns: `to` to allow chaining
|
||||
- SeeAlso: copy(into:overwrite:)
|
||||
*/
|
||||
@discardableResult
|
||||
public func copy(to: Path, overwrite: Bool = false) throws -> Path {
|
||||
if overwrite, to.exists {
|
||||
try FileManager.default.removeItem(at: to.url)
|
||||
}
|
||||
try FileManager.default.copyItem(atPath: string, toPath: to.string)
|
||||
return to
|
||||
}
|
||||
|
||||
/**
|
||||
Copies a file into a directory
|
||||
|
||||
If the destination does not exist, this function creates the directory first.
|
||||
|
||||
- Note: `throws` if `into` is a file.
|
||||
- Parameter into: Destination directory
|
||||
- Parameter overwrite: If true overwrites any file that already exists at `into`.
|
||||
- Returns: The `Path` of the newly copied file.
|
||||
- SeeAlso: copy(into:overwrite:)
|
||||
*/
|
||||
@discardableResult
|
||||
public func copy(into: Path, overwrite: Bool = false) throws -> Path {
|
||||
if !into.exists {
|
||||
try FileManager.default.createDirectory(at: url, withIntermediateDirectories: true)
|
||||
} else if overwrite, !into.isDirectory {
|
||||
try into.delete()
|
||||
}
|
||||
let rv = into/basename()
|
||||
try FileManager.default.copyItem(at: url, to: rv.url)
|
||||
return rv
|
||||
}
|
||||
|
||||
@discardableResult
|
||||
public func move(into: Path) throws -> Path {
|
||||
if !into.exists {
|
||||
try into.mkpath()
|
||||
} else if !into.isDirectory {
|
||||
throw CocoaError.error(.fileWriteFileExists)
|
||||
}
|
||||
try FileManager.default.moveItem(at: url, to: into.join(basename()).url)
|
||||
return self
|
||||
}
|
||||
|
||||
@inlinable
|
||||
public func delete() throws {
|
||||
try FileManager.default.removeItem(at: url)
|
||||
}
|
||||
|
||||
@inlinable
|
||||
@discardableResult
|
||||
func touch() throws -> Path {
|
||||
return try "".write(to: self)
|
||||
}
|
||||
|
||||
@inlinable
|
||||
@discardableResult
|
||||
public func mkdir() throws -> Path {
|
||||
do {
|
||||
try FileManager.default.createDirectory(at: url, withIntermediateDirectories: false, attributes: nil)
|
||||
} catch CocoaError.Code.fileWriteFileExists {
|
||||
// noop
|
||||
}
|
||||
return self
|
||||
}
|
||||
|
||||
@inlinable
|
||||
@discardableResult
|
||||
public func mkpath() throws -> Path {
|
||||
do {
|
||||
try FileManager.default.createDirectory(at: url, withIntermediateDirectories: true, attributes: nil)
|
||||
} catch CocoaError.Code.fileWriteFileExists {
|
||||
// noop
|
||||
}
|
||||
return self
|
||||
}
|
||||
|
||||
/// - Note: If file doesn’t exist, creates file
|
||||
/// - Note: If file is not writable, makes writable first, resetting permissions after the write
|
||||
@discardableResult
|
||||
public func replaceContents(with contents: String, atomically: Bool = false, encoding: String.Encoding = .utf8) throws -> Path {
|
||||
let resetPerms: Int?
|
||||
if exists, !isWritable {
|
||||
resetPerms = try FileManager.default.attributesOfItem(atPath: string)[.posixPermissions] as? Int
|
||||
let perms = resetPerms ?? 0o777
|
||||
try chmod(perms | 0o200)
|
||||
} else {
|
||||
resetPerms = nil
|
||||
}
|
||||
|
||||
defer {
|
||||
_ = try? resetPerms.map(self.chmod)
|
||||
}
|
||||
|
||||
try contents.write(to: self)
|
||||
|
||||
return self
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user