如何判断一个文件是否存在,且大小写敏感

背景

首先,我的目录结构如下

.
├── index.js
└── README.txt

index.js

var fs = require('fs');
var path = require('path');
console.log(fs.existsSync(__dirname + '/README.txt'))
console.log(fs.existsSync(__dirname + '/readme.txt'))

思考下,上面 fs.existsSync 执行后,返回是 true 还是 false

// windows、mac下输出 true true
console.log(fs.existsSync(__dirname + '/README.txt'))  // true
console.log(fs.existsSync(__dirname + '/readme.txt')) // true

// centos下输出
console.log(fs.existsSync(__dirname + '/README.txt')) // true
console.log(fs.existsSync(__dirname + '/readme.txt')) // false

为什么呢?

因为在windows下,如果你目录中出现README.txt,那么就无法新建readme.txt,因为windows认为这两个是一个文件。也就是文件名是大小写不敏感的;而对于linux来讲,认为README.txtreadme.txt是两个文件,也就是大小写敏感的,你是可以新建成功的。

不解决会出现什么问题?

目录结构:

.
├── index.js
└── Readme.vue

index.js,引用这个vue文件

import Readme from "./readme.vue"
export default {
    Readme
}

如果我们用的是windows/mac电脑开发,那么此时webpack不会报错,因为大小写不敏感,可以在磁盘里找到Readme.vue;当我们把代码上传到构建服务器(一般都是linux系统),服务器在构建时,因为大小写敏感,发现找不到要引入的文件,就直接报错了,构建无法继续,就会出现经典的一幕,程序猿说:在我本地是正常的啊!

webpack中解决这个问题就需要下面这个插件了

case-sensitive-paths-webpack-plugin

如何解决这个问题?

var fs = require('fs');
var path = require('path');
function fileExistsWithCaseSync(filepath) {
    var dir = path.dirname(filepath)
    if (dir === path.dirname(dir)) {
        return true
    }
    var filenames = fs.readdirSync(dir)
    if (filenames.indexOf(path.basename(filepath)) === -1) {
        return false
    }
    return fileExistsWithCaseSync(dir)
}

console.log(fileExistsWithCaseSync(__dirname + '/README.txt')) // true
console.log(fileExistsWithCaseSync(__dirname + '/readme.txt')) // false

你可能感兴趣的:(如何判断一个文件是否存在,且大小写敏感)