【第三章】BCMS中应用的文件系统

因为我的mac 上mysql 的问题,造成我选择file和mongodb来做数据的持久化操作。

mongodb的话,写了一小部分,已经可是可以使用,但是存在问题,所以决定先写file来进行数据操作。

之前我和小伙伴思考和讨论过这个问题,用小文件和数据库储存文件哪个会更快,数据库保存数据的方式应该和文件系统的方式一致,至于效率有待验证。

既然要使用文件系统去做数据的存储,基础的文件读取修改等方法应该写的通用,我现在还在修改这部分,因为已经在应用中发现了问题,这里先贴出来。

这里是主文件file.robot.js

const fs = require(‘fs‘)

const fileUtil = require(‘./utils‘)

const getRootPath = fileUtil.getRootPath
const fileSet = require(‘./file.config‘)
const dataPath = fileSet.dataPath
const fileEndfix = fileSet.fileEndfix

const getFilename = function(filename) {
    if(filename.indexOf(fileEndfix) >= 0) {
        return filename
    }
    return getRootPath() + dataPath + ‘/‘ + filename + fileEndfix
}

const create = function(filename, data, callback) {
    console.log(‘create file start‘)
    data = data || ""
    checkAndMkdir(filename, function() {
        fs.writeFile(filename, data, function(err) {
            if(err) {
                console.log(‘sorry, still have mistake in create function‘)
            }

            callback && callback()
        })
    })
    console.log(‘there is something wrong in the create file function‘)

}

const deleteFile = function(file) {
    if(fs.existsSync(file)) {
        fs.unlinkSync(file)
    }
}

const clearContent = function(filename, callback) {
    const filepath = getFilename(filename)
    if(fs.existsSync(filepath)) {
        fs.writeFile(filepath, ‘‘, function(err) {
            if(err) {
                console.log(‘Sorry, you make a mistake when you clear the file content : ‘ + filepath, err)
            }
            callback && callback()
        })
    }
}

const modify = function(filename, data, callback) {
    console.log(‘modify file ‘, filename )
    const filepath = getFilename(filename)
    const oldContent = getFileContent(filepath)
    const content = mergeContent(data, oldContent)

    fs.writeFile(filepath, content, function(err) {
        if(err) {
            console.log(‘Sorry, you have made a mistake when you modify file: ‘ + filepath, err)
        }
        callback && callback()
    })
}

const readFile = function(filename) {
    const file_full_name = getFilename(filename)
    const isExist = fs.existsSync(file_full_name)

    if(!isExist) {
        create(file_full_name)
    } else {
        return getFileContent(filename)
    }
}

const getFileContent = function(filename) {
    return fs.readFileSync(getFilename(filename)).toString()
}

function getParentPath(pathname) {
  if(pathname.indexOf(‘/‘)<0) {
    return pathname
  }

  return pathname.split(‘/‘).slice(0, -1).join(‘/‘)
}

function checkAndMkdir(pathname, callback) {
  const dirname = getParentPath(pathname)
  fs.mkdir(dirname, function(err) {
    if(err) {
      const parentDir = getParentPath(pathname)
      checkAndMkdir(parentDir, callback)
    }
    callback && callback()
  })
}

/**
    *
    *
    */

function mergeContent(newContent, oldContent) {
    // console.log(‘ newContent ‘, newContent, oldContent.toString())
    if(!oldContent) {
        return newContent
    }
    const data = JSON.parse(oldContent)
    const type = Object.prototype.toString.call(data)
    if(typeof newContent !== ‘string‘) {
        console.log(‘Sorry, your merge data must be string‘)
        return null
    }
    if(type === ‘[object Array]‘) {
        data.push(newContent)
    }
    if(type === ‘[object Object]‘) {
        data[newContent] = newContent
    }

    return data
}

module.exports = {
    create: create,
    deleteFile: deleteFile,
    clearContent: clearContent,
    modify: modify,
    readFile: readFile,
    getFileContent: getFileContent,
    // readFiles: readFiles,
}

接着是file用到帮助函数,写在utils中:

var fs = require(‘fs‘)
var rootPath = require(‘./file.config‘).rootPath

var pathStore = {}

Object.defineProperty(pathStore, ‘rootPath‘, {
  value: rootPath,
  writable: false,
  enumerable: false,
  configurable: false,
})

var getPath = function(key) {
  return pathStore[key]
}

var setPath = function(key, value) {
  pathStore
}
const getRootPath = function() {
  return getPath(‘rootPath‘)
}

const setRootPath = function() {
  setPath(‘rootPath‘, rootPath)
}

setRootPath()

module.exports = {
  getPath: getPath,
  setPath: setPath,
  getRootPath: getRootPath,
}

当然,这里有一个配置文件,去配置根目录和文件后缀,比如你想存成.txt, 后缀就写成‘.txt‘, 想存成js,就把后缀换成‘.js‘:

//files store path, use absolute path

const path = require(‘path‘)
const rootPath = path.join(__dirname)
const dataPath = ‘/data‘
const fileEndfix = ‘.txt‘
const superAdmin = {
  name: ‘admin‘,
  pass: ‘admin‘,
  role: ‘super‘
}

module.exports = {
  rootPath: rootPath,
  dataPath: dataPath,
  fileEndfix: fileEndfix,
  superAdmin: superAdmin,
}

superAdmin是初始化超级管理员的账户信息,可以自己去随意更改,然后添加新的管理员之后,这个账户可以禁用。

基本的file储存方法已经可以使用(尚在修改中),下次将写如何从前端初始化一个用户的操作。

时间: 2024-10-08 10:28:13

【第三章】BCMS中应用的文件系统的相关文章

(转载)虚幻引擎3--第三章–Unreal中的类

第三章–Unreal中的类 3.1概述 3.2 NATIVE 对 非-NATIVE 3.3类声明 EXTENDS 关键字 指南 3.1您的第一个类声明 3.4类的修饰符 NATIVE(PACKAGENAME) NATIVEREPLICATION DEPENDSON(CLASSNAME[,CLASSNAME,...]) ABSTRACT DEPRECATED TRANSIENT NONTRANSIENT CONFIG(ININAME) Engine Editor Game Input PEROBJ

笔记之Cyclone IV第一卷第三章器件中的存储器模块

嵌入式存储器结构由一列列 M9K 存储器模块组成,通过对这些 M9K 存储器模块进行配置,可以实现各种存储器功能,例如:RAM.移位寄存器. ROM 以及FIFO 缓冲器. M9K 存储器模块支持以下特性:■ 每模块 8,192 个存储器位 ( 包括奇偶校验位,每模块共 9,216 位 )■ 用于每一个端口的独立读使能 (rden) 与写使能 (wren) 信号 ■ Packed 模式,该模式下 M9K 存储器模块被分成两个 4.5 K 单端口 RAM■ 可变端口配置■ 单端口与简单双端口模式,

第三章 jQuery中的DOM操作

DOM(Document Object Model)文档对象模型,每张网页都能用DOM表示出来,每一份DOM都能看成一颗DOM树. jQuery继承了JavaScript对DOM对象操作的特性,使开发人员能方便地操作DOM对象. 1.查找节点 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional

第三章 python中的字符串

一.字符串的基本操作 所有标准的序列操作对字符串同样适用,如索引.分片.乘法.判断成员是否存在.求长度.最大值和最小值等.记住一点,字符串是不可变的. 二.字符串中重要的方法 1.find(substr[strat,end])方法:返回找到的第一个子串的最左端位置索引,如果子串不存在,返回-1.(建议在如下情况下使用该方法:当你需要知道子串的位置时.如检查子串是否存在于某个字符串,建议用in操作符).该方法还提供两个可选的位置参数,分别为起始点和结束点,表示查找的范围区域. 1 >>>

Android系统移植与驱动开发--第三章 Git使用入门及在学习中有感

第三章 Git使用入门 使用Git的目的是减少各种版本的Linux的压缩大小,提供源代码在Linux上进行编译. 在这一个章节中,其实就是关键步骤的操作,虽然Git与我们学习的android没有很大的联系,但是在开发环境中也是必不可少的.通过学习这个章节,学习到了安装,查看,提取Git的方法.下面将详细讲述. 一.安装Git 可能大多数Linux上已经安装了Git,如果没有可以用下面的命令. Ubuntu10.04版本以下的有-core与原来的区分, 必须的:apt-get install gi

软件构造 第三章第五节 ADT和OOP中的等价性

第三章第五节 ADT和OOP中的等价性 1.==与equals ==是引用等价性 :而equals()是对象等价性. == 比较的是索引.更准确的说,它测试的是指向相等(referential equality).如果两个索引指向同一块存储区域,那它们就是==的.对于我们之前提到过的快照图来说,==就意味着它们的箭头指向同一个对象. equals()操作比较的是对象的内容,换句话说,它测试的是对象值相等(object equality).在每一个ADT中,equals操作必须合理定义 2.等价性

linux程序设计——文件操作(第三章)

第三章    文件操作 3.1 linux文件结构 与UNIX一样,linux环境中的文件具有特别重要的意义,因为它们为操作系统服务和设备提供了一个简单而一致的接口.在linux中,一切都是文件. 这意味着,通常程序可以像使用文件那样使用磁盘文件.串行口.打印机等等. 目录也是文件,但它是一种特殊类型的文件.在现代UNIX(包括linux)版本中,即使是超级用户可能也不再被允许直接对目录进行写左操作了.所有用户通常都使用上层的opendir/readdir接口来读取目录,而无需了解特定系统中目录

2017上半年软考 第三章 重要知识点

第三章 讲了信息系统集成所需要的技术: 重点是:信息系统生命周期:立项[形成需求规格说明书].开发.运维.消亡: 信息系统建设包括:设备采购.系统集成.软件开发.运维服务: 软件开发常用方法:结构化方法[整个系统分若干阶段依次进行.每个阶段都有详细的文档编制要求:注重全局和整体性: 缺点开发周期长,文档设计繁琐,设计说明繁琐,工作效率低,要在开发之初认识系统需求].原型法[快速开发一个原型.反复修改来实现用户需求: 分抛弃型原型.进化型原型].面向对象法[关键:能否建立全面.合理.同意,反映需求

《HTTP权威指南》读书笔记(第一章~第三章)

第一章 HTTP概述 超文本传输协议 HTTP(HyperText Transfer Protocol) Web服务器使用HTTP协议,通常也称HTTP服务器.Web服务器是Web资源(Web resource)的宿主.最简单的Web资源就是Web服务器文件系统中的静态文件.这些文件可包括任意内容:文本.HTML.图片.视频等等.Web服务器会为所有HTTP对象数据附加一个MIME类型的数据格式标签.(Multipurpose Internet Mail Extension 多用途因特网邮件扩展