`
lua
  • 浏览: 76395 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

Windows下Lua进行目录文件查找

阅读更多

from http://sunxiunan.com/?p=1285

 

目的:使用lua进行某个目录下特定类型或指定文件名的查找,并给出一个查找使用核心对象的函数实例。

require"lfs"

function findindir (path, wefind, r_table, intofolder)
    for file in lfs.dir(path) do
        if file ~= "." and file ~= ".." then
            local f = path..'\\'..file
            --print ("\t "..f)
            if string.find(f, wefind) ~= nil then
                --print("\t "..f)
                table.insert(r_table, f)
            end
            local attr = lfs.attributes (f)
            assert (type(attr) == "table")
            if attr.mode == "directory" and intofolder then
                findindir (f, wefind, r_table, intofolder)
            else
                --for name, value in pairs(attr) do
                --    print (name, value)
                --end
            end
        end
    end
end

要注意的是,这段代码使用了LuaFileSystem模块,最好使用Lua for windows这个统合安装包,里面已经包含了。

使用方法很简单,比如我想查找c盘下temp目录的所有cpp文件:

local currentFolder = [[C:\temp]]
-------------------------------------
local input_table = {}
findindir(currentFolder, "%.cpp", input_table, true)

查找到的结果放在input_table中。另外可以使用第四个参数控制是否查找子目录。

给出一个实际的例子,想查找那些函数可能使用kernal object,通过它可以帮助查找是否可能存在handle泄露的情况。当我们找到文件,会在里面查找这些函数名,然后打印出行号。

参考文档是http://msdn.microsoft.com/en-us/library/ms724485%28VS.85%29.aspx

local currentFolder = [[C:\temp]]

local input_table = {}
findindir(currentFolder, "%.cpp", input_table, true)
findindir(currentFolder, "%.h", input_table, true)

    local tbl_found1 = {"CreateRestrictedToken",
                    "DuplicateToken",
                    "DuplicateTokenEx",
                    "OpenProcessToken",
                    "OpenThreadToken",
                    "FindFirstChangeNotification",
                    "CreateFile",
                    "GetThreadDesktop",
                    "OpenProcessToken",
                    "CreateEvent",
                    "CreateEventEx",
                    "OpenEvent",
                    "OpenEventLog",
                    "RegisterEventSource",
                    "OpenBackupEventLog",
                    "CreateFile",
                    "CreateFileMapping",
                    "OpenFileMapping",
                    "FindFirstFile",
                    "HeapCreate",
                    "CreateIoCompletionPort",
                    "CreateJobObject",
                    "CreateMailslot",
                    "CreateMemoryResourceNotification",
                    "LoadLibrary",
                    "GetModuleHandle",
                    "CreateMutex",
                    "CreateMutexEx",
                    "OpenMutex",
                    "CreateNamedPipe",
                    "CreatePipe",
                    "CreateProcess",
                    "OpenProcess",
                    "GetCurrentProcess",
                    "CreateSemaphore",
                    "CreateSemaphoreEx",
                    "OpenSemaphore",
                    "socket",
                    "accept",
                    "CreateThread",
                    "CreateRemoteThread",
                    "GetCurrentThread",
                    "CreateWaitableTimer",
                    "CreateWaitableTimerEx",
                    "OpenWaitableTimer",
                    "BeginUpdateResource",
                    "GetProcessWindowStation",}

        local tbl_found2 = {"CloseHandle",
                    "FindCloseChangeNotification",
                    "CloseEventLog",
                    "DeleteFile",
                    "FindClose",
                    "HeapDestroy",
                    "FreeLibrary",
                    "TerminateProcess",
                    "closesocket",
                    "EndUpdateResource",
                    "DeregisterEventSource",}

        local tbl_result1 = {}
        local tbl_result2 = {}

for _, foundname in ipairs(input_table) do
    local f = assert(io.open(foundname, "rb"))
    local linenum = 0
    while true do
        local buffer = f:read("*l")
        linenum = linenum + 1
        if not buffer then
            break
        end

        for ie = 1, table.maxn(tbl_found1) do
            local start1, end1 = string.find(buffer, tbl_found1[ie])
            local start2, end2 = string.find(buffer, "//")
            if start1 then
                if start2 and start2 < start1 then
                else
                    print("----------------------------------")
                    print(buffer, "\nline: " .. linenum, "\nfile: " .. foundname)
                    print("")
                    if tbl_result1[tbl_found1[ie]] == nil then
                        tbl_result1[tbl_found1[ie]] = 1
                    else
                        tbl_result1[tbl_found1[ie]] = tbl_result1[tbl_found1[ie]] + 1
                    end
                end
            end
        end

        for i2 = 1, table.maxn(tbl_found2) do
            local start1, end1 = string.find(buffer, tbl_found2[i2])
            local start2, end2 = string.find(buffer, "//")
            if start1 then
                if start2 and start2 < start1 then
                else
                    print("----------------------------------")
                    print(buffer, "\nline: " .. linenum, "\nfile: " .. foundname)
                    print("")

                    if tbl_result2[tbl_found2[i2]] == nil then
                        tbl_result2[tbl_found2[i2]] = 1
                    else
                        tbl_result2[tbl_found2[i2]] = tbl_result2[tbl_found2[i2]] + 1
                    end
                end
            end
        end
    end
end

print("result table1 -------------------")
print_table(tbl_result1)

print("")
print("result table2 -------------------")
print_table(tbl_result2)

 

分享到:
评论
1 楼 ray_linn 2009-08-24  
1. dir *.cpp /s 或者 for /r . %%i (*.cpp) do echo %%i
2. for /r . %%i (*.cpp) do call findstr /F:token.lst %%i

相关推荐

    lua5.1 +luarocks for windows64安装版

    总的来说,“lua5.1 + luarocks for windows64安装版”是一个完整的Lua开发环境,适合在64位Windows操作系统上进行Lua编程。它提供了必要的运行时环境和便捷的包管理工具,使得开发者能够在Windows平台上轻松地开发...

    ngx_lua_module-windows-1.1.2.0

    在Windows上安装ngx_lua_module,需要先下载并安装Nginx,然后将模块解压至Nginx的`modules`目录。修改Nginx配置文件,加入模块的编译选项,并配置lua脚本路径。最后,重新编译并启动Nginx。 5. **学习与资源** ...

    luaforwindows.zip

    在Windows环境下,Lua for Windows提供了集成的命令行工具,用户可以直接在命令行窗口中输入Lua代码并立即执行,非常适合进行快速测试和调试。此外,由于Lua语言的灵活性,它可以被广泛应用于游戏开发、网络编程、...

    cocos2dx针对luaforwindows(或scite)的api提示文件

    你需要将提供的luaCocos2dx.api和lua.properties文件复制到Scite安装目录下的相应位置,覆盖原有的文件。这样,Scite就能识别并加载cocos2dx的API信息,实现代码提示功能。 为了正确使用这套API提示文件,你需要...

    Lua的windows编译运行环境

    3. **安装与配置**: 安装LuaForWindows时,通常会自动添加环境变量,使得lua可执行文件能在任何目录下通过命令行调用。若未自动添加,你需要手动将Lua安装目录添加到系统的PATH环境变量中。这样,无论你在哪个目录下...

    window中lua运行环境相关软件.zip

    LuaForWindows提供的强大功能和友好的用户界面使得在Windows环境下使用Lua变得简单而高效。而`vcredist_x86.exe`则确保了所有必要的系统组件得以正确运行,从而避免了因缺少库文件而导致的错误。

    iconv.dll lua测试文件

    这是因为Windows在查找动态链接库时会沿着当前目录、系统路径等搜索。如果不在正确的位置,程序可能会因找不到依赖而失败。 6. **运行测试**:使用命令行工具(如cmd或PowerShell)在测试目录下运行`lua test.lua`...

    LuaForWindows_v5.1.4-45-last.exe Lua开发工具

    lua for windows其实是一整套Lua的开发环境.Lua for Windows 为 Windows 系统下提供了 Lua 脚本语言的开发和运行环境。Lua 是一个小巧的脚本语言。作者是巴西人。该语言的设计目的是为了嵌入应用程序中,从而为应用...

    window系统 Lua脚本语言编译器

    3. 配置环境变量`LUA_PATH`和`LUA_CPATH`,这些变量指定了Lua在查找模块(`.lua`文件)和加载库(`.dll`文件)时的搜索路径。 了解了这些基本知识后,你就可以开始在Windows上编写和运行Lua脚本了。Lua语言简洁明了...

    lua-5.1.tar.gz Mylua-5.1.tar.gz lua生成动态库 lua包管理 pkgconfig PKG_CONFIG_PATH

    标题中的“lua-5.1.tar.gz”和“Mylua-5.1.tar.gz”是两个压缩包文件,分别包含了Lua编程语言的5.1版本源代码。Lua是一种轻量级的脚本语言,广泛用于游戏开发、嵌入式系统、服务器配置等场景。"lua生成动态库"意味着...

    Lua中遍历文件操作代码实例

    在Windows环境下,`dir /b /s`命令会以简洁模式列出指定目录及其所有子目录下的文件,包括文件名和扩展名。而在Linux中,`ls`命令可以列出当前目录下的文件,如果需要递归列出所有子目录,可以使用`find . -type f`...

    Lua开发调试工具

    LuaForWindows还包括了Lua的调试功能,例如断点设置、变量查看和步进执行等,这对于理解代码的执行流程和查找错误至关重要。通过这些调试工具,开发者可以有效地追踪代码执行,定位并修复问题。 资源包中的另一个...

    lua-5.2.4.tar.gz Mylua-5.2.4.tar.gz lua生成动态库 lua包管理 pkgconfig PKG_CONFIG_PATH

    Lua 动态库是将 Lua 编译为可动态加载的库(.so 文件,Linux 下)或 DLL 文件(Windows 下),这样可以在运行时与其他程序动态链接。创建 Lua 动态库的配置可能需要在编译时使用 `-shared` 选项,并可能需要指定其他...

    LUA5.2.2的VS工程

    `LuaSource`目录可能包含了所有LUA5.2.2的核心源码文件,如`lua.c`(LUA解释器)、`lua.h`(头文件)等。 - **编译设置**:在VS中,你需要配置项目的属性页,确保选择正确的C/C++编译器和链接器选项,以便正确编译...

    vs2015 lua插件

    3. **项目管理**:插件支持创建和管理Lua项目,可以组织和编译多个Lua文件,方便构建复杂的系统。 4. **集成资源管理**:BabeLua还能够管理和打包项目中的资源文件,如图像、音频等,这对于游戏开发尤其有用。 5. ...

    Lua编译源文件

    在Windows系统中,当程序需要使用Lua功能时,会依赖这样的DLL文件。它包含了执行Lua脚本所需的全部函数和数据结构,使得其他程序可以调用Lua的API来运行或解析Lua代码。 luac.exe是Lua的编译器,全称为Lua Compiler...

    拖入BAT替换(lUa实现)_luabat_

    描述中提到的“将拖入BAT的文本按规则替换(lUa语言实现 方便维护)”,意味着这个Lua脚本会接收用户通过拖放操作导入的批处理文件,然后根据预定义的规则对文件中的文本进行查找和替换。这可能是为了更新批量的...

    LUA与VC DLL互相调用

    在这个例子中,`dll_call_to_lua`函数查找LUA全局变量`lua_function`,并尝试调用它,传递一个字符串参数。LUA函数应接受这个参数并执行相应操作。 提供的资源中包含了一个名为"8.Lua讲解.exe"的视频教程,可能详细...

    LUA资料打包(安装程序,源代码)

    1. **LUA安装程序**:这可能是一个用于在不同操作系统上安装LUA解释器的程序,例如Windows上的.exe文件或Linux/Mac下的.tar.gz文件。安装程序会帮助用户配置环境变量,使他们能够在命令行或其他集成开发环境中执行...

    lua5.1源码

    使用这个项目文件,开发者可以直接在VS2010中打开、编译和调试Lua源码,这对于理解Lua的工作原理和进行开发工作极具价值。 总的来说,掌握Lua5.1源码对于提升对脚本语言的理解,尤其是对Lua的使用和优化,具有显著...

Global site tag (gtag.js) - Google Analytics