萝卜L

导航

lua file system lfs 软链接 硬链接

  • 对lua file system(lfs)。
    lfs.link (old, new[, symlink])
    若old是symlink,则不论方法(函数)的第三个参数是什么(true/false/nil),目标(new)总是symlink。
    成功返回true;失败返回nil+error message(make_link CreateHardLink() failedmake_link CreateSymbolicLink() failed
    (不论建立软链接硬链接)无需?(貌似测试中一台电脑无需,一台需)管理员权限。
  • ln.exe中建立软链接需管理员权限。
Please note that symbolic links can only be successfully created from an administrative command prompt. ln.exe will fail on symbolic links from a normal command prompt!
  •  mklink需管理员权限,否则报错你没有足够的权限执行此操作。
  • 其他,当软链接的目标失效时,io.open软链接返回nil,尽管资源管理器中能看到软链接文件(可以打开文件属性,不可打开文件)。
  •  subst 建立的虚拟(virtual volume)(目录)下的硬链接的filepath。
    对lfs lfs.symlinkattributes(filepath).mode 为'file',但其target为实际目录
    对HardlinkShellExt,文件属性\连接属性下,连接类型:硬链接硬连接的引用位置:实际目录路径(无当前虚拟卷路径)。
    为此硬链接建立的软连接在HardlinkShellExt中查看,指向此(基于虚拟卷的)硬链接(而非指向虚拟目录);在lfs中target为实际目录
  • 结论lfs lfs.dll lua file system symlink symbolic link hardlink hard link ln.exe direct/previous/final source/destination virtual volume subst directory source/target file symlinkattributes attributes  
  • 测试(lfsln
    local lfs=require'lfs'
    lfs.chdir[[G:\]]
    local E={close=function()end}
    assert(not (io.open'O.txt' or E):close() and not (io.open'S.txt' or E):close() and not (io.open'S2.txt' or E):close() and not (io.open'S2b.txt' or E):close() and not (io.open'H.txt' or E):close() and not (io.open'Hb.txt' or E):close() and not (io.open'H2.txt' or E):close() and not (io.open'H2b.txt' or E):close())
    ----
    io.open('O.txt','w'):close()
    lfs.link('O.txt','S.txt',true)
    --hardlink
    lfs.link('S.txt','H.txt')
    os.execute('ln >nul 2>nul S.txt Hb.txt')
    --symlink level 2
    lfs.link('S.txt','S2.txt',true)
    os.execute('ln >nul 2>nul --symbolic S.txt S2b.txt')
    --hardlink level 2
    lfs.link('S2.txt','H2.txt')
    os.execute('ln >nul 2>nul S2.txt H2b.txt')
    ----
    assert(lfs.symlinkattributes'H.txt'.mode=='link')
    assert(lfs.symlinkattributes'Hb.txt'.mode=='link')
    assert(lfs.symlinkattributes'S.txt'.mode=='link')
    assert(lfs.symlinkattributes'S2.txt'.mode=='link')
    assert(lfs.symlinkattributes'S2b.txt'.mode=='link')
    assert(lfs.symlinkattributes'H2.txt'.mode=='link')
    assert(lfs.symlinkattributes'H2b.txt'.mode=='link')
    ----
    local function ln_target(fn)--show the target of a symbolic link
        local r=io.popen('ln --symbolic '..fn)
        return string.match(r:read'a','%-> (.+)\n')
    end
    assert(ln_target'H.txt'=='O.txt')
    assert(ln_target'Hb.txt'=='O.txt')
    assert(ln_target'S.txt'=='O.txt')
    assert(ln_target'S2.txt'=='S.txt')
    assert(ln_target'S2b.txt'=='S.txt')
    assert(ln_target'H2.txt'=='S.txt')
    assert(ln_target'H2b.txt'=='S.txt')
    ----
    local t=[[G:\O.txt]]
    assert(lfs.symlinkattributes'H.txt'.target==t)
    assert(lfs.symlinkattributes'Hb.txt'.target==t)
    assert(lfs.symlinkattributes'S.txt'.target==t)
    assert(lfs.symlinkattributes'S2.txt'.target==t)
    assert(lfs.symlinkattributes'S2b.txt'.target==t)
    assert(lfs.symlinkattributes'H2.txt'.target==t)
    assert(lfs.symlinkattributes'H2b.txt'.target==t)
    os.execute('del O.txt S.txt S2.txt S2b.txt H.txt Hb.txt H2.txt H2b.txt')
    print'test done.'

     

posted on 2021-02-07 09:21  萝卜L  阅读(308)  评论(0编辑  收藏  举报