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

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

作者: 小枫学幽默 | 来源:发表于2021-07-13 14:37 被阅读0次

    背景

    首先,我的目录结构如下

    .
    ├── 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
    

    相关文章

      网友评论

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

          本文链接:https://www.haomeiwen.com/subject/iatspltx.html