Igor
Или же если файлы не такие уж и больше, пердположим, меньше 500 мегов, то можно сразу прочитать весь файл в переменную, с помощью функции gsub убрать ненужные строки, как уже выше Алекс сказал, открыть занвоо этот файл для чтения и записать в него дату новую
Igor
но даже если файл мегов 400-500 это займёт немало времени
Igor
всё в целом
Igor
особенно обработка регулярок
Alex
Правильно я понял что Анатолий ищет что то типо
file.open('some file name').deleteStroke(2).save().close()
Igor
Эх, если бы это так работало
Alex
100мб текстового файла - попахиваете самописной BD )))
Anatoliy
Эх, если бы это так работало
Можно конечно такую функцию написать на самом луа - при встрече некоей строки побайтово подтянуть на её место в файле все последующее содержимое файла, затерев её таким образом, или на Си - тогда быстрее будет, но это конечно изврат, проще действительно скопировать то что нужно в новый файл и всё
Igor
Не всё так просто с смещением данных в файле
Igor
Если нужно выкинуть какие-то несколько байт из файла, не важно какие, то в оперативной памяти у тебя по любому должен быть весь этот файл
Igor
А вот со смещнием данных уже интереснее
Igor
Вот ты например прочитал весь файл в ОЗУ и предположим, что он у тебя в char array
Igor
Тогда тебе нужно найти начальную позицию данных, которые ты хочешь вырезать и конечную
Igor
И прибавляя к начальной и конечной по единице просто переносить байты из конечной в начальную
Igor
А потом уже этот массив записать обратно в файл, но с другим размером
Anatoliy
Это все не проблема, просто же говорю что проще скопировать в другой файл
Igor
Ну если для тебя присутствие промежуточного файла - не проблема, то можно и в новый файл записать модифицированную дату
Igor
А потом ренеймнуть его
Igor
Кстати, прошу заметить, что lua-функция os.rename под виндой и linux работает по разному (на всякий написал, если вдруг кроссплатформенность потребуется)
Igor
под виндой ты не сможешь дать файлу имя уже существующего файла
Igor
под линуксом таких проблем не возникает
Sergey
Sergey
CreateFile FILE_FLAG_POSIX_SEMANTICS
Igor
ну с использованием WinAPI функций можно
Igor
я говорю именно про os.rename
Sergey
начиная с 10 можно включить case sensetive для каталогов
Sergey
ну это так, занудство
Igor
Если уж с WinAPI дело иметь то можно и чере MoveFileEx переименовать
Igor
А не через луёвую os.rename
Roman
Igor
Igor
ну если только кейс у букв не разный
Igor
в линуксе, например tEst и test - разные файлы
Igor
в винде кейс игнорируется
Snusmumriken
Хехе, в целом, можно открыть файл в режиме "rb+", считывать чанк, удалять из него все символы определённого рода, seek-ом отматывать назад и вписывать на старое место обновлённый чанк, запомнив положение. Потом тем же seek-ом отправиться чуть-чуть вперёд и начать сначала. Остатки в конце — забить нулями (размер файла не изменится, зато замена произошла сравнительно быстро).
Собственно, я три дня назад писал функцию удаления из таблицы значений определённого рода. Тут можно сделать то же самое, но для файлов, и с чанками вместо обработки по одному значению:
local arr = {1, 2, 3, 4, 3, 6, 7}
local function array_clear(arr, value)
local l = #arr
local p = 1
for i = 1, l do
arr[p] = arr[i]
if arr[i] ~= value then
p = p + 1
end
end
for i = p, l do
arr[i] = nil
end
return arr
end
array_clear(arr, 3) --> {1, 2, 4, 6, 7}
Нужны два курсора, очевидно: то где мы остановили перезапись и откуда мы берём данные.
Roman
Хехе, в целом, можно открыть файл в режиме "rb+", считывать чанк, удалять из него все символы определённого рода, seek-ом отматывать назад и вписывать на старое место обновлённый чанк, запомнив положение. Потом тем же seek-ом отправиться чуть-чуть вперёд и начать сначала. Остатки в конце — забить нулями (размер файла не изменится, зато замена произошла сравнительно быстро).
Собственно, я три дня назад писал функцию удаления из таблицы значений определённого рода. Тут можно сделать то же самое, но для файлов, и с чанками вместо обработки по одному значению:
local arr = {1, 2, 3, 4, 3, 6, 7}
local function array_clear(arr, value)
local l = #arr
local p = 1
for i = 1, l do
arr[p] = arr[i]
if arr[i] ~= value then
p = p + 1
end
end
for i = p, l do
arr[i] = nil
end
return arr
end
array_clear(arr, 3) --> {1, 2, 4, 6, 7}
Нужны два курсора, очевидно: то где мы остановили перезапись и откуда мы берём данные.
на linux можно проще.
Snusmumriken
Snusmumriken
на linux можно проще.
Ещё проще — это промежуточный файл. И это же позволяет делать штуки типа "не только удаляем но и дописываем". Но вот тут вот загон на скорость, потому что файлы — большие.
Roman
Snusmumriken
А зачем нам раздвигать, если мы удаляем, и нам надо сжимать?
Roman
на некоторых фс можно сначала записать в файл рядом, а потом его блоки "подарить" целевому файлу
Roman
Snusmumriken
Я придумываю только кроссплатформу, сомневаюсь что ради этих плюшек, Анатолий будет ставить линукс и делать диск с определённой фс.
Roman
т.е. если нам просто надо вырезать кусок байт из середины файла, то это решается флажками fallocate
Snusmumriken
Восхитительно, но это решения с помощью ОС и ФС, а ещё надо писать so-шку для луа (или ffiть).
🐅🤦♂️
Можно переписать файл как предложил Снус, а потом вызвать
#include <unistd.h> #include <sys/types.h> int truncate(const char *path, off_t length); int ftruncate(int fd, off_t length);
что-бы скинуть "хвост" файла
Νῑκόλαος
Есть у кого нибудь тз для разработки небольшой многопользовательской или однопользовательской игры (которую можно сделать многопользовательской)? Мне просто потрениться надо, а сам я придумывать ничего не умею, хорошее тз, не многословное помогло бы сильно
🐅🤦♂️
Νῑκόλαος
Текстовый документ какойнибудь, главно хоть как нибудь чтоб зацепило, и не скушно делать было. Тренировка именно в написании самой игры
Snusmumriken
Snusmumriken
В меню — две кнопки: организовать лобби или присоединиться. При открытии лобби, игрок, ждёт пока кто-то не подключится, и запускается матч. По истечении матча, игрокам предлагается сыграть ещё, или разойтись как в море кораблям (отправка обратно в меню).
Snusmumriken
Тут чисто тренировка сети: сложной синхронизации произвольных объектов не нужно: только две ракетки, мяч и время.
Snusmumriken
Но стоит попробовать сделать так, чтобы игроки видели друг друга как можно ближе к реальности, даже если между ними пинг 2000.
Snusmumriken
То есть, примерно как тут: https://habr.com/ru/post/302394/
Потом это же можно экстраполировать на что-то более сложное.
Mikhail
Snusmumriken
Либа более-менее готова ))
Но она отвечает только за связь, пинг, обрывы и всякое такое. Не за "автоматическую" синхронизацию.
Lucky
Кооперативная змейка.
Lucky
Две команды: влево и вправо.
Lucky
Одна змея,
Snusmumriken
Блин
Snusmumriken
Кто чаще давит свою кнопку, туда змея и поворачивает
Lucky
да
Lucky
и кого больше
Lucky
И чятик
Lucky
с озвучкой кто что командовал
Andrey
фабрика абстрактных змей
Mikhail
супер!
Mikhail
в идеале какой-то простой для подъема сервак на nodejs / lua
ну и клиентские шняги
Lucky
можно проще чо-нить.
Lucky
Нопример
Mikhail
куда проще то? )
Νῑκόλαος
не, у меня все сложно, сервак на netcore, в котором крутится Lua контейнер, в котором крутится C# код
Lucky
по узкому ущелью поднимается воздушный шар
Mikhail
ладно я на Lua ROBLOX делаю. там тебе сразу дают серваки и не 1.. сколько хочешь
Lucky
две кнопки влево и вправо.
Mikhail