【问题标题】:Setting file paths with Lua/C++使用 Lua/C++ 设置文件路径
【发布时间】:2016-05-14 12:34:27
【问题描述】:

我将 xml 配置文件存储在动态切换的文件夹中。但行为是绝对路径,我需要一个相对路径。 lua 代码可用于 windows 路径(反斜杠)和 mac 路径(正斜杠)。

在我的 Mac 上,路径可能是 /folder/folder/profile1.xml。在正常应用程序中,程序将返回 profile1.xml 的文件/位置。它会在同一文件夹中找到下一个配置文件。 如果我使用 ../profile2.xml 等相对链接将应用程序定向到新文件夹,则程序将找到新配置文件并将文件/位置作为 ../profile2.xml 返回。然后它不会在同一个文件夹中找到下一个配置文件......它要么在一个步骤(../)中寻找下一个配置文件,要么在应用程序设置的原始文件夹中寻找下一个配置文件。我希望它在这个新文件夹位置中找到下一个请求的配置文件。

设置当前配置文件和配置文件路径的现有代码是这样的:

local loadedprofile = '' --set by application
local profilepath = '' --set by application and modified below

相关的切换函数好像是:

local function setDirectory(value)
profilepath = value
end

local function setFile(value)
if loadedprofile ~= value then
doprofilechange(value)
end
end

local function setFullPath(value)
local path, profile = value:match("(.-)([^\\/]-%.?([^%.\\/]*))$")
profilepath = path
if profile ~= loadedprofile then
doprofilechange(profile)
end 

我想我可能需要修改第三个函数的匹配条件以删除 ../.也许像这样删除可选的 .'s

local function setFullPath(value)
local path, profile = value:match("(.-)([^\\/]-([^%.\\/]*))$")
profilepath = path
if profile ~= loadedprofile then
doprofilechange(profile)
end 

我真的不知道如何编写这段代码,我只是想调整这个开源代码 (MIDI2LR) 以满足我的需要。在我对代码的初步理解中,匹配标准似乎过于复杂。但我想知道我是否读对了。我将其解释为:

:match("(.-)([^\\/]-%.?([^%.\\/]*))$")
(.-) --minimal return
(  )$ --from the end of profile path
[^\\/]- --starts with \ or \\ or /, 0 or more occurrences first result
%.? --through, with dots optional
[^%.\\/]* --starts with . or \ or \\ or /, 0 or more occurrences all results

如果我没看错的话,第一个“开始于”似乎是完全多余的,或者“从头到尾”应该与第二个“开始于”相关联。

我已经注释掉了 setFullPath 函数,但没有得到想要的结果,这让我认为可能需要将匹配要求添加到 setDirectory 函数中。

任何帮助都非常感谢,因为我在我的头上。谢谢!

【问题讨论】:

    标签: c++ lua


    【解决方案1】:

    您对比赛的解读有误,这里有一个更准确的版本:

    :match("(.-)([^\\/]-%.?([^%.\\/]*))$")
    (.-) -- Match and grab everything up until the first non slash character
    (  )$ -- Grab everything up until the end
    [^\\/]- -- Starts with any character OTHER THAN \ or /, 0 or more occurrences first result
    %.? -- single dot optional in the middle of the name (for dot in something.ext)
    [^%.\\/]* -- Any character OTHER THAN . or \ or /, 0 or more occurrences
    

    一些注释 - %. 是一个文字点。 [^xyz] 是逆类,所以除了 x、y 或 z 之外的每个字符。 \\ 实际上只是一个反斜杠,这是由于字符串中的转义。

    这个更简单的版本会以更容易使用的类似方式破坏它:value:match("(.-)([^\\/]+)$")

    您可能希望提供有关配置文件加载行为的更多信息,很难说出您需要代码做什么。在您给出的示例中,路径和配置文件具有什么价值?

    【讨论】:

    • 感谢@Adam B。您的解释比我使用的 lua.org 参考 (lua.org/pil/20.2.html) 更有意义,特别是在参考 ^.我理解了字面上的点。而且我理解 \ 转义,但我期望 % 转义适用于函数字符串。 这个更简单的版本会以更容易使用的类似方式破坏它:value:match("(.-)([^\\/]+)$")
    • 我实际上类似地重写了它 'match("(.-)([^\\/]*%.?)$")' 但我可以看到可选的文字点并不是真的必需,因为它是已包含的字符。在这两种重写中,文字点都被排除在“其他”语句之外......对于相同的功能,不需要包含文字点吗?
    • 您的新版本在功能上是等效的,因为[^\\/]* 无论如何都会贪婪地匹配该行的其余部分。这 %。?在这一点上只是在最后,不是必需的,所以它被遗漏了。
    • 我想你是在问'本地路径,profile = value:match..'行中path和profile的值是什么,因为profilepath = path我相信它是用户设置的路径设置。 IE。 /applications/adobe/plug-ins/profiles/basic.配置文件将是当前加载的任何内容,即 profile1.xml。
    • 我目前在基本文件夹中有一个配置文件,在配置文件文件夹中有多个配置文件。当前,当它更改配置文件时,它是对基本文件夹的引用,在那里查找。我现在不知道确切的结果,但是如果我使用相对链接将其备份到配置文件文件夹中,它会报告加载的配置文件是 ../profile2.xml 并且它丢失了......它找不到其他配置文件w/在配置文件文件夹中。我希望它在当前所在的任何文件夹中“重新归位”。
    猜你喜欢
    • 2019-12-13
    • 2013-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-21
    • 2010-12-16
    • 2011-08-04
    • 1970-01-01
    相关资源
    最近更新 更多