— search_log.lua
tbResult={};
tbCmdResult={};
local szTmpFolderPath=os.getenv(“temp”);
if not szTmpFolderPath then
os.execute(“md c:\\temp”)
szTmpFolderPath=”c:\\temp”;
end
local tbSpecialWorld={
[“(“]=”%(“, [“)”]=”%)”, [“.”]=”%.”, [“%”]=”%%”,
[“+”]=”%+”, [“-“]=”%-“, [“*”]=”%*”, [“?”]=”%?”,
[“[“]=”%[“, [“]”]=”%]”, [“^”]=”%^”, [“$”]=”%$”,
};
function FormatCmd(szCmd)
return string.gsub(szCmd, “.”, function(s) return tbSpecialWorld[s] or s; end)
end
function FormatPath(szPath)
string.gsub(szPath, “[\/]$”, “”);
return string.gsub(szPath, “/”, “\”);
end
function CheckFile(szFilePath)
local file=io.open(szFilePath, “rb”);
if not file then
return;
end
file:close();
return true;
end
function OpenFile(szFilePath)
if not CheckFile(szFilePath) then
return;
end
local tbFile={};
for line in io.lines(szFilePath) do
table.insert(tbFile, line);
end
return tbFile;
end
function SearchFile(szFilePath, szCmd, fnCmd2Line, fnFileName)
local tbFile=OpenFile(szFilePath);
if not tbFile then
return;
end
tbResult[szFilePath]=tbResult[szFilePath] or {};
local szCmdResult=””;
for nLine, szLine in ipairs(tbFile) do
if string.match(szLine, szCmd) then
szCmdResult=fnCmd2Line(szLine);
if szCmdResult and szCmdResult ~=”” then
table.insert(tbCmdResult, szCmdResult);
end
table.insert(tbResult[szFilePath], nLine .. “:” .. szLine);
end
end
return 1;
end
function Cmd2Line(szLine)
return;
end
function CheckName(szFileName)
return true;
end
function SearchDir(szFolderPath, szCmd, fnCmd2Line, fnCheckName, nIdx)
if not szCmd or szCmd==”” then
return;
end
local fnCmd2Line=fnCmd2Line or Cmd2Line;
local fnCheckName=fnCheckName or CheckName;
local nIdx=nIdx or 0;
local szTmpFileName=szTmpFolderPath .. “\\SearchDirTemp” .. nIdx .. “.tmp”;
os.execute(“dir /b “.. szFolderPath ..” >” .. szTmpFileName);
local tbFile=OpenFile(szTmpFileName);
if not tbFile or #tbFile==0 then
return;
end
local szPath=””;
for _, szFileName in ipairs(tbFile) do
szPath=szFolderPath .. “\” .. szFileName;
if not CheckFile(szPath) then
SearchDir(szPath, szCmd, fnCmd2Line, nIdx + 1);
else
if CheckName(szFileName) then
SearchFile(szPath, szCmd, fnCmd2Line);
end
end
end
end
function Write2File(szInfo, szFilePath)
local file=io.open(szFilePath, “w”);
if not file then
print(szInfo);
print(“Write2File ERR ?? not file ” .. szFilePath);
return;
end
file:write(szInfo);
file:close();
end
function DoSearchDir(szFolderPath, szCmd, tbParam)
if not szFolderPath or szFolderPath==”” or not szCmd or szCmd==”” then
return;
end
tbParam=tbParam or {};
szFolderPath=FormatPath(szFolderPath);
if tbParam.bIsMatch then
szCmd=FormatCmd(szCmd);
end
local nTime=os.time();
SearchDir(szFolderPath, szCmd, tbParam.fnCmd2Line or Cmd2Line, tbParam.fnCheckName or CheckName, 0);
nTime=os.time() – nTime;
print(“搜索用时:” .. nTime);
local szResultPath=tbParam.szResultPath or (szTmpFolderPath .. “\\result.tab.tmp”);
local szResult=””;
for szFilePath, tbInfo in pairs(tbResult) do
szResult=szResult .. szFilePath .. “\n”;
for _, szLine in pairs(tbInfo) do
szResult=szResult .. szLine .. “\n”;
end
end
Write2File(szResult, szResultPath);
local szCmdResult=””;
for _, szLine in pairs(tbCmdResult) do
szCmdResult=szCmdResult .. szLine .. “\n”;
end
Write2File(szCmdResult, tbParam.szCmdResultPath or (szTmpFolderPath .. “\\cmd_result.tab.tmp”));
end
–tbParam=–{
— bIsMatch=false; — 是否使用正则方式搜索
— fnCmd2Line=function () end; — 自定义搜索行内容处理函数
— fnCheckName=function () end; — 文件名限定函数
— szResultPath=”e:\\result.tab”; — 文件搜索内容输出路径
— szCmdResultPath=”e:\\cmd_result.tab”; — 自定义处理函数返回内容储存路径
–}