日常使用 Linux 的用户,想必对 ln
命令不会陌生。使用该命令,可以在 Linux 系统上创建针对文件或目录的符号链接,实现一个文件(目录)两个名字的功能。
Windows 上也有一个类似功能的命令,它是 mklink
。不过它的行为和 ln
不太一样。此外,Windows 上还有「快捷方式」这种东西,也能实现一个文件(目录)两个名字的功能。但它和 mklink
建立的符号链接不一样,它是 Windows 上特有的一种文件格式,专门用来指向其它文件(目录)。
目标:读取绝对路径C:\source\test2.txt内容。
1.文件路径及内容:
2.进入代码目录,为绝对路径目录 C:\source\test\建立软连接“testlink”:
建立软连接后代码结构:
3.用以读取文件的代码:util.js
export const readAbsolutePath = async (path) => { let result = await getFileBlob(path); return result; }; async function getFileBlob(url) { var nBlob; var xhr = new XMLHttpRequest(); xhr.open('GET', url, true); xhr.send(); xhr.addEventListener('load', function () { nBlob = xhr.response; console.log('nblob:' + nBlob); console.log('nblob.size:=' + nBlob.size); }); }
4.浏览器中调用index.html:
<html> <head> <title>我的第一个 HTML 页面</title> </head> <body> <p>body 元素的内容会显示在浏览器中。</p> <p>title 元素的内容会显示在浏览器的标题栏中。</p> </body> <script type="module"> import {readAbsolutePath} from './util.js' readAbsolutePath('./testlink/2.txt') </script> </html>
5.读取结果:
6、遇到的问题
0x01 坑:PowerShell 中没有 mklink 命令
是的,PowerShell 中就是中没有 mklink 命令。如果要在 powershell 中使用 mklink,那么得先敲 cmd
进入 cmd
之后再使用 mklink
命令。
如果你是一个重度强迫症患者,那么可以编写一个 powershell 的扩展函数来实现:Creating a Symbolic Link using PowerShell - Learn Powershell - Achieve More。
0x02 坑:权限
默认我们的用户账户是 Administrators
组的,会继承它的权限设定。正常情况下,我们使用 mklink
是可以成功执行的。但如果文件系统的设置比较奇怪或者重装过系统,那么可能出现没有权限的错误。
C:\Users\lvyi>mklink /D D:\Foo D:\OneDrive\Foo 你没有足够的权限执行此操作。
这时,使用管理员权限启动 cmd
是最简单的做法。不过也可以考虑在 本地安全策略(secpol.msc)\本地策略\用户权利分配
中添加当前用户。
详情:https://liam.page/2018/12/10/mklink-in-Windows/
问题:https://blog.walterlv.com/post/problems-of-mklink.html