AriosJentu Posted June 4, 2014 Share Posted June 4, 2014 Здравствуйте. Меня интересует вопрос - как можно с сервера проверить, какие файлы находятся в директории этого ресурса на клиентской стороне пользователя? Например в директории "MTA SA 1.3/mods/deathmatch/resources/resname/files" лежат файлы "lal.txt" и "bomba.png". Каким образом можно проверить, что там есть именно эти файлы, чтобы высветить их в, допустим, gridlist? Link to comment
Kenix Posted June 4, 2014 Share Posted June 4, 2014 addEvent addEventHandler fileExists triggerClientEvent triggerServerEvent Суть проста. Ты делаешь вызов через triggerClientEvent, на клиенте (в событии) создаешь временную таблицу, потом через цикл (таблица с путями файлов) проверяешь функцией fileExists, если есть то добавляешь во временную таблицу. После этого отсылаешь серверу временную таблицу через triggerServerEvent. А дальше уже делай что хочешь. Link to comment
AriosJentu Posted June 4, 2014 Author Share Posted June 4, 2014 Может массивом можно сделать это? Кстати, если допустить такой вариант, что файлы туда можно добавить пользователю без причастия МТА, данный цикл мог бы сработать? Link to comment
Kenix Posted June 4, 2014 Share Posted June 4, 2014 Может массивом можно сделать это? Ты можешь сам решать как добавлять, можешь добавлять через table.insert (тогда твоя таблица будет массивом), можешь table[ ключ ] = значение (если ключ не число, то это будет ассоциативный массив). Кстати, если допустить такой вариант, что файлы туда можно добавить пользователю без причастия МТА, данный цикл мог бы сработать? fileExists будет работать даже если ты сам закинешь файл в папку "MTA SA 1.3/mods/deathmatch/resources/resname/files". Link to comment
AriosJentu Posted June 4, 2014 Author Share Posted June 4, 2014 Так, это понятно. А fileExists как я буду юзать в цикле? Перебирать все возможные комбинации букв в поиске нужного файла? Или тогда как, там же вроде нужно искать по имени файла. Или проверять по формату файла? Тогда нужно будет количество файлов в папке знать, чтобы цикл заюзать. Или всё гораздо проще? Link to comment
Kenix Posted June 4, 2014 Share Posted June 4, 2014 Ты можешь только указать какие файлы стоит проверять, в MTA нету функции для получения файлов в директории. Данное нововведение есть в форке mta: eir. https://wiki.multitheftauto.com/wiki/MTA:Eir https://wiki.multitheftauto.com/wiki/Modules/FileSystem https://wiki.multitheftauto.com/wiki/MTA:Eir/FileSystem Link to comment
AriosJentu Posted June 4, 2014 Author Share Posted June 4, 2014 Как тогда проверять только указанные файлы? Link to comment
Kenix Posted June 5, 2014 Share Posted June 5, 2014 local aFoundedFiles = {}; local aFiles = { "abc.txt", "abc2.txt" }; for i, v in ipairs( aFiles ) do if fileExists( v ) then table.insert( aFoundedFiles, v ); end end Link to comment
AriosJentu Posted June 6, 2014 Author Share Posted June 6, 2014 Все возможные комбинации названия файлов будет трудно собрать. Есть ли способ попроще? Link to comment
Other Languages Moderators Disinterpreter Posted June 6, 2014 Other Languages Moderators Share Posted June 6, 2014 Все возможные комбинации названия файлов будет трудно собрать. Есть ли способ попроще? Как вариант в опредленный файл записывать названия всех создаваемых файлов, а потом его читать. Link to comment
AriosJentu Posted June 9, 2014 Author Share Posted June 9, 2014 Подумал, и попробовал заюзать такую-же структуру записи и открытия файла, как в guiEditor'e. Получилось примерно такое: function loadAllFiles() if fileExists(":"..getResourceName(getThisResource()).."/files/files.txt") then fs = fileOpen(":"..getResourceName(getThisResource()).."/files/files.txt") if fs then if fileGetSize(fs) > 0 then fss = fileRead(fs, fileGetSize(fs)) if fss and fss ~= "" then local fil = split(fss, "\n") x={} for i,v in ipairs(tArray) do if v ~= "" then if not string.find(string.sub(v, 1, string.len(v)-4), ".txt", 0, true) then v=v..".txt" end if not string.find(v, "/", 0, true) then v=":"..getResourceName(getThisResource()).."/files/"..v end if fileExists(v) then local fx = fileOpen(v) if fx then x[v] = fileGetSize(fx) fileClose(fx) else x[v] = true end end end end end end end fileClose(fs) else local ffss = fileCreate(":"..getResourceName(getThisResource()).."/files/files.txt") if ffss then fileClose(ffss) end end return x or {} end function loadFile(name) row = guiGridListAddRow(documents) guiGridListSetItemText(documents, guiGridListGetColumnCount(documents), columnl, name, false, false) addEventHandler("onClientGUIClick", open, function() if guiGridListGetSelectedItem(row) then getFile(name) end end, false) end function getFile(filename) addFile(filename) filse = loadAllFiles() if filse[filename] == false then addFile(filename) end end function addFile(file) local f if fileExists(":"..getResourceName(getThisResource()).."/files/files.txt") then f = fileOpen(":"..getResourceName(getThisResource()).."/files/files.txt") end if not f then f = fileCreate(":"..getResourceName(getThisResource()).."/files/files.txt") end if f then fileSetPos(f, fileGetSize(f)) fileWrite(f, "\n"..file) fileClose(f) end end Но как это использовать, я так и не пойму. Link to comment
AriosJentu Posted June 11, 2014 Author Share Posted June 11, 2014 Подниму данный вопрос. Link to comment
AriosJentu Posted June 11, 2014 Author Share Posted June 11, 2014 Спасибо, сам сделал уже Link to comment
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now