让Lua自己把文件夹下面的所有文件自动加载起来吧

Posted 一个兴趣使然的程序员

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了让Lua自己把文件夹下面的所有文件自动加载起来吧相关的知识,希望对你有一定的参考价值。

没有想到我也做了一回标题党。其实这里边说的自动还是有夸大其词的部分。其实只是指定文件夹,然后根据指定文件夹数据,加载目录下边的内容而已。

怎么来进行Lua文件的加载

一般情况下,相关的功能需要给他创建一个相关的目录,然后直接通过我写的一个组件指定这个目录的加载位置就行了。不同的目录之间需要明确他们的加载顺序。

为什么要这么做?

  1. 加载的条理性。一般情况下,Lua文件会在需要的时候进行内存加载,这样比较混乱。说比较混乱的原因是没有明确的地方来控制加载的顺序,所以文件加载的顺序比较看脸。
  2. 加载内容的安全性。这里提到的安全性并不是说的什么高深的东西。而是这个东西究竟有没有加载成功。如果使用了,我所说的加载方式进行加载,文件内容加载只要存在相关的文件夹中就会自动加载,一般不会漏下。
  3. 明确同一个文件夹下的文件加载顺序。一般情况下init.lua会首先加载,然后加载其他文件。最后加载loadend.lua文件。在编写软件的时候可以根据这些文件的加加载顺序来进行内容加载的顺序控制。
  4. 实现位置的无关性。配合工厂模式,可以在完全不关心实现位置的情况下,实现相关功能。
  5. 文件位置的条理性。具体的实现位置可以在不记位置的情况下推理出他应该在什么地方实现。(个人觉得这个非常重要)

实际引用

技术分享 

总结

其实是一个非常简单的功能,但是用处却非常大。可能我不是很会总结这个东西。哈哈。总之分享一下吧

文件

-- local lfs = require("lfs")

local AutoRequire = class("AutoRequire")

local instance = nil

function AutoRequire:getInstance()
    return instance
end

function AutoRequire:init(dir)
    instance.OriginalPath = dir or lfs.currentdir()
    print("instance.OriginalPath", instance.OriginalPath)
end

function AutoRequire:getTag()
    return self._tag
end

function AutoRequire:getRequirePath()
    return self._require_path
end

function AutoRequire:require(path, data)
    local loadpath = self.OriginalPath../..path
    assert(lfs.symlinkattributes(loadpath), "Error AutoRequire path not find "..path)
    lfs.chdir(loadpath)

    self._tag = data
    self._require_path = path

    local initfile = path../.."init.lua"
    if cc.FileUtils:getInstance():isFileExist(initfile) then
        -- print("require("..initfile..")")
        local loadf = path../.."init"
        -- print("require "..loadf)
        require(loadf)
    end

    for file in lfs.dir(loadpath) do
        if file ~= "." and file ~= ".." and file ~= "init.lua" and file ~= "loadend.lua" then
            local f = loadpath ../..file
            local attr = lfs.attributes(f)
            local filename = string.gsub(file, ".lua$", "")
            if attr.mode == "file" and file ~= filename then
                -- print("require("..path..‘/‘..file..")")
                local loadf = path../..filename
                -- print("require "..loadf)
                require(loadf)
            end
        end
    end

    local initfile = path../.."loadend.lua"
    if cc.FileUtils:getInstance():isFileExist(initfile) then
        -- print("require("..initfile..")")
        local loadf = path../.."loadend"
        -- print("require "..loadf)
        require(loadf)
    end

    self._tag = nil
    self._require_path = nil

    lfs.chdir(self.OriginalPath)
end

instance = AutoRequire.new()
cc.exports.AutoRequire = AutoRequire

return AutoRequire

 

 

以上是关于让Lua自己把文件夹下面的所有文件自动加载起来吧的主要内容,如果未能解决你的问题,请参考以下文章

Problem A: 让动物们叫起来吧!

想请问一下,如何把一个.php文件写成一个bat批处理文件添加到系统计划任务里面让它自动执行?

redis-cli 加载 lua 文件

怎样使用lua读取文件夹内所有文件?

【FGUI】自动生成UI控件代码,lua写的插件

雷林鹏分享:Lua 模块与包