@xrengine/server-core
Version:
Shared components for XREngine server
106 lines (93 loc) • 2.95 kB
text/typescript
import fs from 'fs'
import path from 'path'
export function writeFileSyncRecursive(filename, content, charset = undefined) {
// -- normalize path separator to '/' instead of path.sep,
// -- as / works in node for Windows as well, and mixed \\ and / can appear in the path
let filepath = filename.replace(/\\/g, '/')
// -- preparation to allow absolute paths as well
let root = ''
if (filepath[0] === '/') {
root = '/'
filepath = filepath.slice(1)
} else if (filepath[1] === ':') {
root = filepath.slice(0, 3) // c:\
filepath = filepath.slice(3)
}
// -- create folders all the way down
const folders = filepath.split('/').slice(0, -1) // remove last item, file
folders.reduce(
(acc, folder) => {
const folderPath = acc + folder + '/'
if (!fs.existsSync(folderPath)) {
fs.mkdirSync(folderPath)
}
return folderPath
},
root // first 'acc', important
)
// -- write file
fs.writeFileSync(root + filepath, content, charset)
}
export function deleteFolderRecursive(path) {
var files: any[] = []
if (fs.existsSync(path)) {
files = fs.readdirSync(path)
files.forEach(function (file, index) {
var curPath = path + '/' + file
if (fs.lstatSync(curPath).isDirectory()) {
// recurse
deleteFolderRecursive(curPath)
} else {
// delete file
fs.unlinkSync(curPath)
}
})
fs.rmdirSync(path)
}
}
export function getFilesRecursive(path, includeDirs = false) {
const files: string[] = []
if (fs.existsSync(path)) {
const curFiles = fs.readdirSync(path)
curFiles.forEach(function (file, index) {
const curPath = path + '/' + file
if (fs.lstatSync(curPath).isDirectory()) {
if (includeDirs) files.push(curPath)
files.push(...getFilesRecursive(curPath, includeDirs))
} else {
files.push(curPath)
}
})
}
return files
}
export function copyFileSync(source, target) {
var targetFile = target
// If target is a directory, a new file with the same name will be created
if (fs.existsSync(target)) {
if (fs.lstatSync(target).isDirectory()) {
targetFile = path.join(target, path.basename(source))
}
}
fs.writeFileSync(targetFile, fs.readFileSync(source))
}
export function copyFolderRecursiveSync(source, target) {
var files: any[] = []
// Check if folder needs to be created or integrated
var targetFolder = path.join(target, path.basename(source))
if (!fs.existsSync(targetFolder)) {
fs.mkdirSync(targetFolder, { recursive: true })
}
// Copy
if (fs.lstatSync(source).isDirectory()) {
files = fs.readdirSync(source)
files.forEach(function (file) {
var curSource = path.join(source, file)
if (fs.lstatSync(curSource).isDirectory()) {
copyFolderRecursiveSync(curSource, targetFolder)
} else {
copyFileSync(curSource, targetFolder)
}
})
}
}