我有兩個絕對文件路徑(A
和B
)。我想用B
的相對路徑轉換A
。我如何使用Lua腳本來做到這一點?如何使用LUA轉換相對路徑中的絕對路徑?
回答
的算法要做到這一點是:
- 都轉換路徑,以規範形式。 (即從文件系統根目錄開始,沒有結尾斜槓,沒有雙斜槓等)
- 從兩個路徑中刪除它們的公共前綴。 (例如,從
A="https://stackoverflow.com/a/b/c/d.txt" B="https://stackoverflow.com/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中每一個項目,在
A
開頭插入一個..
(與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 = "https://stackoverflow.com/a/b/c/d.txt"
from = "https://stackoverflow.com/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
非常感謝! – user1798951
使用現有的實現是一個好主意,但它似乎依賴於['lfs'](http://keplerproject.github.com/luafilesystem/),這是一個二進制擴展。這可能是也可能不是一個問題 - 不知道有多麼棘手或者不在本機擴展中使用他們的應用程序 - 對於OP。 – millimoose
是的,LFS是一個頻繁的要求,但我應該降低它,謝謝你這樣做;) – catwell
- 1. 如何相對路徑轉換爲絕對路徑的Unix
- 2. 使用codeigniter將ajax相對路徑轉換爲絕對路徑
- 3. 如何將相對路徑轉換爲絕對路徑在C#
- 4. 如何使用我的scrapy CrawlSpider將相對路徑轉換爲絕對路徑?
- 5. 絕對路徑到相對路徑的轉換
- 6. 將路徑轉換爲絕對路徑
- 7. 轉換爲相對路徑C#絕對路徑
- 8. 將相對路徑轉換爲絕對路徑C#
- 9. 將絕對路徑轉換爲相對路徑
- 10. PHP轉換外部相對路徑絕對路徑
- 11. 將絕對路徑轉換爲客戶端相對路徑
- 12. 如何將相對路徑轉換爲C中的絕對路徑?
- 13. 如何將絕對路徑轉換爲PowerShell中的相對路徑?
- 14. 如何將Ant中的相對路徑轉換爲絕對路徑?
- 15. 相對路徑或絕對路徑
- 16. 絕對路徑和相對路徑
- 17. 改變相對路徑絕對路徑
- 18. Node.js:相對路徑和絕對路徑
- 19. 如何將相對路徑轉換爲C++/gtkmm下的絕對路徑?
- 20. 使用絕對路徑或相對路徑陣營路線
- 21. 如何處理Localhost中的相對路徑和絕對路徑
- 22. 將相對路徑轉換爲svg中的相對路徑
- 23. 更改相對路徑和絕對路徑的基本路徑
- 24. 用絕對路徑URL替換相對路徑網址
- 25. 檢測路徑是絕對路徑還是相對路徑
- 26. 檢查路徑是絕對路徑還是相對路徑
- 27. 結合的絕對路徑使用相對路徑
- 28. 絕對與相對路徑
- 29. 相對和絕對路徑
- 30. 相對v絕對路徑?
如果您提供了'A'和'B'以及您想要的輸出示例,那麼您的問題就會變得更加清晰。 – millimoose
你問是否有一個特定的功能來做到這一點,或者你是否要求在Lua中實現它的算法? –