2012-12-18 24 views
5

Tôi có thiếu cái gì đó hoặc mô-đun I/O tập tin tiêu chuẩn của node.js thiếu các thông số tương tự của các phương thức truy cập ngẫu nhiên thông thường không?Tôi làm cách nào để truy cập ngẫu nhiên lần đọc từ tệp (lớn) bằng cách sử dụng node.js?

  • seek()/fseek()
  • tell()/ftell()

Làm sao người ta đọc hồ sơ kích thước cố định ngẫu nhiên từ các tập tin lớn trong nút mà không có những?

Trả lời

7

tell không phải là, nhưng nó là khá hiếm khi chưa biết vị trí bạn đang ở trong một tập tin, hoặc không có một cách để giữ theo dõi mình.

seek được hiển thị gián tiếp qua đối số position của fs.readfs.write. Khi được đưa ra, đối số sẽ tìm kiếm vị trí đó trước khi thực hiện hoạt động của nó và nếu null, đối số sẽ sử dụng bất kỳ vị trí nào trước đó.

+1

Thời gian tôi sử dụng 'tell' chủ yếu là khi tôi đọc văn bản trong dòng code-by-line-by-line có thể có các dòng kết thúc bằng' \ n', '\ r' (không còn phổ biến), hoặc' \ r \ n'. Nó chắc chắn vẫn có thể theo dõi vị trí mà không có 'tell' mặc dù. – hippietrail

+0

Vì lợi ích của bất kỳ ai khác có thể đọc chủ đề này, tôi đã bỏ lỡ tham số 'position' vì đọc tài liệu tôi quản lý để liên kết với tham số' offset', là giá trị bù trừ từ đầu bộ đệm bạn muốn đọc dữ liệu vào. – hippietrail

+0

Điều này làm việc tuyệt vời cho việc đọc các bản ghi từ các tệp nhị phân, nhưng tôi cũng cần phải đọc các dòng văn bản từ các tập tin được truyền đi. Hóa ra rất khó đọc một dòng văn bản bằng cách sử dụng 'fs.read' do bản chất của' Bộ đệm' và cần phải chuyển đổi thành văn bản được mã hóa như UTF-8. Những cách rõ ràng dẫn đến các ký tự bị hỏng vì UTF-8 bao gồm các ký tự nhiều byte. 'ReadableStream' xử lý các ký tự nhiều byte, nhưng không cho phép một ký tự tìm kiếm tự do. Tôi không chắc có thư viện nào cho phép bạn kết hợp truy cập ngẫu nhiên và đọc dòng. – hippietrail

2

nút không được tích hợp sẵn, gần nhất bạn có thể nhận được là sử dụng fs.createReadStream với thông số start để bắt đầu đọc từ bù đắp, (chuyển vào fd hiện có để tránh mở lại tệp).

http://nodejs.org/api/fs.html#fs_fs_createreadstream_path_options

+0

Trừ khi điều này hóa ra là chậm, nó có vẻ giống như một giải pháp hoàn hảo. Nó có thể phụ thuộc vào chi phí tạo ra một ReadStream từ một fd. – hippietrail

+0

Tôi có cần truyền vào cùng tham số đường dẫn mỗi khi tôi gọi 'createReadStream()' một lần nữa không? 'Đường dẫn' là bắt buộc trong khi' fd' chỉ là tùy chọn và các tài liệu không rõ ràng. – hippietrail

+0

hm ... bạn đã thử chuyển qua 'null' cho đường dẫn chưa, mặc dù nó nói là cần thiết? nếu không tôi chỉ cần vượt qua trong cùng một con đường. – yiding

1

Tôi cho rằng createReadStream tạo mô tả tệp mới hơn và hơn. Tôi thích phiên bản đồng bộ:

function FileBuffer(path) { 
const fd = fs.openSync(path, 'r'); 

function slice(start, end) { 
    const chunkSize = end - start; 
    const buffer = new Buffer(chunkSize); 

    fs.readSync(fd, buffer, 0, chunkSize, start); 

    return buffer; 
} 

function close() { 
    fs.close(fd); 
} 

return { 
    slice, 
    close 
} 

}

Các vấn đề liên quan