Название: [LUA] Поиск файлов определенного типа в указанной директории и ее поддиректориях.
Отправлено: dfx от 30 Июня 2010, 13:30:17
Узконаправленная функция, для создания списка файлов определенного типа, которые находятся в указанной папке. На вход она принимает список расширений и путь, на выходе - список файлов с полными путями. Функция понимает и относительные пути, но в этом случае она вернет так же относительные пути.
В качестве разделителя в списке расширений, используется символ переноса строки, поэтому, даже после последней строчки надо ставить этот символ.
Тип: Работа с FS Конструкция: LUA + Quest3DChannels Использование OO: нет
ВНИМАНИЕ! Функция использует общий цикл, для обхода директорий, а значит она не вернет управление приложению, пока не закончит задачу. Поэтому, не рекомендуется запускать поиск в корне диска.
В отличии от подобного исходника от Dimis'а, функция не использует OO, а значит ее можно скопировать в любое место проекта и не надо подключать доп. cgr-файл. Очень маленькая конструкция. Субъективно, более быстрая скорость работы. Втроенный фильтр по расшиениям файлов. На выходе готовый список для загрузчика.
Из минусов: Не умеет искать по маске(имена файлов при отборе не учитываются, только расширения), нет триггера события при нахождении верного файла. Нельзя искать Все файлы, т.е. если не задать расширения в списке, то ничего не найдет.
Название: Re: [LUA]Поиск файлов определенного типа в указанной директории и ее поддиректориях.
Отправлено: DimiS от 02 Июля 2010, 11:32:56
круто! я почему то в своё время не догадался, что если нельзя использовать функции луа для перебора файлов, то можно дёргать q3d ченелы для этого из оптимайза могу предложить чтоб createExtensionsList(i_extList) выполнялся только один раз ну и недостатки нет триггера события при нахождении верного файла. Нельзя искать Все файлы, т.е. если не задать расширения в списке, то ничего не найдет в общем-то легко устранимы ;)
Название: Re: [LUA]Поиск файлов определенного типа в указанной директории и ее поддиректориях.
Отправлено: DimiS от 02 Июля 2010, 11:55:33
я тут немного доработал твой луа код :) теперь в конце списка с расширениями не обязательно должен быть ещё один перенос строки, ну и сделал чтоб построение списка выполнялось только один раз -- CallChannel function is called when channel is called function createExtensionsList(iExtText) local list={} local pos=0 local oldPos=0 local i=0 local tMax2 = string.len(iExtText) while pos<tMax2 do if string.sub(iExtText,pos,pos+1)=='\r\n' then pos = pos + 2 list[i+1] = string.sub(iExtText,oldPos,pos-3 ) oldPos = pos i = i + 1 else pos = 1 + pos end
end if oldPos<tMax2 then list[i+1] = string.sub(iExtText,oldPos,tMax2) end return list end
function getExtension(iFileName) result='' local res=0 local tMax2 = string.len(iFileName) local pos = tMax2 while pos>0 do if string.sub(iFileName,pos,pos)=='.' then res = res + 1 break end pos = pos-1 end if res>0 then result = string.sub(iFileName,pos+1,tMax2) else result=iFileName end return result end
function extensionFilter(i_fileName)
local result = 0 local oExtFound = getExtension(i_fileName) for i,v in pairs(extList) do if extList[i]==oExtFound then result=i break end end if result==0 then -- oExtFound = 'Invalid File' end
return result end
function searchDirAndFiles(iDirPath)
local currentValue = channel.GetChild(2) local currentDir = channel.GetChild(3) local dirOrFiles = channel.GetChild(4) local update = channel.GetChild(5) local nxItems = channel.GetChild(6) local nameOfItem = channel.GetChild(7) local result = {{},{}} --(folders,files) currentDir:SetText(iDirPath) update:CallChannel()
--fileList dirOrFiles:SetValue(1) --searchFiles local files = nxItems:GetValue() currentValue:SetValue(0) local i = 0 while i<files do result[1][i+1] = iDirPath..'\\'..nameOfItem:GetText() i = 1 + i currentValue:SetValue(i) end --createDirList local dirList = {} dirOrFiles:SetValue(0) --searchDirs local folders = nxItems:GetValue() currentValue:SetValue(0) local j = 0 while j<folders do dirList[j+1] = iDirPath..'\\'..nameOfItem:GetText() j = 1 + j currentValue:SetValue(j) end --scanChildsFolders for k,v in pairs(dirList) do result[2][k] = searchDirAndFiles(dirList[k]) end
return result end
function createFileList(iFsList)
local result=''
for i,v in pairs(iFsList[1]) do if extensionFilter(iFsList[1][i])>0 then result = result..iFsList[1][i]..'\r\n' end
end for i,v in pairs(iFsList[2]) do
result = result..createFileList(iFsList[2][i]) end
return result end
function CallChannel() --input data local i_extList = channel.GetChild(0):GetText() extList = createExtensionsList(i_extList) local path = channel.GetChild(1):GetText()
--out data local result = channel.GetChild(8) if path ~= '' then local lFsList = searchDirAndFiles(path) local fileList = createFileList(lFsList) result:SetText(fileList) end
end
-- GetValue function is called when this channels is used as Value function GetValue() return -1 end
Название: Re: [LUA]Поиск файлов определенного типа в указанной директории и ее поддиректориях.
Отправлено: dfx от 03 Июля 2010, 00:20:56
Привет,DimiS. можно дёргать q3d ченелы для этого Я немного покопался в сети и понял, что стандартные модули луа не умеют работать с FS. Нашел подключаемые, но как их подключить - не смог разобраться. Пришлось вот так извратиться). Сама возможность в луа создавать списки, позволяет сильно упростить обработку массивов. :) Вообще же разработчики, походу, разблокировали некоторые функции в луа. Теперь я спокойно могу удалять и переименовывать файлы.(4.3.2) Раньше не работало, по крайней мере на 3.x. я тут немного доработал твой луа код Спасибо! :)
Название: Re: [LUA] Поиск файлов определенного типа в указанной директории и ее поддиректориях.
Отправлено: →|๖ۣۜDen|← от 27 Сентября 2014, 02:00:00
Немного переработал переработанный DimiS'ом код под собственные нужды, теперь с помощью скрипта можно получить список из всех папок и файлов в выбранной директории. Поиск производится без рекурсии, поэтому содержимое поддиректорий не рассматривается. -- CallChannel function is called when channel is called function searchDirAndFiles(iDirPath) local currentValue = channel.GetChild(1) local currentDir = channel.GetChild(2) local dirOrFiles = channel.GetChild(3) local update = channel.GetChild(4) local nxItems = channel.GetChild(5) local nameOfItem = channel.GetChild(6) local result = {{},{}} --(folders,files) currentDir:SetText(iDirPath) update:CallChannel()
--fileList dirOrFiles:SetValue(0) --searchFiles local files = nxItems:GetValue() currentValue:SetValue(0) local i = 0 while i<files do result[1][i+1] = iDirPath..'\\'..nameOfItem:GetText() i = 1 + i currentValue:SetValue(i) end --createDirList
dirOrFiles:SetValue(1) --searchDirs local folders = nxItems:GetValue() currentValue:SetValue(0) local j = 0 while j<folders do result[2][j+1] = iDirPath..'\\'..nameOfItem:GetText() j = 1 + j currentValue:SetValue(j) end return result end
function createFileList(iFsList) local result='' for i,v in pairs(iFsList[1]) do result = result..iFsList[1][i]..'\r\n' end for j,v in pairs(iFsList[2]) do result = result..iFsList[2][j]..'\r\n' end return result end
function CallChannel() --input data local path = channel.GetChild(0):GetText()
--out data local result = channel.GetChild(7) if path ~= '' then local lFsList = searchDirAndFiles(path) local fileList = createFileList(lFsList) result:SetText(fileList) end end
-- GetValue function is called when this channels is used as Value function GetValue() return -1 end
|