20 Мая 2024, 06:57:44
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.

Навигация по форуму







guest3d
Quest3D - Русскоязычное сообщество > Quest3D > База исходников (cgr/igr) > [LUA] Поиск файлов определенного типа в указанной директории и ее поддиректориях.
[LUA] Поиск файлов определенного типа в указанной директории и ее поддиректориях.
(Прочитано 7814 раз)
  [1]
Печать
dfx | ** | Пользователь | Сообщений: 95 | « 30 Июня 2010, 13:30:17 »
[LUA] Поиск файлов определенного типа в указанной директории и ее поддиректориях. |
0
Узконаправленная функция, для создания списка файлов определенного типа, которые находятся в указанной папке.
На вход она принимает список расширений и путь, на выходе - список файлов с полными путями.
Функция понимает и относительные пути, но в этом случае она вернет так же относительные пути.

В качестве разделителя в списке расширений, используется символ переноса строки, поэтому, даже после последней строчки надо ставить этот символ.

Тип: Работа с FS
Конструкция: LUA + Quest3DChannels
Использование OO: нет


ВНИМАНИЕ!
Функция использует общий цикл, для обхода директорий, а значит она не вернет управление приложению, пока не закончит задачу. Поэтому, не рекомендуется запускать поиск в корне диска.

В отличии от подобного исходника от Dimis'а, функция не использует OO, а значит ее можно скопировать в любое место проекта и не надо подключать доп. cgr-файл. Очень маленькая конструкция. Субъективно, более быстрая скорость работы. Втроенный фильтр по расшиениям файлов. На выходе готовый список для загрузчика.

Из минусов:
Не умеет искать по маске(имена файлов при отборе не учитываются, только расширения), нет триггера события при нахождении верного файла. Нельзя искать Все файлы, т.е. если не задать расширения в списке, то ничего не найдет.
* scanFolderForFiles.zip (3.32 Кб - загружено 659 раз.)
« Последнее редактирование: 30 Июня 2010, 17:06:54 от dfx »
DimiS | **** | Старожил | Сообщений: 284 | «Ответ #1 02 Июля 2010, 11:32:56 »
Re: [LUA]Поиск файлов определенного типа в указанной директории и ее поддиректориях. |
1
круто! я почему то в своё время не догадался, что если нельзя использовать функции луа для перебора файлов, то можно дёргать q3d ченелы для этого
из оптимайза могу предложить чтоб createExtensionsList(i_extList) выполнялся только один раз
ну и недостатки
Цитировать
нет триггера события при нахождении верного файла. Нельзя искать Все файлы, т.е. если не задать расширения в списке, то ничего не найдет
в общем-то легко устранимы  Подмигивающий
DimiS | **** | Старожил | Сообщений: 284 | «Ответ #2 02 Июля 2010, 11:55:33 »
Re: [LUA]Поиск файлов определенного типа в указанной директории и ее поддиректориях. |
2
я тут немного доработал твой луа код  Улыбающийся
теперь в конце списка с расширениями не обязательно должен быть ещё один перенос строки, ну и сделал чтоб построение списка выполнялось только один раз
Код:
-- 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
dfx | ** | Пользователь | Сообщений: 95 | «Ответ #3 03 Июля 2010, 00:20:56 »
Re: [LUA]Поиск файлов определенного типа в указанной директории и ее поддиректориях. |
3
Привет,DimiS.
Цитировать
можно дёргать q3d ченелы для этого
Я немного покопался в сети и понял, что стандартные модули луа не умеют работать с FS. Нашел подключаемые, но как их подключить - не смог разобраться. Пришлось вот так извратиться). Сама возможность в луа создавать списки, позволяет сильно упростить обработку массивов. Улыбающийся

Вообще же разработчики, походу, разблокировали некоторые функции в луа. Теперь я спокойно могу удалять и переименовывать файлы.(4.3.2) Раньше не работало, по крайней мере на 3.x.

Цитировать
я тут немного доработал твой луа код
Спасибо!  Улыбающийся
→|๖ۣۜDen|← | ***** | Администратор | Ветеран | Сообщений: 570 | «Ответ #4 27 Сентября 2014, 02:00:00 »
Re: [LUA] Поиск файлов определенного типа в указанной директории и ее поддиректориях. |
4
Немного переработал переработанный 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
* LUA_ScanFoldersAndFiles.cgr (9.17 Кб - загружено 744 раз.)
 
  [1]
Печать
 
Quest3D - Русскоязычное сообщество > Quest3D > База исходников (cgr/igr) > [LUA] Поиск файлов определенного типа в указанной директории и ее поддиректориях.
Перейти в: