Siêu dữ liệu tệp JavaScript

Trong hướng dẫn này, chúng ta tìm hiểu về cách đọc meta của tệp hình ảnh. Siêu dữ liệu đề cập đến dữ liệu có liên quan về tệp hình ảnh và các tính năng của nó. Chúng tôi sẽ sử dụng một thư viện Javascript có tên là exif-js để đọc Siêu dữ liệu EXIF ​​từ các tập tin hình ảnh

Đọc siêu dữ liệu của một tệp hình ảnh

EXIF là viết tắt của Tệp hình ảnh có thể trao đổi, một tiêu chuẩn để lưu trữ thông tin trao đổi trong các tệp hình ảnh kỹ thuật số được nén bằng JPEG

Ở đây chúng ta sẽ tạo một tệp Html để sử dụng thẻ hình ảnh hoặc chúng ta cũng có thể nhập tệp đầu vào để lấy tệp hình ảnhTệp Html phải có đoạn mã sau trong tiêu đề để sử dụng .

Và chúng ta phải xác định thẻ để nhập phần tử hình ảnh và id

Siêu dữ liệu tệp JavaScript

Và sau đó chúng tôi nhúng chức năng JavaScript của mình vào thẻ script,

  window.onload = getExif;

  function getExif() {
    var img1 = document.getElementById("img1");
    EXIF.getData(img1, function () {
      var MetaData = EXIF.getAllTags(this);
      console.log(JSON.stringify(MetaData, null, "\t"));
    });
  }

Chúng ta phải đợi cho đến khi hình ảnh được tải trước khi gọi hàm getExif để nó không bị lỗi

Siêu dữ liệu tệp JavaScript
27 có hai tham số. một là hình ảnh và thứ hai là chức năng gọi lại. Ở đây, chúng tôi sử dụng từ khóa này để truy cập hình ảnh với siêu dữ liệu

Là một nút. js, rất có thể tại một thời điểm nào đó bạn đã nhập mô-đun

import * as fsPromises from 'fs/promises';

async function usingPromiseAPI(path) {
    const promise = fsPromises.readFile(path);
    console.log('do something else');
    return await promise;
}
1 và viết một số mã tương tác với hệ thống tệp

Điều bạn có thể không biết là mô-đun

import * as fsPromises from 'fs/promises';

async function usingPromiseAPI(path) {
    const promise = fsPromises.readFile(path);
    console.log('do something else');
    return await promise;
}
1 là mô-đun đa nền tảng, dựa trên tiêu chuẩn, có đầy đủ tính năng, hiển thị không chỉ một mà là ba API phục vụ cho các kiểu lập trình đồng bộ và không đồng bộ

Trong bài viết này, chúng ta sẽ khám phá kỹ lưỡng thế giới của Node. js trong các hệ thống Windows và Linux, tập trung vào API dựa trên lời hứa của mô-đun

import * as fsPromises from 'fs/promises';

async function usingPromiseAPI(path) {
    const promise = fsPromises.readFile(path);
    console.log('do something else');
    return await promise;
}
1

Một lưu ý trước khi chúng ta bắt đầu

Tất cả các ví dụ trong bài viết này nhằm mục đích chạy trong môi trường Linux, nhưng nhiều ví dụ cũng sẽ hoạt động trong Windows. Tìm các ghi chú trong suốt bài viết nêu bật các ví dụ không hoạt động trong Windows. Về macOS — trong hầu hết các trường hợp, mô-đun

import * as fsPromises from 'fs/promises';

async function usingPromiseAPI(path) {
    const promise = fsPromises.readFile(path);
    console.log('do something else');
    return await promise;
}
1 hoạt động giống như trên Linux, nhưng có một số hành vi dành riêng cho macOS không được đề cập trong bài viết này. Tham khảo Node chính thức. tài liệu js cho các sắc thái macOS

Mã nguồn đầy đủ cho tất cả các ví dụ có sẵn trên GitHub của tôi dưới briandesousa/node-file-process

Giới thiệu mô-đun import * as fsPromises from 'fs/promises'; async function usingPromiseAPI(path) { const promise = fsPromises.readFile(path); console.log('do something else'); return await promise; } 1

Mô-đun

import * as fsPromises from 'fs/promises';

async function usingPromiseAPI(path) {
    const promise = fsPromises.readFile(path);
    console.log('do something else');
    return await promise;
}
1 là mô-đun lõi được tích hợp trong Node. js. Nó đã tồn tại từ đầu, tất cả đều quay trở lại Node ban đầu. js v0. x phát hành

Kể từ những ngày đầu tiên, mô-đun

import * as fsPromises from 'fs/promises';

async function usingPromiseAPI(path) {
    const promise = fsPromises.readFile(path);
    console.log('do something else');
    return await promise;
}
1 đã được liên kết với các tiêu chuẩn hệ thống tệp POSIX. Điều này có nghĩa là mã bạn viết có phần di động trên nhiều hệ điều hành, đặc biệt là giữa các phiên bản khác nhau của Unix và Linux

Mặc dù Windows không phải là hệ điều hành tương thích với POSIX nhưng hầu hết các chức năng của mô-đun

import * as fsPromises from 'fs/promises';

async function usingPromiseAPI(path) {
    const promise = fsPromises.readFile(path);
    console.log('do something else');
    return await promise;
}
1 sẽ vẫn hoạt động. Tuy nhiên, có những chức năng không thể di động đơn giản vì một số khả năng của hệ thống tệp không tồn tại hoặc được triển khai khác trong Windows

Khi chúng tôi xem xét các chức năng của mô-đun

import * as fsPromises from 'fs/promises';

async function usingPromiseAPI(path) {
    const promise = fsPromises.readFile(path);
    console.log('do something else');
    return await promise;
}
1, hãy nhớ rằng các chức năng sau đây sẽ trả về lỗi hoặc sẽ có kết quả không mong muốn trên Windows

  • Các chức năng sửa đổi quyền và quyền sở hữu tệp
    • Siêu dữ liệu tệp JavaScript
      20
    • Siêu dữ liệu tệp JavaScript
      21
  • Các chức năng để làm việc với các liên kết cứng và mềm
    • Siêu dữ liệu tệp JavaScript
      22
    • Siêu dữ liệu tệp JavaScript
      23
    • Siêu dữ liệu tệp JavaScript
      24
    • Siêu dữ liệu tệp JavaScript
      25
    • Siêu dữ liệu tệp JavaScript
      26
    • Siêu dữ liệu tệp JavaScript
      27
  • Một số siêu dữ liệu không được đặt hoặc hiển thị các giá trị không mong muốn khi sử dụng
    Siêu dữ liệu tệp JavaScript
    28 và
    Siêu dữ liệu tệp JavaScript
    29

Kể từ Node v10, mô-đun

import * as fsPromises from 'fs/promises';

async function usingPromiseAPI(path) {
    const promise = fsPromises.readFile(path);
    console.log('do something else');
    return await promise;
}
1 đã bao gồm ba API khác nhau. đồng bộ, gọi lại và lời hứa. Cả ba API đều hiển thị cùng một bộ hoạt động của hệ thống tệp

Bài viết này sẽ tập trung vào API dựa trên lời hứa mới hơn. Tuy nhiên, có thể có những trường hợp bạn muốn hoặc cần sử dụng API đồng bộ hoặc API gọi lại. Vì lý do đó, hãy dành một chút thời gian để so sánh cả ba API

So sánh các API mô-đun FS

API đồng bộ

API đồng bộ hiển thị một tập hợp các chức năng chặn thực thi để thực hiện các hoạt động của hệ thống tệp. Các chức năng này có xu hướng đơn giản nhất để sử dụng khi bạn mới bắt đầu

Mặt khác, chúng đang chặn luồng, điều này rất trái ngược với thiết kế I/O không chặn của Node. js. Tuy nhiên, đôi khi bạn phải xử lý một tệp đồng bộ

Dưới đây là một ví dụ về việc sử dụng API đồng bộ để đọc nội dung của tệp

  window.onload = getExif;

  function getExif() {
    var img1 = document.getElementById("img1");
    EXIF.getData(img1, function () {
      var MetaData = EXIF.getAllTags(this);
      console.log(JSON.stringify(MetaData, null, "\t"));
    });
  }
3

API gọi lại

API gọi lại cho phép bạn tương tác với hệ thống tệp theo cách không đồng bộ. Mỗi hàm API gọi lại chấp nhận một hàm gọi lại được gọi khi thao tác hoàn tất. Ví dụ: chúng ta có thể gọi hàm

  window.onload = getExif;

  function getExif() {
    var img1 = document.getElementById("img1");
    EXIF.getData(img1, function () {
      var MetaData = EXIF.getAllTags(this);
      console.log(JSON.stringify(MetaData, null, "\t"));
    });
  }
41 với hàm mũi tên nhận lỗi nếu có lỗi hoặc nhận dữ liệu nếu đọc tệp thành công

  window.onload = getExif;

  function getExif() {
    var img1 = document.getElementById("img1");
    EXIF.getData(img1, function () {
      var MetaData = EXIF.getAllTags(this);
      console.log(JSON.stringify(MetaData, null, "\t"));
    });
  }
5

Đây là cách tiếp cận không chặn thường phù hợp hơn với Node. js, nhưng nó đi kèm với những thách thức riêng. Sử dụng các cuộc gọi lại trong lập trình không đồng bộ thường dẫn đến địa ngục gọi lại. Nếu bạn không cẩn thận với cách bạn cấu trúc mã của mình, bạn có thể kết thúc với một chồng các hàm gọi lại lồng nhau phức tạp, khó đọc và khó bảo trì

API lời hứa

Nếu nên tránh các API đồng bộ khi có thể và API gọi lại có thể không lý tưởng, điều đó khiến chúng tôi có API hứa hẹn

import * as fsPromises from 'fs/promises';

async function usingPromiseAPI(path) {
    const promise = fsPromises.readFile(path);
    console.log('do something else');
    return await promise;
}

Điều đầu tiên bạn có thể nhận thấy là sự khác biệt trong câu lệnh nhập này so với các ví dụ trước. API lời hứa có sẵn từ đường phụ

  window.onload = getExif;

  function getExif() {
    var img1 = document.getElementById("img1");
    EXIF.getData(img1, function () {
      var MetaData = EXIF.getAllTags(this);
      console.log(JSON.stringify(MetaData, null, "\t"));
    });
  }
42. Nếu bạn đang nhập tất cả các chức năng trong API lời hứa, quy ước là nhập chúng dưới dạng
  window.onload = getExif;

  function getExif() {
    var img1 = document.getElementById("img1");
    EXIF.getData(img1, function () {
      var MetaData = EXIF.getAllTags(this);
      console.log(JSON.stringify(MetaData, null, "\t"));
    });
  }
43. Các chức năng API đồng bộ và gọi lại thường được nhập dưới dạng
import * as fsPromises from 'fs/promises';

async function usingPromiseAPI(path) {
    const promise = fsPromises.readFile(path);
    console.log('do something else');
    return await promise;
}
1

Nếu bạn muốn giữ mã ví dụ nhỏ gọn, các câu lệnh nhập sẽ được bỏ qua trong các ví dụ tiếp theo. Quy ước đặt tên nhập tiêu chuẩn sẽ được sử dụng để phân biệt giữa các API.

import * as fsPromises from 'fs/promises';

async function usingPromiseAPI(path) {
    const promise = fsPromises.readFile(path);
    console.log('do something else');
    return await promise;
}
1 để truy cập các chức năng gọi lại và đồng bộ và
  window.onload = getExif;

  function getExif() {
    var img1 = document.getElementById("img1");
    EXIF.getData(img1, function () {
      var MetaData = EXIF.getAllTags(this);
      console.log(JSON.stringify(MetaData, null, "\t"));
    });
  }
43 để truy cập các chức năng hứa hẹn

API lời hứa cho phép bạn tận dụng đường cú pháp async/await của JavaScript để viết mã không đồng bộ theo cách đồng bộ. Hàm

  window.onload = getExif;

  function getExif() {
    var img1 = document.getElementById("img1");
    EXIF.getData(img1, function () {
      var MetaData = EXIF.getAllTags(this);
      console.log(JSON.stringify(MetaData, null, "\t"));
    });
  }
47 được gọi ở dòng 4 ở trên trả về một lời hứa. Đoạn mã sau dường như được thực thi đồng bộ. Cuối cùng, lời hứa được trả về từ chức năng. Toán tử
  window.onload = getExif;

  function getExif() {
    var img1 = document.getElementById("img1");
    EXIF.getData(img1, function () {
      var MetaData = EXIF.getAllTags(this);
      console.log(JSON.stringify(MetaData, null, "\t"));
    });
  }
48 là tùy chọn, nhưng vì chúng tôi đã bao gồm nó nên hàm sẽ đợi thao tác tệp hoàn tất trước khi trả về

Đã đến lúc sử dụng API hứa hẹn để lái thử. Hãy thoải mái. Có khá nhiều chức năng để đề cập, bao gồm các chức năng tạo, đọc và cập nhật tệp cũng như siêu dữ liệu tệp

Làm việc với các tập tin

Sử dụng tay cầm tập tin

API lời hứa cung cấp hai cách tiếp cận khác nhau để làm việc với tệp

Cách tiếp cận đầu tiên sử dụng một bộ chức năng cấp cao nhất chấp nhận đường dẫn tệp. Các chức năng này quản lý vòng đời của tệp và thư mục xử lý tài nguyên nội bộ. Bạn không cần phải lo lắng về việc gọi hàm

  window.onload = getExif;

  function getExif() {
    var img1 = document.getElementById("img1");
    EXIF.getData(img1, function () {
      var MetaData = EXIF.getAllTags(this);
      console.log(JSON.stringify(MetaData, null, "\t"));
    });
  }
49 khi bạn hoàn thành với tệp hoặc thư mục


Siêu dữ liệu tệp JavaScript
Siêu dữ liệu tệp JavaScript

Hơn 200 nghìn nhà phát triển sử dụng LogRocket để tạo ra trải nghiệm kỹ thuật số tốt hơn

Siêu dữ liệu tệp JavaScript
Siêu dữ liệu tệp JavaScript
Tìm hiểu thêm →


Cách tiếp cận thứ hai sử dụng một tập hợp các chức năng có sẵn trên một đối tượng

import * as fsPromises from 'fs/promises';

async function usingPromiseAPI(path) {
    const promise = fsPromises.readFile(path);
    console.log('do something else');
    return await promise;
}
50. Một
import * as fsPromises from 'fs/promises';

async function usingPromiseAPI(path) {
    const promise = fsPromises.readFile(path);
    console.log('do something else');
    return await promise;
}
50 hoạt động như một tham chiếu đến một tệp hoặc thư mục trên hệ thống tệp. Đây là cách bạn có thể có được một đối tượng
import * as fsPromises from 'fs/promises';

async function usingPromiseAPI(path) {
    const promise = fsPromises.readFile(path);
    console.log('do something else');
    return await promise;
}
50

Siêu dữ liệu tệp JavaScript
2

Ở dòng 4 ở trên, chúng tôi sử dụng

import * as fsPromises from 'fs/promises';

async function usingPromiseAPI(path) {
    const promise = fsPromises.readFile(path);
    console.log('do something else');
    return await promise;
}
53 để tạo một
import * as fsPromises from 'fs/promises';

async function usingPromiseAPI(path) {
    const promise = fsPromises.readFile(path);
    console.log('do something else');
    return await promise;
}
50 cho một tệp. Chúng tôi chuyển cờ
import * as fsPromises from 'fs/promises';

async function usingPromiseAPI(path) {
    const promise = fsPromises.readFile(path);
    console.log('do something else');
    return await promise;
}
55 để chỉ ra rằng tệp sẽ được mở ở chế độ chỉ đọc. Mọi hoạt động cố gắng sửa đổi tệp sẽ không thành công. (Bạn cũng có thể chỉ định. )

Nội dung của tệp được đọc bằng hàm

import * as fsPromises from 'fs/promises';

async function usingPromiseAPI(path) {
    const promise = fsPromises.readFile(path);
    console.log('do something else');
    return await promise;
}
56, có sẵn trực tiếp từ đối tượng xử lý tệp. Ở dòng 10, chúng ta cần đóng xử lý tệp một cách rõ ràng để tránh rò rỉ bộ nhớ tiềm ẩn

Tất cả các chức năng có sẵn trong lớp

import * as fsPromises from 'fs/promises';

async function usingPromiseAPI(path) {
    const promise = fsPromises.readFile(path);
    console.log('do something else');
    return await promise;
}
50 cũng có sẵn dưới dạng các chức năng cấp cao nhất. Chúng tôi sẽ tiếp tục khám phá các chức năng cấp cao nhất, nhưng thật tốt khi biết rằng phương pháp này cũng có sẵn

Đọc tập tin

Đọc một tập tin có vẻ như là một nhiệm vụ đơn giản như vậy. Tuy nhiên, có một số tùy chọn khác nhau có thể được chỉ định tùy thuộc vào những gì bạn cần làm với tệp

  window.onload = getExif;

  function getExif() {
    var img1 = document.getElementById("img1");
    EXIF.getData(img1, function () {
      var MetaData = EXIF.getAllTags(this);
      console.log(JSON.stringify(MetaData, null, "\t"));
    });
  }
4

Ví dụ 1 đơn giản như vậy, nếu tất cả những gì bạn muốn làm là lấy nội dung của một tệp

Trong ví dụ 2, chúng tôi không biết tệp có tồn tại hay không, vì vậy chúng tôi chuyển

import * as fsPromises from 'fs/promises';

async function usingPromiseAPI(path) {
    const promise = fsPromises.readFile(path);
    console.log('do something else');
    return await promise;
}
58 để tạo tệp trước, nếu cần

Ví dụ 3 minh họa cách bạn thay đổi định dạng của dữ liệu được trả về

Ví dụ 4 trình bày cách ngắt và hủy bỏ thao tác đọc tệp. Điều này có thể hữu ích khi đọc các tệp lớn hoặc đọc chậm

Sao chép các tập tin

Hàm

import * as fsPromises from 'fs/promises';

async function usingPromiseAPI(path) {
    const promise = fsPromises.readFile(path);
    console.log('do something else');
    return await promise;
}
59 có thể tạo một bản sao của tệp và cung cấp cho bạn một số quyền kiểm soát đối với những gì sẽ xảy ra nếu tệp đích đã tồn tại

import * as fsPromises from 'fs/promises';

async function usingPromiseAPI(path) {
    const promise = fsPromises.readFile(path);
    console.log('do something else');
    return await promise;
}
5

Ví dụ 1 sẽ ghi đè lên

import * as fsPromises from 'fs/promises';

async function usingPromiseAPI(path) {
    const promise = fsPromises.readFile(path);
    console.log('do something else');
    return await promise;
}
80 nếu nó đã tồn tại. Trong ví dụ 2, chúng tôi chuyển vào cờ
import * as fsPromises from 'fs/promises';

async function usingPromiseAPI(path) {
    const promise = fsPromises.readFile(path);
    console.log('do something else');
    return await promise;
}
81 để ghi đè hành vi mặc định và không thành công nếu đã tồn tại
import * as fsPromises from 'fs/promises';

async function usingPromiseAPI(path) {
    const promise = fsPromises.readFile(path);
    console.log('do something else');
    return await promise;
}
80

Viết tập tin

Có ba cách để ghi vào một tập tin

  • Nối vào một tập tin
  • Viết vào một tập tin
  • Cắt bớt một tập tin

Mỗi chức năng này giúp triển khai các trường hợp sử dụng khác nhau


Các bài viết hay khác từ LogRocket

  • Đừng bỏ lỡ một khoảnh khắc nào với The Replay, một bản tin được tuyển chọn từ LogRocket
  • Tìm hiểu cách Galileo của LogRocket loại bỏ tiếng ồn để chủ động giải quyết các sự cố trong ứng dụng của bạn
  • Sử dụng useEffect của React để tối ưu hóa hiệu suất ứng dụng của bạn
  • Chuyển đổi giữa nhiều phiên bản của Node
  • Khám phá cách tạo hoạt ảnh cho ứng dụng React của bạn với AnimXYZ
  • Khám phá Tauri, một khuôn khổ mới để xây dựng các tệp nhị phân
  • So sánh NestJS với. Thể hiện. js

import * as fsPromises from 'fs/promises';

async function usingPromiseAPI(path) {
    const promise = fsPromises.readFile(path);
    console.log('do something else');
    return await promise;
}
8

Ví dụ 1 và 2 minh họa cách sử dụng hàm

import * as fsPromises from 'fs/promises';

async function usingPromiseAPI(path) {
    const promise = fsPromises.readFile(path);
    console.log('do something else');
    return await promise;
}
83 để nối thêm dữ liệu vào tệp hiện có hoặc tệp mới. Nếu tệp không tồn tại,
import * as fsPromises from 'fs/promises';

async function usingPromiseAPI(path) {
    const promise = fsPromises.readFile(path);
    console.log('do something else');
    return await promise;
}
83 sẽ tạo tệp đó trước

Ví dụ 3 và 4 trình bày cách sử dụng hàm

import * as fsPromises from 'fs/promises';

async function usingPromiseAPI(path) {
    const promise = fsPromises.readFile(path);
    console.log('do something else');
    return await promise;
}
85 để ghi vào tệp hiện có hoặc tệp mới. Hàm
import * as fsPromises from 'fs/promises';

async function usingPromiseAPI(path) {
    const promise = fsPromises.readFile(path);
    console.log('do something else');
    return await promise;
}
85 cũng sẽ tạo một tệp nếu nó không tồn tại trước khi ghi vào nó. Tuy nhiên, nếu tệp đã tồn tại và chứa dữ liệu, nội dung của tệp sẽ bị ghi đè mà không có cảnh báo

Ví dụ 5 trình bày cách sử dụng hàm

import * as fsPromises from 'fs/promises';

async function usingPromiseAPI(path) {
    const promise = fsPromises.readFile(path);
    console.log('do something else');
    return await promise;
}
87 để cắt bớt nội dung của tệp. Lúc đầu, các đối số được truyền cho hàm này có thể gây nhầm lẫn. Bạn có thể mong đợi một hàm
import * as fsPromises from 'fs/promises';

async function usingPromiseAPI(path) {
    const promise = fsPromises.readFile(path);
    console.log('do something else');
    return await promise;
}
87 chấp nhận số ký tự cần loại bỏ ở cuối tệp, nhưng thực tế chúng ta cần chỉ định số ký tự cần giữ lại. Trong trường hợp trên, bạn có thể thấy rằng chúng ta đã nhập giá trị
import * as fsPromises from 'fs/promises';

async function usingPromiseAPI(path) {
    const promise = fsPromises.readFile(path);
    console.log('do something else');
    return await promise;
}
89 vào hàm
import * as fsPromises from 'fs/promises';

async function usingPromiseAPI(path) {
    const promise = fsPromises.readFile(path);
    console.log('do something else');
    return await promise;
}
87, hàm này đã xóa năm ký tự cuối cùng khỏi chuỗi
import * as fsPromises from 'fs/promises';

async function usingPromiseAPI(path) {
    const promise = fsPromises.readFile(path);
    console.log('do something else');
    return await promise;
}
01

Xem tập tin

API lời hứa cung cấp một chức năng

import * as fsPromises from 'fs/promises';

async function usingPromiseAPI(path) {
    const promise = fsPromises.readFile(path);
    console.log('do something else');
    return await promise;
}
02 hiệu suất duy nhất có thể xem tệp để biết các thay đổi

import * as fsPromises from 'fs/promises';

async function usingPromiseAPI(path) {
    const promise = fsPromises.readFile(path);
    console.log('do something else');
    return await promise;
}
0

Hàm

import * as fsPromises from 'fs/promises';

async function usingPromiseAPI(path) {
    const promise = fsPromises.readFile(path);
    console.log('do something else');
    return await promise;
}
02 có thể xem tệp để thay đổi vô thời hạn. Mỗi khi một thay đổi được quan sát, một sự kiện theo dõi sẽ được nâng lên. Hàm
import * as fsPromises from 'fs/promises';

async function usingPromiseAPI(path) {
    const promise = fsPromises.readFile(path);
    console.log('do something else');
    return await promise;
}
02 trả về một lần lặp không đồng bộ, về cơ bản là một cách để hàm trả về một loạt lời hứa không giới hạn. Ở dòng 12, chúng ta tận dụng cú pháp
import * as fsPromises from 'fs/promises';

async function usingPromiseAPI(path) {
    const promise = fsPromises.readFile(path);
    console.log('do something else');
    return await promise;
}
05 để đợi và lặp lại từng sự kiện theo dõi khi nhận được

Có một cơ hội tốt là bạn không muốn xem liên tục một tệp để thay đổi. Đồng hồ có thể bị hủy bỏ bằng cách sử dụng một đối tượng tín hiệu đặc biệt có thể được kích hoạt theo yêu cầu. Trên các dòng 1 đến 2, chúng tôi tạo một phiên bản của ________ 606, cho phép chúng tôi truy cập vào một phiên bản của ________ 607 cuối cùng được chuyển đến hàm

import * as fsPromises from 'fs/promises';

async function usingPromiseAPI(path) {
    const promise = fsPromises.readFile(path);
    console.log('do something else');
    return await promise;
}
02. Trong ví dụ này, chúng tôi gọi hàm
import * as fsPromises from 'fs/promises';

async function usingPromiseAPI(path) {
    const promise = fsPromises.readFile(path);
    console.log('do something else');
    return await promise;
}
09 của đối tượng tín hiệu sau một khoảng thời gian cố định (được chỉ định trên dòng 3), tuy nhiên, bạn có thể hủy bỏ bất cứ khi nào bạn cần.

Chức năng

import * as fsPromises from 'fs/promises';

async function usingPromiseAPI(path) {
    const promise = fsPromises.readFile(path);
    console.log('do something else');
    return await promise;
}
02 cũng có thể được sử dụng để xem nội dung của một thư mục. Nó chấp nhận tùy chọn
import * as fsPromises from 'fs/promises';

async function usingPromiseAPI(path) {
    const promise = fsPromises.readFile(path);
    console.log('do something else');
    return await promise;
}
11 tùy chọn xác định xem tất cả các thư mục con và tệp có được xem hay không

siêu dữ liệu tệp

Cho đến nay, chúng tôi đã tập trung vào việc đọc và sửa đổi nội dung của tệp, nhưng bạn cũng có thể cần đọc và cập nhật siêu dữ liệu của tệp. Siêu dữ liệu tệp bao gồm kích thước, loại, quyền và các thuộc tính hệ thống tệp khác

Hàm

import * as fsPromises from 'fs/promises';

async function usingPromiseAPI(path) {
    const promise = fsPromises.readFile(path);
    console.log('do something else');
    return await promise;
}
12 được sử dụng để truy xuất siêu dữ liệu tệp hoặc "số liệu thống kê" như kích thước tệp, quyền và quyền sở hữu

import * as fsPromises from 'fs/promises';

async function usingPromiseAPI(path) {
    const promise = fsPromises.readFile(path);
    console.log('do something else');
    return await promise;
}
1

Ví dụ này minh họa danh sách đầy đủ siêu dữ liệu có thể được truy xuất cho một tệp hoặc thư mục

Hãy nhớ rằng một số siêu dữ liệu này phụ thuộc vào hệ điều hành. Ví dụ: các thuộc tính

import * as fsPromises from 'fs/promises';

async function usingPromiseAPI(path) {
    const promise = fsPromises.readFile(path);
    console.log('do something else');
    return await promise;
}
13 và
import * as fsPromises from 'fs/promises';

async function usingPromiseAPI(path) {
    const promise = fsPromises.readFile(path);
    console.log('do something else');
    return await promise;
}
14 đại diện cho người dùng và chủ sở hữu nhóm — một khái niệm có thể áp dụng cho hệ thống tệp Linux và macOS, nhưng không áp dụng cho hệ thống tệp Windows. Các số 0 được trả về cho hai thuộc tính này khi chạy trong chức năng này trên Windows

Một số siêu dữ liệu tệp có thể được thao tác. Ví dụ: hàm

import * as fsPromises from 'fs/promises';

async function usingPromiseAPI(path) {
    const promise = fsPromises.readFile(path);
    console.log('do something else');
    return await promise;
}
15 được sử dụng để cập nhật dấu thời gian truy cập và sửa đổi trên một tệp

import * as fsPromises from 'fs/promises';

async function usingPromiseAPI(path) {
    const promise = fsPromises.readFile(path);
    console.log('do something else');
    return await promise;
}
7

Hàm

import * as fsPromises from 'fs/promises';

async function usingPromiseAPI(path) {
    const promise = fsPromises.readFile(path);
    console.log('do something else');
    return await promise;
}
16 hữu ích để giải quyết các đường dẫn tương đối và liên kết tượng trưng thành đường dẫn đầy đủ

  window.onload = getExif;

  function getExif() {
    var img1 = document.getElementById("img1");
    EXIF.getData(img1, function () {
      var MetaData = EXIF.getAllTags(this);
      console.log(JSON.stringify(MetaData, null, "\t"));
    });
  }
50

Quyền và quyền sở hữu tệp

Xin lưu ý khi chúng ta tiếp tục trong phần này rằng các chức năng quyền và quyền sở hữu tệp được áp dụng cho các hệ điều hành Unix, Linux và macOS. Các chức năng này mang lại kết quả không mong muốn trên Windows

Nếu bạn không chắc liệu ứng dụng của mình có các quyền cần thiết để truy cập hoặc thực thi tệp trên hệ thống tệp hay không, bạn có thể sử dụng hàm

import * as fsPromises from 'fs/promises';

async function usingPromiseAPI(path) {
    const promise = fsPromises.readFile(path);
    console.log('do something else');
    return await promise;
}
17 để kiểm tra

  window.onload = getExif;

  function getExif() {
    var img1 = document.getElementById("img1");
    EXIF.getData(img1, function () {
      var MetaData = EXIF.getAllTags(this);
      console.log(JSON.stringify(MetaData, null, "\t"));
    });
  }
51

Quyền truy cập tệp có thể được sửa đổi bằng hàm

import * as fsPromises from 'fs/promises';

async function usingPromiseAPI(path) {
    const promise = fsPromises.readFile(path);
    console.log('do something else');
    return await promise;
}
18. Ví dụ: chúng ta có thể xóa quyền truy cập thực thi khỏi tệp bằng cách chuyển một chuỗi chế độ đặc biệt

  window.onload = getExif;

  function getExif() {
    var img1 = document.getElementById("img1");
    EXIF.getData(img1, function () {
      var MetaData = EXIF.getAllTags(this);
      console.log(JSON.stringify(MetaData, null, "\t"));
    });
  }
52

Chuỗi chế độ

import * as fsPromises from 'fs/promises';

async function usingPromiseAPI(path) {
    const promise = fsPromises.readFile(path);
    console.log('do something else');
    return await promise;
}
19 là một số có năm chữ số đặc biệt bao gồm nhiều mặt nạ bit mô tả các thuộc tính tệp bao gồm các quyền. Ba chữ số cuối tương đương với chế độ quyền ba chữ số mà bạn có thể đã quen với việc chuyển tới
import * as fsPromises from 'fs/promises';

async function usingPromiseAPI(path) {
    const promise = fsPromises.readFile(path);
    console.log('do something else');
    return await promise;
}
18 trên Linux. Tài liệu mô-đun
import * as fsPromises from 'fs/promises';

async function usingPromiseAPI(path) {
    const promise = fsPromises.readFile(path);
    console.log('do something else');
    return await promise;
}
1 cung cấp có thể được sử dụng để diễn giải chuỗi chế độ này

Quyền sở hữu tệp cũng có thể được sửa đổi bằng hàm

import * as fsPromises from 'fs/promises';

async function usingPromiseAPI(path) {
    const promise = fsPromises.readFile(path);
    console.log('do something else');
    return await promise;
}
72

  window.onload = getExif;

  function getExif() {
    var img1 = document.getElementById("img1");
    EXIF.getData(img1, function () {
      var MetaData = EXIF.getAllTags(this);
      console.log(JSON.stringify(MetaData, null, "\t"));
    });
  }
53

Trong ví dụ này, chúng tôi cập nhật tệp để nó được sở hữu bởi người dùng gốc và nhóm gốc.

import * as fsPromises from 'fs/promises';

async function usingPromiseAPI(path) {
    const promise = fsPromises.readFile(path);
    console.log('do something else');
    return await promise;
}
13 của người dùng root và
import * as fsPromises from 'fs/promises';

async function usingPromiseAPI(path) {
    const promise = fsPromises.readFile(path);
    console.log('do something else');
    return await promise;
}
14 của nhóm root luôn là
import * as fsPromises from 'fs/promises';

async function usingPromiseAPI(path) {
    const promise = fsPromises.readFile(path);
    console.log('do something else');
    return await promise;
}
75 trên Linux

Làm việc với các liên kết

Mẹo. Các chức năng liên kết được áp dụng cho các hệ điều hành Unix/Linux. Các chức năng này mang lại kết quả không mong muốn trên Windows

Mô-đun

import * as fsPromises from 'fs/promises';

async function usingPromiseAPI(path) {
    const promise = fsPromises.readFile(path);
    console.log('do something else');
    return await promise;
}
1 cung cấp nhiều chức năng mà bạn có thể sử dụng để làm việc với các liên kết cứng và mềm hoặc tượng trưng. Nhiều chức năng tệp mà chúng tôi đã thấy có các phiên bản tương đương để làm việc với các liên kết. Trong hầu hết các trường hợp, chúng cũng hoạt động giống hệt nhau

Trước khi chúng tôi bắt đầu tạo liên kết, hãy xem nhanh hai loại liên kết mà chúng tôi sẽ làm việc với

Khó vs. liên kết mềm

Liên kết cứng và mềm là các loại tệp đặc biệt trỏ đến các tệp khác trên hệ thống tệp. Liên kết mềm trở nên không hợp lệ nếu tệp được liên kết đến bị xóa

Mặt khác, một liên kết cứng trỏ đến một tệp sẽ vẫn hợp lệ và chứa nội dung của tệp ngay cả khi tệp gốc bị xóa. Liên kết cứng không trỏ đến một tệp mà là dữ liệu cơ bản của tệp. Dữ liệu này được gọi là nút trên hệ thống tệp Unix/Linux

Chúng ta có thể dễ dàng tạo các liên kết mềm và cứng với mô-đun

import * as fsPromises from 'fs/promises';

async function usingPromiseAPI(path) {
    const promise = fsPromises.readFile(path);
    console.log('do something else');
    return await promise;
}
1. Sử dụng hàm
import * as fsPromises from 'fs/promises';

async function usingPromiseAPI(path) {
    const promise = fsPromises.readFile(path);
    console.log('do something else');
    return await promise;
}
78 để tạo liên kết mềm và hàm
import * as fsPromises from 'fs/promises';

async function usingPromiseAPI(path) {
    const promise = fsPromises.readFile(path);
    console.log('do something else');
    return await promise;
}
79 để tạo liên kết cứng

  window.onload = getExif;

  function getExif() {
    var img1 = document.getElementById("img1");
    EXIF.getData(img1, function () {
      var MetaData = EXIF.getAllTags(this);
      console.log(JSON.stringify(MetaData, null, "\t"));
    });
  }
54

Điều gì sẽ xảy ra nếu bạn muốn xác định tệp cơ sở mà liên kết trỏ tới?

  window.onload = getExif;

  function getExif() {
    var img1 = document.getElementById("img1");
    EXIF.getData(img1, function () {
      var MetaData = EXIF.getAllTags(this);
      console.log(JSON.stringify(MetaData, null, "\t"));
    });
  }
55

Hàm

  window.onload = getExif;

  function getExif() {
    var img1 = document.getElementById("img1");
    EXIF.getData(img1, function () {
      var MetaData = EXIF.getAllTags(this);
      console.log(JSON.stringify(MetaData, null, "\t"));
    });
  }
500 có thể đọc các liên kết mềm, nhưng không đọc được các liên kết cứng. Một liên kết cứng không thể phân biệt được với tệp gốc mà nó liên kết đến. Trên thực tế, tất cả các tệp đều là liên kết cứng về mặt kỹ thuật. Hàm
  window.onload = getExif;

  function getExif() {
    var img1 = document.getElementById("img1");
    EXIF.getData(img1, function () {
      var MetaData = EXIF.getAllTags(this);
      console.log(JSON.stringify(MetaData, null, "\t"));
    });
  }
500 về cơ bản xem nó như một tệp thông thường khác và đưa ra lỗi
  window.onload = getExif;

  function getExif() {
    var img1 = document.getElementById("img1");
    EXIF.getData(img1, function () {
      var MetaData = EXIF.getAllTags(this);
      console.log(JSON.stringify(MetaData, null, "\t"));
    });
  }
503

Hàm

  window.onload = getExif;

  function getExif() {
    var img1 = document.getElementById("img1");
    EXIF.getData(img1, function () {
      var MetaData = EXIF.getAllTags(this);
      console.log(JSON.stringify(MetaData, null, "\t"));
    });
  }
504 có thể xóa cả liên kết cứng và mềm

  window.onload = getExif;

  function getExif() {
    var img1 = document.getElementById("img1");
    EXIF.getData(img1, function () {
      var MetaData = EXIF.getAllTags(this);
      console.log(JSON.stringify(MetaData, null, "\t"));
    });
  }
56

Hàm

  window.onload = getExif;

  function getExif() {
    var img1 = document.getElementById("img1");
    EXIF.getData(img1, function () {
      var MetaData = EXIF.getAllTags(this);
      console.log(JSON.stringify(MetaData, null, "\t"));
    });
  }
504 thực sự phục vụ như một hàm có mục đích chung cũng có thể được sử dụng để xóa các tệp thông thường, vì chúng về cơ bản giống như một liên kết cứng. Ngoài các hàm
import * as fsPromises from 'fs/promises';

async function usingPromiseAPI(path) {
    const promise = fsPromises.readFile(path);
    console.log('do something else');
    return await promise;
}
79 và
  window.onload = getExif;

  function getExif() {
    var img1 = document.getElementById("img1");
    EXIF.getData(img1, function () {
      var MetaData = EXIF.getAllTags(this);
      console.log(JSON.stringify(MetaData, null, "\t"));
    });
  }
504, tất cả các hàm liên kết khác đều được sử dụng với các liên kết mềm

Bạn có thể sửa đổi siêu dữ liệu của một liên kết mềm giống như một tệp thông thường.

  window.onload = getExif;

  function getExif() {
    var img1 = document.getElementById("img1");
    EXIF.getData(img1, function () {
      var MetaData = EXIF.getAllTags(this);
      console.log(JSON.stringify(MetaData, null, "\t"));
    });
  }
57

Ngoài mỗi chức năng được bắt đầu bằng một

  window.onload = getExif;

  function getExif() {
    var img1 = document.getElementById("img1");
    EXIF.getData(img1, function () {
      var MetaData = EXIF.getAllTags(this);
      console.log(JSON.stringify(MetaData, null, "\t"));
    });
  }
508, các chức năng này hoạt động giống hệt với các chức năng tệp tương đương của chúng

Làm việc với các thư mục

Chúng ta không thể chỉ dừng lại ở việc xử lý hồ sơ. Nếu bạn đang làm việc với các tệp, chắc chắn bạn cũng sẽ cần phải làm việc với các thư mục. Mô-đun

import * as fsPromises from 'fs/promises';

async function usingPromiseAPI(path) {
    const promise = fsPromises.readFile(path);
    console.log('do something else');
    return await promise;
}
1 cung cấp nhiều chức năng để tạo, sửa đổi và xóa thư mục

Giống như hàm

  window.onload = getExif;

  function getExif() {
    var img1 = document.getElementById("img1");
    EXIF.getData(img1, function () {
      var MetaData = EXIF.getAllTags(this);
      console.log(JSON.stringify(MetaData, null, "\t"));
    });
  }
510 mà chúng ta đã thấy trước đó, hàm
  window.onload = getExif;

  function getExif() {
    var img1 = document.getElementById("img1");
    EXIF.getData(img1, function () {
      var MetaData = EXIF.getAllTags(this);
      console.log(JSON.stringify(MetaData, null, "\t"));
    });
  }
511 trả về một điều khiển cho một thư mục ở dạng đối tượng
  window.onload = getExif;

  function getExif() {
    var img1 = document.getElementById("img1");
    EXIF.getData(img1, function () {
      var MetaData = EXIF.getAllTags(this);
      console.log(JSON.stringify(MetaData, null, "\t"));
    });
  }
512. Đối tượng
  window.onload = getExif;

  function getExif() {
    var img1 = document.getElementById("img1");
    EXIF.getData(img1, function () {
      var MetaData = EXIF.getAllTags(this);
      console.log(JSON.stringify(MetaData, null, "\t"));
    });
  }
512 hiển thị một số chức năng có thể được sử dụng để hoạt động trên thư mục đó

  window.onload = getExif;

  function getExif() {
    var img1 = document.getElementById("img1");
    EXIF.getData(img1, function () {
      var MetaData = EXIF.getAllTags(this);
      console.log(JSON.stringify(MetaData, null, "\t"));
    });
  }
58

Đảm bảo gọi hàm

  window.onload = getExif;

  function getExif() {
    var img1 = document.getElementById("img1");
    EXIF.getData(img1, function () {
      var MetaData = EXIF.getAllTags(this);
      console.log(JSON.stringify(MetaData, null, "\t"));
    });
  }
514 để giải phóng điều khiển trên thư mục khi bạn thực hiện xong

Mô-đun

import * as fsPromises from 'fs/promises';

async function usingPromiseAPI(path) {
    const promise = fsPromises.readFile(path);
    console.log('do something else');
    return await promise;
}
1 cũng bao gồm các chức năng ẩn việc mở và đóng các điều khiển tài nguyên thư mục cho bạn. Ví dụ: bạn có thể tạo, đổi tên và xóa thư mục

  window.onload = getExif;

  function getExif() {
    var img1 = document.getElementById("img1");
    EXIF.getData(img1, function () {
      var MetaData = EXIF.getAllTags(this);
      console.log(JSON.stringify(MetaData, null, "\t"));
    });
  }
59

Ví dụ 2, 5 và 6 minh họa tùy chọn

import * as fsPromises from 'fs/promises';

async function usingPromiseAPI(path) {
    const promise = fsPromises.readFile(path);
    console.log('do something else');
    return await promise;
}
11, tùy chọn này đặc biệt hữu ích nếu bạn không biết liệu đường dẫn có tồn tại hay không trước khi tạo hoặc xóa nó

Có hai tùy chọn để đọc nội dung của một thư mục. Theo mặc định, hàm

  window.onload = getExif;

  function getExif() {
    var img1 = document.getElementById("img1");
    EXIF.getData(img1, function () {
      var MetaData = EXIF.getAllTags(this);
      console.log(JSON.stringify(MetaData, null, "\t"));
    });
  }
517 trả về danh sách tên của tất cả các tệp và thư mục ngay bên dưới thư mục được yêu cầu

Thay vào đó, bạn có thể chuyển tùy chọn

  window.onload = getExif;

  function getExif() {
    var img1 = document.getElementById("img1");
    EXIF.getData(img1, function () {
      var MetaData = EXIF.getAllTags(this);
      console.log(JSON.stringify(MetaData, null, "\t"));
    });
  }
518 để nhận danh sách đối tượng mục nhập thư mục
  window.onload = getExif;

  function getExif() {
    var img1 = document.getElementById("img1");
    EXIF.getData(img1, function () {
      var MetaData = EXIF.getAllTags(this);
      console.log(JSON.stringify(MetaData, null, "\t"));
    });
  }
519. Các đối tượng này chứa tên và loại của từng đối tượng hệ thống tệp trong thư mục được yêu cầu. Ví dụ

import * as fsPromises from 'fs/promises';

async function usingPromiseAPI(path) {
    const promise = fsPromises.readFile(path);
    console.log('do something else');
    return await promise;
}
0

Hàm

  window.onload = getExif;

  function getExif() {
    var img1 = document.getElementById("img1");
    EXIF.getData(img1, function () {
      var MetaData = EXIF.getAllTags(this);
      console.log(JSON.stringify(MetaData, null, "\t"));
    });
  }
517 không cung cấp tùy chọn đệ quy để đọc nội dung của thư mục con. Bạn sẽ phải viết hàm đệ quy của riêng mình hoặc dựa vào mô-đun của bên thứ ba như
  window.onload = getExif;

  function getExif() {
    var img1 = document.getElementById("img1");
    EXIF.getData(img1, function () {
      var MetaData = EXIF.getAllTags(this);
      console.log(JSON.stringify(MetaData, null, "\t"));
    });
  }
521

Gần()

Đã đến lúc

  window.onload = getExif;

  function getExif() {
    var img1 = document.getElementById("img1");
    EXIF.getData(img1, function () {
      var MetaData = EXIF.getAllTags(this);
      console.log(JSON.stringify(MetaData, null, "\t"));
    });
  }
49 xử lý tài nguyên cho bài viết này. Chúng tôi đã xem xét kỹ lưỡng cách làm việc với các tệp, liên kết và thư mục bằng cách sử dụng Nút. js mô-đun
import * as fsPromises from 'fs/promises';

async function usingPromiseAPI(path) {
    const promise = fsPromises.readFile(path);
    console.log('do something else');
    return await promise;
}
1. Xử lý tệp có sẵn trong Node. js hoàn toàn mới, đầy đủ tính năng và sẵn sàng để sử dụng

Chỉ dành cho 200 Theo dõi các yêu cầu mạng chậm và không thành công trong sản xuất

Triển khai trang web hoặc ứng dụng web dựa trên Node là phần dễ dàng. Đảm bảo phiên bản Node của bạn tiếp tục cung cấp tài nguyên cho ứng dụng của bạn là lúc mọi thứ trở nên khó khăn hơn. Nếu bạn quan tâm đến việc đảm bảo các yêu cầu đối với dịch vụ phụ trợ hoặc bên thứ ba thành công, hãy thử LogRocket.
Siêu dữ liệu tệp JavaScript
Siêu dữ liệu tệp JavaScript
https. // tên lửa. com/đăng ký/

LogRocket giống như một DVR dành cho ứng dụng web và thiết bị di động, ghi lại mọi thứ diễn ra trong khi người dùng tương tác với ứng dụng của bạn theo đúng nghĩa đen. Thay vì đoán xem tại sao lại xảy ra sự cố, bạn có thể tổng hợp và báo cáo về các yêu cầu mạng có vấn đề để nhanh chóng hiểu nguyên nhân gốc rễ

Làm cách nào để đọc dữ liệu tệp trong JavaScript?

Để đọc tệp, sử dụng FileReader , cho phép bạn đọc nội dung của đối tượng Tệp vào bộ nhớ. Bạn có thể hướng dẫn FileReader đọc tệp dưới dạng bộ đệm mảng, URL dữ liệu hoặc văn bản. // Kiểm tra xem file có phải là ảnh không.

Làm cách nào để lấy nội dung của tệp trong JavaScript?

readAsText(). Đọc nội dung của tệp đầu vào được chỉ định . Thuộc tính kết quả chứa nội dung của tệp dưới dạng chuỗi văn bản. Phương thức này có thể lấy phiên bản mã hóa làm đối số thứ hai (nếu được yêu cầu). Mã hóa mặc định là UTF-8.

Siêu dữ liệu trong JS là gì?

Thẻ dữ liệu (thông tin) về dữ liệu . Các thẻ

JavaScript có thể xử lý tệp không?

Xử lý tệp trong JavaScript là một kỹ thuật trong đó tệp được viết ở định dạng html bằng cách sử dụng CSS có thể được gọi bằng cách sử dụng tệp html bên ngoài hoặc sử dụng. tệp js trỏ đến tệp html đó . Thao tác xử lý tệp trong JavaScript bao gồm mở tệp, đóng tệp, Cập nhật dữ liệu trong tệp.