Перейти к содержимому
  • 0
WheatComp

spaceUsed() не работает в терминале

Вопрос

Пытался узнать, сколько используется места на диске. В интерпретаторе в игре работает, а если запускать через программу, то не работает, выдает ошибку lua:4: "attempt to call a nil value (field 'spaceUsed'):

local component = require("component")
local filesystem = require("filesystem")

sp = filesystem.spaceUsed()
print(sp)

 

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


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

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




local component = require("component")
fs = component.filesystem
space = fs.spaceUsed()

 

Ты используешь библиотеку filesystem вместо компонента filesystem.

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


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

@RasonGame я брал за основу программу ECS-а:

 

В 17.05.2023 в 19:05, ECS сказал:

-- Подключаем библиотеки local component = require("component") local filesystem = require("filesystem")

То, что разные команды разбросаны по разным библиотекам и компонентам - это недоработка, по-моему. Мод обновляется постоянно, может, соберут в одном месте.

 

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


Ссылка на сообщение
Поделиться на других сайтах
46 минут назад, WheatComp сказал:

@RasonGame я брал за основу программу ECS-а:

 

То, что разные команды разбросаны по разным библиотекам и компонентам - это недоработка, по-моему. Мод обновляется постоянно, может, соберут в одном месте.

 

ECS софтины пишет под свою оську. А то что разные функции разбросаны по разным местам - то так и задумано. Мод уже давно не обновляется активно.

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


Ссылка на сообщение
Поделиться на других сайтах
1 минуту назад, RasonGame сказал:

Мод уже давно не обновляется активно.

Это распространенное заблуждение. Последнее обновление было 4 июня сего года.

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


Ссылка на сообщение
Поделиться на других сайтах
1 минуту назад, WheatComp сказал:

Это распространенное заблуждение. Последнее обновление было 4 июня сего года.

Ога. Пару фиксов и апдейт мелочей. Активной разработки нема, да хотя бы даже порта на новые версии нет. Какая-то фигня, не?

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


Ссылка на сообщение
Поделиться на других сайтах
19 минут назад, RasonGame сказал:

Мод уже давно не обновляется активно.

Возможно, корректнее будет сказать "не обновляется значительно". Пара фиксов и апдейт мелочей - это какая-никакая, а активность. Что мелочами занимаются, согласен. Такое впечатление, что Sangar (главный который) отошел от мода, а занимаются апдейтом его помощники, которые на ютубе туториал снимали с ним. Или помощник.

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


Ссылка на сообщение
Поделиться на других сайтах
4 часа назад, WheatComp сказал:

То, что разные команды разбросаны по разным библиотекам и компонентам - это недоработка, по-моему. Мод обновляется постоянно, может, соберут в одном месте.

В каком месте это требуется собрать? Компонент filesystem работает с конкретным носителем, в этом случае информация о занятом дисковом пространстве имеет смысл. А библиотека filesystem работает со сборной файловой системой, в которую может быть смонтировано множество разных носителей. Конечно, можно было бы посчитать, сколько дискового пространства занято на всех смонтированных носителях, но какой в этом практический смысл?

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


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

@eu_tomat ну или хотя бы назвать по-разному, например, disksystem для одного компонента и filesystem для сборной файловой системы. По-моему, это единственный компонент, который можно включать в программу и через точку и через require. А если назвать одинаково, есть высокие шансы, что юзеры запутаются. Не совсем юзерфрендли решение.

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


Ссылка на сообщение
Поделиться на других сайтах
42 минуты назад, WheatComp сказал:

По-моему, это единственный компонент, который можно включать в программу и через точку и через require. А если назвать одинаково, есть высокие шансы, что юзеры запутаются. Не совсем юзерфрендли решение.

Аналогичная история с компонентами internet/computer/robot и одноимёнными библиотеками. Это скорее систематика и фича, нежели однократная проблема нейминга

 

Вообще с одной стороны ты прав, и путаница имеет место быть. А с другой - наверняка нашлись бы недовольные альтернативной реализацией, дескать, "А чо у вас компонент зовётся filesystem, а API disksystem? Дискеты - ето уже диски? Сложна!1"

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


Ссылка на сообщение
Поделиться на других сайтах
18 часов назад, ECS сказал:

ообще с одной стороны ты прав, и путаница имеет место быть. А с другой - наверняка нашлись бы недовольные альтернативной реализацией, дескать, "А чо у вас компонент зовётся filesystem, а API disksystem? Дискеты - ето уже диски? Сложна!1"

Вот-вот. Можно выделить, что к чему относится: robot_com, robot_api. В программировании максимальная точность только помогает и делает код более читаемым. Если видишь, например, filesystem_api, сразу понятно, что это не к компоненту относится. Всего 3 буквы добавили, а такая ясность наступает. Это же нужно только один раз в начале программы писать, а не по 10 раз. А так все в одну кучу свалили, "пусть разбираются".

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


Ссылка на сообщение
Поделиться на других сайтах
18 часов назад, WheatComp сказал:

Можно выделить, что к чему относится: robot_com, robot_api. В программировании максимальная точность только помогает и делает код более читаемым. Если видишь, например, filesystem_api, сразу понятно, что это не к компоненту относится. Всего 3 буквы добавили, а такая ясность наступает. Это же нужно только один раз в начале программы писать, а не по 10 раз. А так все в одну кучу свалили, "пусть разбираются".

Кто свалил? В какую-такую одну кучу? Пока что это выглядит как разные кучи. Есть component.filesystem, а есть require("filesystem"). Это разные объекты, и в прикладной программе мы получаем их различным способом. Если программист использует оба объекта в пределах одной области видимости, то он даёт им разные имена, другого выбора у него нет. Если программисту будет удобно, то можно, например, именовать и так:

filesystem_com = component.filesystem
filesystem_api = require("filesystem")

А если же эти объекты не используются в пределах одной программы, то программист может писать просто filesystem, если контекст использования такого имени переменной конкретно этому программисту и его коллегам понятен. И большинство так и пишет. Изучение такого кода, конечно же, иногда смущает новичков, но сами новички не спешат исправлять эту проблему. Хотя, освоившись со временем, могли бы заполнить форум программами с правильными именами переменных с их точки зрения.

 

Это проблема лежит за пределами ответственности авторов мода. Да и не ахти какая это проблема, если бывшие новички сами с ней не борются.

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


Ссылка на сообщение
Поделиться на других сайтах
6 часов назад, eu_tomat сказал:

Кто свалил? В какую-такую одну кучу? Пока что это выглядит как разные кучи. Есть component.filesystem, а есть require("filesystem"). Это разные объекты

Если это разные объекты, то почему они называются одинаково? Пока что выглядит так, что один объект лежит в двух разных кучах.

6 часов назад, eu_tomat сказал:

Это проблема лежит за пределами ответственности авторов мода. Да и не ахти какая это проблема

Я понимаю, что все сообщество будет сопротивляться такому изменению, ведь придется переписать тучу кода. А удобочитаемость... ну её.

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


Ссылка на сообщение
Поделиться на других сайтах
1 час назад, WheatComp сказал:

Если это разные объекты, то почему они называются одинаково

Я одного не пойму: почему тебя так зацепило это явление, неужели оно создаёт настолько серьёзные проблемы? Ведь и в повседневной жизни, и в разговорной речи встречаются омонимы - ключ/лук/мат/лист/коса/каток и прочие. К ним у тебя такое же радикальное отношение или, может быть, это всё же дело привычки?

 

Если взять пример из области кодинга, то в большинстве языков программирования имеется концепция пространств имён, разграничивающих доступ к классам с одинаковыми названиями: в том же .NET имеются System.Windows.Media.Color и System.Drawing.Color. Какой using укажешь - такой класс и будет использован. Схожая путаница возникает между java.nio.file и java.io.file. Эт норма))0

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


Ссылка на сообщение
Поделиться на других сайтах
6 часов назад, ECS сказал:

Я одного не пойму: почему тебя так зацепило это явление, неужели оно создаёт настолько серьёзные проблемы?

Радикального отношения нет, просто расстроился, не сумев создать и сохранить файл на диск. Какая-то таблица появляется, вместо файла. А тут еще и filesystem проблемы подкидывает.

6 часов назад, ECS сказал:

Схожая путаница возникает между java.nio.file и java.io.file. Эт норма))0

Ну ладно, что поделаешь, вот так и живем.

зы: файл удалось сохранить. Пытался по этой инструкции делать, оказалось, w нужно брать в кавычки:

file = io.open('TEST.txt', "w")

Без кавычек не работает.

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

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


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

@ECS  spaceUsed() все время показывает 512, хотя добавил в директорию диска 2 файла по 1 Мб. Как бы обновить показания?

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

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


Ссылка на сообщение
Поделиться на других сайтах
13 часа назад, WheatComp сказал:

Пытался по этой инструкции делать, оказалось, w нужно брать в кавычки:

Рекомендую следовать инструкциям не из комментов, а из официальной вики или готового софта - так будет существенно меньше проблем

 

8 часов назад, WheatComp сказал:

spaceUsed() все время показывает 512, хотя добавил в директорию диска 2 файла по 1 Мб. Как бы обновить показания?

При работе с дисками напрямую из директории игрового сейва пересчёт spaceUsed не производится. Для быстрого пересчёта необходимо вызвать filesystem.close(), т.к. это единственный метод, который его инициирует напрямую. Вероятно, пересчёт также должен осуществиться, если вытащить и вставить диск в ПК, но это не точная инфа, надо курить поведение мода и принципы реинициализации компонентов

 

Если интересны подробности, то причина такого поведения в дороговизне вычисления размера директории, к которой привязан диск - оно выполняется рекурсивно, суммируя размеры всех файлов во всех дочерних директориях. Мод частично решает эту проблему, кешируя значение spaceUsed однократно при инициализации компонента. Затем при любой операции над файлом, когда его размер предсказуем, кешированное значение изменяется без потребности в пересчёте с нуля

 

Уточню, что при "естественном" обращении к диску эта проблема вообще никогда не возникнет, т.к. мод выполняет всю работу по пересчёту самостоятельно

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


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

@ECS следующий код дает ошибку:

local filesystem = require("filesystem")
local fs = component.filesystem

filesystem.close()
fs.close()
su = fs.spaceUsed()
print(su)

 

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


Ссылка на сообщение
Поделиться на других сайтах
25 минут назад, WheatComp сказал:

следующий код дает ошибку:

Чтобы что-то закрыть, нужно сперва это что-то открыть. Компонентный вызов open() возвращает дескриптор файла, а APIшный - буферизированный поток, и работа с ними отличается:

local filesystemAPI = require("filesystem")
local filesystemComponent = require("component").filesystem

-- API
local stream = filesystemAPI.open("/test.lua", "w")
stream:write("Hello world")
stream:close()

-- Компонент
local handle = filesystemComponent.open("/test.lua", "w")
filesystemComponent.write(handle, "Hello world")
filesystemComponent.close(handle)

И вообще не по каждой же строчке кода пинговать форумчан, давай сам думай. Наверняка там ошибка наподобие attempt to call a nil value (field 'close'), означающая, что в filesystem API не существует метода close()

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


Ссылка на сообщение
Поделиться на других сайтах
В 11.06.2023 в 23:29, ECS сказал:

Чтобы что-то закрыть, нужно сперва это что-то открыть.

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

 

В 11.06.2023 в 23:29, ECS сказал:

давай сам думай

Попробую.

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

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


Ссылка на сообщение
Поделиться на других сайтах
21 минуту назад, WheatComp сказал:

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

В какой версии мода для получения занятого пространства требуется создавать файл?

И какой результат возвращает spaceUsed(), если файл не создавать?

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


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

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

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

Гость
Ответить на вопрос...

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

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

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

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

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


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