HeroBrine1st 88 Опубликовано: 9 февраля, 2017 (изменено) Поскольку в нашем opencomputers нет виртуальных папок, я решил их написать. Но кроме этого я сделал возможность выбирать, с какими правами монтировать папку - Read/Only или Read/Write. Поскольку я успешно потерял свой pastebin, я кидаю вам текстом код local filesystem = require("filesystem") local fs = require("filesystem") local component = require("component") local computer = require("computer") local mount = {} function mount.mountFolder(otkyda,kyda,write) --я в курсе, костыли if not type(otkyda) == "string" then error("Bad argument #1 (String expected, got " .. type(otkyda) .. ")") end if not type(kyda) == "string" then error("Bad argument #2 (String expected, got " .. type(kyda) .. ")") end if not type(write) == "boolean" then error("Bad argument #3 (Boolean expected, got " .. type(write) .. ")") end if not filesystem.isDirectory(otkyda) then error("Bad path (Directory expected, got file)") end local rootFS = fs.get(otkyda) local proxy = {} proxy.convertPath = function(path) return fs.concat(otkyda,path) end proxy.address = "VirtualFS" .. tostring(math.random(0x000000,0xFFFFFF)) proxy.type = "filesystem" proxy.label = proxy.address proxy.spaceUsed = fs.get(otkyda).spaceUsed proxy.spaceTotal = fs.get(otkyda).spaceTotal proxy.makeDirectory = function(dir) if write then fs.get(otkyda).makeDirectory(proxy.convertPath(dir)) else error("Permission Denied") end end proxy.isReadOnly = function() return not write end proxy.rename = function(from,to) if write then fs.get(otkyda).rename(proxy.convertPath(from),proxy.convertPath(to)) else error("Permission Denied") end end proxy.remove = function(chto) if write then fs.get(otkyda).remove(proxy.convertPath(chto)) else error("Permission Denied") end end proxy.setLabel = function(label) if write then proxy.label = label end end proxy.size = function(path) return fs.get(otkyda).size(proxy.convertPath(path)) end proxy.getLabel = function() return proxy.label end proxy.exists = function(path) return rootFS.exists(proxy.convertPath(path)) end proxy.open = function(path,mode) if write then return rootFS.open(proxy.convertPath(path),mode) else if mode == "r" then return rootFS.open(proxy.convertPath(path),"r") else error("Permission Denied") end end end proxy.read = function(h, ...) return rootFS.read(h,...) end proxy.close = function(h) return rootFS.close(h) end proxy.write = function(h, ...) if write then return rootFS.write(h,...) else error("Permission Denied") end end proxy.seek = function(h, ...) return rootFS.seek(h, ...) end proxy.isDirectory = function(path) return rootFS.isDirectory(proxy.convertPath(path)) end proxy.list = function(path) return rootFS.list(proxy.convertPath(path)) end proxy.lastModified = function(path) return rootFS.lastModified(proxy.convertPath(path)) end fs.umount(kyda) fs.mount(proxy,kyda) return proxy end return mount Метод только один: mountFolder(otkyda: string,kyda: string,write: boolean): proxy otkyda - откуда будем монтировать папку kyda - куда будем монтировать папку write - если true, то в папку можно записывать данные. Иначе - ошибка при записи/изменении Permission Denied функция возращает proxy папки. Если вы укажете не то значение, либо укажете путь не к папке, а к файлу, вылетит ошибка (специально сделал с защитой от дурака) Нельзя монтировать папки с других файловых систем, иначе вы будете работать не с той папкой, с которой хотели. Обходится монтированием нужной системы в корень с последующей монтировкой папки, а затем все возращаете назад. Изменено 7 сентября, 2017 пользователем HeroBrine1st Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Zer0Galaxy 2 187 Опубликовано: 9 февраля, 2017 А что дает монтирование папки с уже примонтированной файловой системы? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Totoro 3 563 Опубликовано: 9 февраля, 2017 А можно какие-нибудь примеры того, как эта либа может пригодиться в повседневной жизни? (Я не говорю, что она не нужна. Мне действительно интересно.) 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
HeroBrine1st Автор темы 88 Опубликовано: 11 февраля, 2017 А что дает монтирование папки с уже примонтированной файловой системы? А можно какие-нибудь примеры того, как эта либа может пригодиться в повседневной жизни? (Я не говорю, что она не нужна. Мне действительно интересно.) монтирование отдельных файловых систем в R/O, так же будет возможно сделать multiboot с одного raid. применений множество, надо их лишь найти. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Totoro 3 563 Опубликовано: 11 февраля, 2017 монтирование отдельных файловых систем в R/O, так же будет возможно сделать multiboot с одного raid. применений множество, надо их лишь найти. Да, но ты писал её для какой-то своей программы? Для чего использовал? Для того, чтобы использовать в мультибуте, надо чтобы библиотека загружалась до операционной системы, я так понимаю. Но она зависит от библиотек filesystem, component и computer. То есть должна грузиться после OpenOS. Защитит ли эта библиотека смонтированную в R/O папку от постороннего вмешательства? Когда папку пытаются изменить не через выданный библиотекой прокси, а извне? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
HeroBrine1st Автор темы 88 Опубликовано: 11 февраля, 2017 Да, но ты писал её для какой-то своей программы? Для чего использовал? Для того, чтобы использовать в мультибуте, надо чтобы библиотека загружалась до операционной системы, я так понимаю. Но она зависит от библиотек filesystem, component и computer. То есть должна грузиться после OpenOS. Защитит ли эта библиотека смонтированную в R/O папку от постороннего вмешательства? Когда папку пытаются изменить не через выданный библиотекой прокси, а извне? она загружается после загрузки package. к тому же MultiROM на андроид так же запускается после ядра. P.S. либа filesystem работает через прокси систем, и если ею изменить что-либо в R/O прокси, то выпадет ошибка. при этом proxy не исчезнет Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Totoro 3 563 Опубликовано: 11 февраля, 2017 она загружается после загрузки package. к тому же MultiROM на андроид так же запускается после ядра. Ну, когда мы говорим про мультибут в OpenComputers, то имеем ввиду загрузку разных ОС. OpenOS - это уже не ядро всё таки. Ядро типа и так всегда загружено. =) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
ALeXeR 67 Опубликовано: 13 февраля, 2017 Эм, по-моему либа filesystem из openos так умеет Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
HeroBrine1st Автор темы 88 Опубликовано: 16 февраля, 2017 Эм, по-моему либа filesystem из openos так умеет разве? Скинь метод Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах