我有两个绝对文件路径(A
和B
)。我想转换A
为B
. 我如何使用 Lua 脚本来做到这一点?
问问题
2586 次
2 回答
3
执行此操作的算法是:
- 将两条路径都转换为规范形式。(即从文件系统根目录开始,没有尾部斜杠,没有双斜杠等)
- 从这两个路径中,删除它们的公共前缀。(例如从
A="/a/b/c/d.txt" B="/a/b/e/f.txt"
到A="c/d.txt" B="e/f.txt"
) - 通过路径分隔符拆分剩余路径。(所以你最终会得到
A={"c", "d.txt"} B={"e", "f.txt"}
- 如果原始路径
B
指向常规文件,则删除B
. 如果它指向一个目录,则保持原样。(对于我们的示例,您会得到B={"e"}
) - 对于 B 中剩下的每个项目,
..
在 的开头插入 aA
。(结果为A={"..", "c", "d.txt"}
) - 加入内容
A
使用路径分隔符得到最终结果:"../c/d.txt"
这是一个非常粗略的实现,不需要库。它不处理任何边缘情况,例如from
和to
是相同的,或者一个是另一个的前缀。(我的意思是在这些情况下该函数肯定会中断mismatch
,因为将等于0
。)这主要是因为我很懒;也因为代码已经有点长了,这会更加损害可读性。
-- to and from have to be in a canonical absolute form at
-- this point
to = "/a/b/c/d.txt"
from = "/a/b/e/f.txt"
min_len = math.min(to:len(), from:len())
mismatch = 0
print(min_len)
for i = 1, min_len do
if to:sub(i, i) ~= from:sub(i, i) then
mismatch = i
break
end
end
-- handle edge cases here
-- the parts of `a` and `b` that differ
to_diff = to:sub(mismatch)
from_diff = from:sub(mismatch)
from_file = io.open(from)
from_is_dir = false
if (from_file) then
-- check if `from` is a directory
result, err_msg, err_no = from_file:read(0)
if (err_no == 21) then -- EISDIR - `from` is a directory
end
result = ""
for slash in from_diff:gmatch("/") do
result = result .. "../"
end
if from_is_dir then
result = result .. "../"
end
result = result .. to_diff
print(result) --> ../c/d.txt
于 2012-11-05T01:13:48.410 回答