作为一个前端工程师也要掌握的几种文件路径知识

前言之前在做webpack配置时候多次用到路径相关内容,最近在写项目的时候,有一个文件需要上传到阿里云oss的功能,同时本地服务器也需要保留一个文件备份。多次用到了文件路径相关内容以及Node核心API的path模块,所以系统的学习了一下,整理了这篇文章。 node中的路径分类node中的路径大致分5类,dirname,filename,process.cwd(),./,../,其中dirname,filename,process.cwd()绝对路径 通过代码对每个分类进行说明: 文件目录结构如下: 代码pra/ - node核心API/ - fs.js - path.jspath.js中的代码 const path = require('path');console.log(__dirname);console.log(__filename);console.log(process.cwd());console.log(path.resolve('./'));在代码pra目录下运行命令 node node核心API/path.js,我们可以看到结果如下: /koala/Desktop/程序员成长指北/代码pra/node核心API/koala/Desktop/程序员成长指北/代码pra/node核心API/path.js/koala/Desktop/程序员成长指北/代码pra/koala/Desktop/程序员成长指北/代码pra然后我们有可以在node核心API目录下运行这个文件,node path.js,运行结果如下: /koala/Desktop/程序员成长指北/代码pra/node核心API/koala/Desktop/程序员成长指北/代码pra/node核心API/path.js/koala/Desktop/程序员成长指北/代码pra/node核心API/koala/Desktop/程序员成长指北/代码pra/node核心API对比输出结果,暂时得到的结论是 __dirname: 总是返回被执行的 js 所在文件夹的绝对路径__filename: 总是返回被执行的 js 的绝对路径process.cwd(): 总是返回运行 node 命令时所在的文件夹的绝对路径./: 跟 process.cwd() 一样,返回 node 命令时所在的文件夹的绝对路径为什么说上面是暂时得到的结论,因为是有错误的,再看一段代码:我们在path.js中加上这句代码 exports.A = 1;之前直接通过readFile读取文件路径报错, fs.readFile('./path.js',function(err,data){ });现在在刚才报错的fs.js里面加这两句代码看看: const test = require('./path.js');console.log(test)在代码pra/目录下运行node node核心API/fs.js,最后查看结果,说明是可以访问到的: { A: 1 }那么关于 ./ 正确的结论是: 在 require() 中使用是跟 __dirname 的效果相同,不会因为启动脚本的目录不一样而改变,在其他情况下跟 process.cwd() 效果相同,是相对于启动脚本所在目录的路径。 路径知识总结:__dirname: 获得当前执行文件所在目录的完整目录名__filename: 获得当前执行文件的带有完整绝对路径的文件名process.cwd():获得当前执行node命令时候的文件夹目录名./: 不使用require时候,./与process.cwd()一样,使用require时候,与__dirname一样只有在 require() 时才使用相对路径(./, ../) 的写法,其他地方一律使用绝对路径,如下: ...

August 21, 2019 · 1 min · jiezi

为什么linux中sudo执行会找不到命令

sudo:command not found在本地装了个Ubuntu虚拟机,golang环境搭好了并加入PATH环境变量,make编译源码时显示Permission denied,然后sudo执行编译源码时显示go : command not found。 然后尝试执行go version命令 非root用户执行 :go version go1.12.6 linux/amd64root用户执行 :go version go1.12.6 linux/amd64非root用户sudo执行 : sudo: go: command not found这???是不是很奇怪???到底是因为什么呢??原来root用户和非root用户正常执行命令时,使用的PATH配置文件是 /etc/environment非root用户sudo执行命令时,使用的PATH配置文件是 /etc/sudoers

July 10, 2019 · 1 min · jiezi

Linux系统配置环境变量

Linux系统环境变量包括PATH、LD_LIBRARY_PATH等,可以通过echo $PATH、echo $LD_LIBRARY_PATH等命令查看系统当前的环境变量 其中PATH是系统可执行程序的查找路径,LD_LIBRARY_PATH是系统动态库的查找路径 修改PATH环境变量(以配置golang环境变量为例),四种方法1.终端窗口输入export PATH=$PATH:/usr/local/go/bin 生效方法:立即生效有效期限:临时改变,只能在当前的终端窗口中有效,当前窗口关闭后就会恢复原有的path配置用户局限:仅对当前用户2.通过修改用户目录下的.bashrc文件 vi ~/.bashrc #在最后一行添上: export PATH=$PATH:/usr/local/go/bin生效方法:(有以下两种) 1.关闭当前终端窗口,重新打开一个新终端窗口就能生效2.输入“source ~/.bashrc”命令,立即生效有效期限:永久有效用户局限:仅对当前用户 3.通过修改系统级别的profile文件: vi /etc/profile /export PATH #找到设置PATH的行,添加 export PATH=$PATH:/usr/local/go/bin生效方法:系统重启有效期限:永久有效用户局限:对所有用户4.通过修改environment文件:vi /etc/environment在PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games"后边添加“:/usr/local/go/bin” 生效方法:系统重启有效期限:永久有效用户局限:对所有用户修改LD_LIBRARY_PATH环境变量(以配置/usr/local/gcc/lib64为例),三种方法1.终端窗口输入export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/gcc/lib64 生效方法:立即生效有效期限:临时改变,只能在当前的终端窗口中有效,当前窗口关闭后就会恢复原有的path配置用户局限:仅对当前用户2. 修改用户目录下的.bashrc或.bash_profile文件,以.bashrc为例 vi ~/.bashrc #在最后一行添上: export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/gcc/lib64生效方法:(有以下两种) 1.关闭当前终端窗口,重新打开一个新终端窗口就能生效2.输入“source ~/.bashrc”命令,立即生效有效期限:永久有效用户局限:仅对当前用户 3.通过修改系统级别的profile文件: vi /etc/profile /export PATH #找到设置PATH的行,添加 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/gcc/lib64生效方法:系统重启有效期限:永久有效用户局限:对所有用户4.通过修改/etc/ld.so.conf文件:vi /etc/ld.so.conf下面加一行/usr/local/gcc/lib64 生效方法:执行ldconfig命令 ldconfig的主要用途:默认搜寻/lilb和/usr/lib,以及配置文件/etc/ld.so.conf内所列的目录下的库文件。搜索出可共享的动态链接库,库文件的格式为:lib*.so.,进而创建出动态装入程序(ld.so)所需的连接和缓存文件。缓存文件默认为/etc/ld.so.cache,该文件保存已排好序的动态链接库名字列表。ldconfig通常在系统启动时运行,而当用户安装了一个新的动态链接库时,就需要手工运行这个命令。有效期限:永久有效用户局限:对所有用户

July 9, 2019 · 1 min · jiezi

Express-的使用

以下内容,基于 Express 4.x 版本 Node.js 的 ExpressExpress 估计是那种你第一次接触,就会喜欢上用它的框架。因为它真的非常简单,直接。 在当前版本上,一共才这么几个文件: lib/├── application.js├── express.js├── middleware│   ├── init.js│   └── query.js├── request.js├── response.js├── router│   ├── index.js│   ├── layer.js│   └── route.js├── utils.js└── view.js这种程度,说它是一个“框架”可能都有些过了,几乎都是工具性质的实现,只限于 Web 层。 当然,直接了当地实现了 Web 层的基本功能,是得益于 Node.js 本身的 API 中,就提供了 net 和 http 这两层, Express 对 http 的方法包装一下即可。 不过,本身功能简单的东西,在 package.json 中却有好长一串 dependencies 列表。 Hello World在跑 Express 前,你可能需要初始化一个 npm 项目,然后再使用 npm 安装 Express: mkdir pcd pnpm initnpm install express --save新建一个 app.js : const express = require('express');const app = express();app.all('/', (req, res) => res.send('hello') );app.listen(8888);调试信息是通过环境变量 DEBUG 控制的: const process = require('process');process.env['DEBUG'] = 'express:*';这样就可以在终端看到带颜色的输出了,嗯,是的,带颜色控制字符,vim 中直接跑就 SB 了。 应用 ApplicationApplication 是一个上层统筹的概念,整合“请求-响应”流程。 express() 的调用会返回一个 application ,一个项目中,有多个 app 是没问题的: ...

June 26, 2019 · 7 min · jiezi

乐字节java学习03path环境变量

1、path环境变量的作用保证javac命令可以在任意目录下运行。 2、path配置的两种方案:方法一 如下: ①点击计算机->右键->属性 ②高级系统设置 ③高级—>环境变量 ④系统变量 àPath—>编辑à光标移到最前面/后面à加上英文状态下的分号”;” ⑤进入到安装 jdk目录 下的bin,然后单击地址栏将此路径复制到变量值的最前面。 ⑥一路确定并退出 方法二 如下(推荐): 找到环境变量的位置,在系统变量里面 新建: 变量名:JAVA_HOME 变量值:C:Program FilesJavajdk1.7.0_71 修改: 变量名:Path 变量值:%JAVA_HOME%bin;以前的内容 测试jdk是否安装正确以及环境变量是否配置正确 开始-运行-cmd- javac –version 回车 注意:配置环境变量之后,切记要重新打开DOS窗口,否则配置不生效。 关注乐字节,获取更多Java技术干货视频和文章,乐字节原创!

June 18, 2019 · 1 min · jiezi

python模块之os.path

os.path.abspath(path)返回path的绝对路径名>>> os.path.abspath(".")‘C:\Users\admin\Desktop\PycharmProjects\python_demo’os.path.basename(path)返回文件名,等同于调用os.path.split(path)返回值的第二个元素。>>> os.path.basename("/usr/bin/")’’>>> os.path.basename("/usr/bin")‘bin’python的basename和Unix shell的basename指令是有区别的:[root@localhost ]# basename “/usr/bin"bin[root@localhost ]# basename “/usr/bin/“binos.path.commonpath(paths)返回序列参数paths中最长的公共子路径。如果paths为空,或者同时包含绝对路径和相对路径,抛出ValueError异常。与os.path.commonprefix(list)不同,此函数的返回值一定是一个有效路径。>>> os.path.commonpath(["/home/admin”, “/home/admin/.ssh”])’/home/admin’>>> os.path.commonpath(["/home/admin1”, “/home/admin2”])’/home’os.path.commonprefix(list)返回list中所有路径的最大长度的公共路径前缀,如果list为空返回空字符串。其返回值可能是一个无效路径。>>> os.path.commonprefix([”.", “/root”])’’>>> os.path.commonprefix(["/home/admin1", “/home/admin2”])’/home/admin’os.path.dirname(path)返回目录名,等同于调用os.path.split(path)返回值的第一个元素。>>> os.path.dirname("/usr/bin/")’/usr/bin’>>> os.path.dirname("/usr/bin")’/usr’os.path.exists(path)判断path是否存在。如果path是一个已存在的路径或一个打开的文件描述符(int),返回True。在某些平台,即使path真实存在,但如果没有针对path执行os.stat()的权限,仍有可能返回False。如果path是一个受到破坏的软链接(原始文件/文件夹被删除),返回False。os.path.lexists(path)判断path是否存在。如果path是一个已存在的路径,返回True。如果path是一个受到破坏的软链接(原始文件/文件夹被删除),返回True。os.path.expanduser(path)返回把path中包含的"“和”user"转换成用户目录后的路径。Unix平台:对于path中的,如果设置了环境变量HOME,使用HOME的值替换;否则使用当前用户的用户主目录替换;对于path中的user,直接使用user的用户主目录替换>>> os.path.expanduser("/local/mysql")’/root/local/mysql’>>> os.path.expanduser("admin/local/mysql")’/home/admin/local/mysql’Windows平台:对于path中的,使用环境变量HOME或USERPROFILE的值,或HOMEPATH和HOMEDRIVE的值的组合替换;对于path中的user,将替换"“的路径的最后一个目录组件剥离,使用user替换# 查看环境变量(python) D:>echo %HOME%%HOME%(python) D:>echo %USERPROFILE%C:\Users\admin(python) D:>echo %HOMEPATH%\Users\admin(python) D:>echo %HOMEDRIVE%C:>>> os.path.expanduser("\local”)‘C:\Users\admin\local’# 将C:\Users\admin中的admin替换为anyuser>>> os.path.expanduser("anyuser\local")‘C:\Users\anyuser\local’如果扩展失败或path未以"“为前缀,不做改动直接返回。os.path.expandvars(path)扩展path中的环境变量并返回。path中$NAME和${NAME}格式的子串将被对应的环境变量替换(不同平台存在是否区分大小写的问题)。格式错误或变量不存在,将直接返回。在windows中还包括%NAME%的形式。os.path.getatime(path)最后访问时间。返回值是自epoch时间算起的浮点值,单位为秒。如果path不存在或无法访问将抛出异常。>>> getatime("/root/demo.txt”)1545345643.4549878os.path.getmtime(path)最后修改时间。返回值是自epoch时间算起的浮点值,单位为秒。如果path不存在或无法访问将抛出异常。os.path.getctime(path)在Unix系统,表示最近一次修改元数据的时间;在Windows系统,表示创建时间。返回值是自epoch时间算起的浮点值,单位为秒。如果path不存在或无法访问将抛出异常。os.path.getsize(path)以字节为单位返回路径大小。如果path不存在或无法访问将抛出异常。如果path指向一个文件夹,返回值不代表该文件夹真实占用的大小。os.path.isabs(path)判断是否为绝对路径。os.path.isfile(path)判断是否为文件。符号链接判定为True,受到破坏判定为False[root@localhost ~]# ll总用量 0lrwxrwxrwx. 1 root root 8 12月 21 07:32 demo.link -> demo.txt-rw-r–r–. 1 root root 0 12月 21 07:31 demo.txtlrwxrwxrwx. 1 root root 10 12月 21 07:32 sample.link -> sample.txt # 原文件被删除导致软链接受到破坏>>> isfile("/root/demo.link")True>>> isfile("/root/sample.link")Falseos.path.isdir(path)判断是否为文件夹。符号链接判定为True,受到破坏判定为Falseos.path.islink(path)判断是否为符号链接,即使是受到破坏的符号链接,也会返回True。如果Python运行环境不支持符号链接,返回False。os.path.ismount(path)判断是否为挂载点。[root@localhost ~]# df -h文件系统 容量 已用 可用 已用% 挂载点/dev/mapper/centos-root 18G 1.7G 16G 10% /devtmpfs 480M 0 480M 0% /devtmpfs 492M 0 492M 0% /dev/shmtmpfs 492M 7.4M 485M 2% /runtmpfs 492M 0 492M 0% /sys/fs/cgroup/dev/sda1 497M 157M 340M 32% /boottmpfs 99M 0 99M 0% /run/user/0>>> ismount("/dev")True对于Windows系统,磁盘符根目录及UNC路径的共享目录总是挂载点:>>> ismount(“c:/")True>>> ismount(”//DESKTOP-BV17H6X/Users/")Trueos.path.join(path, *paths)路径拼接。将path与paths中的非空路径组件使用系统分隔符拼接。如果最后一个组件是空字符串,返回值将以分隔符结尾:>>> join("/root", “a”, “b”, “”, “c”)’/root/a/b/c’>>> join("/root", “a”, “b”, “c”, “”)’/root/a/b/c/‘如果paths中任意一个组件是绝对路径,将直接以该组件开始进行拼接:>>> join("/root", “a”, “/b”, “c”)’/b/c’在Windows中,如果paths中出现不含磁盘符的绝对路径,不会重置磁盘符:>>> join(“c:/root”, “/foo”)‘c:/foo’如果paths中出现含磁盘符的,直接从该路径开始进行拼接:>>> join(“c:/root”, “e:/root”, “/foo”)’e:/foo’每个磁盘符有一个当前工作目录,下例表示相对于该磁盘当前工作目录的路径foo(e:foo而非e:\foo):>>> os.path.abspath(join(“e:”, “foo”))‘E:\git_project\foo’os.path.normcase(path)规范路径名大小写。在Unix和Mac OS X系统,直接返回path;在大小写不敏感的系统(如Windows),会将path转换为小写字母。此外Windows还会将/转换为\。os.path.normpath(path)规范路径名中的多余分隔符以及上级引用,如A//B, A/B/, A/./B and A/foo/../B将全部转换为A/B。Windows系统还会将/转换为\。os.path.realpath(path)将包含符号链接的path转换为真实路径名称。os.path.relpath(path, start=os.curdir)返回相对于当前工作目录或指定的start目录的相对路径。os.path.samefile(path1, path2)判断path1和path2是否指向同一个文件或目录,取决于设备号和i-node。如果调用os.stat()失败将抛出异常。os.path.sameopenfile(fp1, fp2)判断文件描述符fp1和fp2是否指向同一个文件或目录。os.path.samestat(stat1, stat2)判断状态元组stat1和stat2是否指向同一个文件或目录,参数可能是os.fstat()、os.lstat或os.stat()的返回值。os.path.split(path)将path拆分为(head, tail)的元组形式。tail部分总是不包含斜杠,如果path以斜杠结尾,tail将为空字符串;尾部的斜杠也会从head中去除,除非path是根路径:>>> split("/home/admin/.ssh/")(’/home/admin/.ssh’, ‘’)>>> split("/")(’/’, ‘’)如果path不包含斜杠,head部分将为空字符串:>>> split(“home”)(’’, ‘home’)如果path为空字符串,head和tail都将为空:>>> split("")(’’, ‘’)os.path.splitdrive(path)将path拆分为(drive, tail)的元组形式。在不使用磁盘符的系统,drive总是为空字符串;在Windows系统,会将path分割为UNC共享点/磁盘驱动,及其相对路径。# 包含磁盘符的路径>>> splitdrive(“c:/dir”)(‘c:’, ‘/dir’)# UNC路径,分割后的drive包含主机名和共享点(到第四个分隔符但不包括第四个)>>> splitdrive("//servername/sharename/directory/filename")(’//servername/sharename’, ‘/directory/filename’)os.path.splitext(path)将path拆分为(root, ext)的元组形式。ext为空字符串或者以.打头且只包含1个.的字符串:>>> splitext("/home/admin/.ssh/")(’/home/admin/.ssh/’, ‘’)>>> splitext("/home/admin/.ssh/id_rsa.ppk")(’/home/admin/.ssh/id_rsa’, ‘.ppk’)# 如果path以’.‘打头,ext将为空字符串>>> splitext(’.cshrc’)(’.cshrc’, ‘’)os.path.supports_unicode_filenames判断是否能使用任意Unicode字符串作为文件名(在文件系统强加的限制内) ...

December 23, 2018 · 1 min · jiezi