Перейти к содержимому
HeroBrine1st

Виртуальные папки FolderMount - монтирование виртуальных папок

Рекомендуемые сообщения

Поскольку в нашем 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 папки.

 

Если вы укажете не то значение, либо укажете путь не к папке, а к файлу, вылетит ошибка (специально сделал с защитой от дурака)

 

Нельзя монтировать папки с других файловых систем, иначе вы будете работать не с той папкой, с которой хотели.  Обходится монтированием нужной системы в корень с последующей монтировкой папки, а затем все возращаете назад.

Изменено пользователем HeroBrine1st

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А что дает монтирование папки с уже примонтированной файловой системы?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А можно какие-нибудь примеры того, как эта либа может пригодиться в повседневной жизни?  :)

(Я не говорю, что она не нужна. Мне действительно интересно.)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А что дает монтирование папки с уже примонтированной файловой системы?

 

А можно какие-нибудь примеры того, как эта либа может пригодиться в повседневной жизни?  :)

(Я не говорю, что она не нужна. Мне действительно интересно.)

монтирование отдельных файловых систем в R/O, так же будет возможно сделать multiboot с одного raid. применений множество, надо их лишь найти.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

монтирование отдельных файловых систем в R/O, так же будет возможно сделать multiboot с одного raid. применений множество, надо их лишь найти.

 

Да, но ты писал её для какой-то своей программы? Для чего использовал?

 

Для того, чтобы использовать в мультибуте, надо чтобы библиотека загружалась до операционной системы, я так понимаю. Но она зависит от библиотек filesystem, component и computer. То есть должна грузиться после OpenOS.

 

Защитит ли эта библиотека смонтированную в R/O папку от постороннего вмешательства? Когда папку пытаются изменить не через выданный библиотекой прокси, а извне?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Да, но ты писал её для какой-то своей программы? Для чего использовал?

 

Для того, чтобы использовать в мультибуте, надо чтобы библиотека загружалась до операционной системы, я так понимаю. Но она зависит от библиотек filesystem, component и computer. То есть должна грузиться после OpenOS.

 

Защитит ли эта библиотека смонтированную в R/O папку от постороннего вмешательства? Когда папку пытаются изменить не через выданный библиотекой прокси, а извне?

она загружается после загрузки package. к тому же MultiROM на андроид так же запускается после ядра. 

 

P.S. либа filesystem работает через прокси систем, и если ею изменить что-либо в R/O прокси, то выпадет ошибка. при этом proxy не исчезнет

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

она загружается после загрузки package. к тому же MultiROM на андроид так же запускается после ядра. 

 

Ну, когда мы говорим про мультибут в OpenComputers, то имеем ввиду загрузку разных ОС.

OpenOS - это уже не ядро всё таки. Ядро типа и так всегда загружено. =)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в тему...

×   Вы вставили отформатированное содержимое.   Удалить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


×
×
  • Создать...