解决浏览器无法读取绝对路径文件的问题——mklink


日常使用 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、遇到的问题

是的,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