01/10/2018, 13:31
Đọc và ghi file binary dung lượng lớn trong Nodejs? (Synchronized)
Mình có nhu cầu cá nhân muốn viết auto tool để đọc và ghi file nhị phân trong Nodejs (không liên quan đến server hay web gì nhé). Mọi người có biết thư viện js nào hỗ trợ đọc/ghi file nhị phân dung lượng lớn theo kiểu synchronize không (chống chỉ định async), module fs của Nodejs tệ quá, thao tác rất khó khăn tuy rằng có các hàm sync
(Ít nhất thì mình cần thư viện đọc file nhị phân giống như BinaryReader với BinaryWriter của C# ấy, và phải có sync chứ không phải async).
Bài liên quan
khó hiểu ta.
Họ nhà js nói chung là async mà bạn lại đòi không async thì đang đi ngược lại rồi. Nên việc kiếm ra thứ bạn yêu cầu hơi bị khoai.
Bây giờ js phát triển, có cái await với async function đấy, bạn tìm hiểu xem. Nó giúp code viết dạng sync, hết dòng này thì tới dòng khác.
Còn nodejs thì cứ lên npm tìm package thôi, trong lúc đợi câu trả lời thì tìm rồi thử chán ở trong đấy đi :3
NodeJS Streaming, không biết đúng không, stream API thấp hơn (low-level) so với fs API.
https://nodejs.org/api/stream.html
Tổng kết lại là: hiện tại chẳng có cái module nào trên npm giúp được mình cả, mình cần khả năng synchronize, bởi vì dữ liệu của mình là cái trước quyết định cái sau
Stream API thì:
Kết luận: chắc là mình phải tự port code BinaryReader với BinaryWriter từ C# sang Nodejs
May mắn thay là Microsoft đã mở mã nguồn DotNetCore https://referencesource.microsoft.com/#mscorlib/system/io/binaryreader.cs.html
Quá buồn cho một nền tảng đầy tiềm năng nhưng chẳng ai phát triển cho nó thành all purpose programming language cả
thì nó vẫn là dữ liệu cái trc quyết định cái sau mà.
Async dùng callback hell từ trước đến giờ vẫn giải quyết tốt.
Nodejs ra đời biến js thành 1 ngôn ngữ vừa sử dụng đc trên front lẫn backend, thì mình nghĩ là k phải nó k phát triển đâu, chỉ là nó không phát triển theo hướng bạn muốn thôi.
tại sao bạn lại muốn bắt buộc phải sync, bạn nêu cụ thể vấn đề mọi người sẽ đưa ra giải pháp giúp bạn
Mình muốn sử dụng cái này: http://kaitai.io/
Để đọc file nhị phân - dữ liệu của game, nói chung là extract 1 file thành nhiều file nhỏ.
Ví dụ kaitai biên dịch ra code Javascript để giải nén file zip: http://formats.kaitai.io/zip/javascript.html
Thì mình cần phải có thêm Javascript runtime này thì mới đủ để chạy: https://github.com/kaitai-io/kaitai_struct_javascript_runtime
Nhưng khác với các ngôn ngữ lập trình khác mà kaitai hỗ trợ, bên Javascript runtime thì họ bắt phải đưa buffer vào thay vì đưa tên file. Tức là mình phải load cả file vào ram.
Và mình còn muốn làm với nhiều game khác, cả vấn đề đóng gói lại file nữa.
Mình không thể làm async, vì code của kaitai đi theo hướng synchronize (kaitai được thiết kế để đọc được cả opcode nữa, async có vẻ bất khả thi). Vả lại khi đóng gói file lại thì bắt buộc phải ghi tuần tự, làm async sẽ rất phức tạp.
Module fs làm sao tệ bạn? Bạn cần nhiều ram hơn hay sao?
Module fs quá low-level nên làm rất khổ. Hệ thống Stream thì không thích hợp cho việc ghi dữ liệu lớn, nếu sử dụng event thì lại không đúng với tiêu chí synchronized, và không hề phù hợp với với post của mình ở trên.
Nói chung là mình cần cái gì đó như BinaryReader và BinaryWriter của C#.