Nodejs nhận được đường dẫn đầy đủ của tệp

Giới thiệu về Cách lấy danh sách tệp theo đường dẫn bên trong các thư mục con bằng javascript trên nodejs, với mã mẫu có thể sao chép và dán

Show

Sau đây là một mã ví dụ. Nó truy xuất các tệp theo đường dẫn đã chỉ định dưới dạng một mảng dưới dạng danh sách các tệp bao gồm các thư mục con

Ngoài ra, có thể tùy chọn chỉ định độ sâu của tìm kiếm (độ sâu để tìm kiếm các cấu trúc như thư mục trong thư mục). có thể được chỉ định như là một tùy chọn

Đường dẫn trong mã mẫu được mô tả trong phiên bản Windows. Tuy nhiên, nó hoạt động tốt trên Linux và MacOS

getfilelist đệ quy. js

Trong chương trình trên, tìm kiếm đường dẫn "c. /testdir"

Đối số thứ hai được đặt thành "1" để giới hạn tìm kiếm tệp ở cấp độ thứ hai. Nếu bạn muốn tìm kiếm các tệp mà không có bất kỳ hạn chế nào, bạn có thể để đối số thứ hai không xác định

Cấu trúc thư mục được hiển thị bên dưới và các mục tiêu được truy xuất được đánh dấu

C:\TESTDIR
├─ readme.txt
├─ lv1-image
│  ├─ magictexture.png
│  └─ emptyDir  <= Empty Directory
└─lv2-prog
   ├─ 3dgame.js
   ├─ main.js
   └─ package-database
       └─ index.js

Kết quả chạy chương trình như hình bên dưới

> node getfilelist_recursively.js
[
  'C:/testdir/lv1-image/magictexture.png',
  'C:/testdir/lv2-prog/3dgame.js',
  'C:/testdir/lv2-prog/main.js',
  'C:/testdir/readme.txt'
]

Được rồi, danh sách các tập tin đã được lấy

Bạn cũng có thể muốn lấy danh sách các tệp và thư mục

Sau đó, bạn có thể viết mã như thế này

getfilelist_recursively2. js

Cấu trúc thư mục được hiển thị bên dưới và các mục tiêu được truy xuất được đánh dấu

C:\TESTDIR
├─ readme.txt
├─ lv1-image
│  ├─ magictexture.png
│  └─ emptyDir  <= Empty Directory
└─lv2-prog
   ├─ 3dgame.js
   ├─ main.js
   └─ package-database
       └─ index.js

Chỉ C. \testdir\lv2-prog\gói-cơ sở dữ liệu\index. js bị loại trừ vì độ sâu

và kết quả chạy chương trình như hình bên dưới

> node getfilelist_recursively2.js
[
  { path: 'C:/testdir/lv1-image', isDir: true },
  { path: 'C:/testdir/lv1-image/magictexture.png', isDir: false },
  { path: 'C:/testdir/lv2-prog', isDir: true },
  { path: 'C:/testdir/lv2-prog/3dgame.js',isDir: false },
  { path: 'C:/testdir/lv2-prog/main.js',isDir: false },
  { path: 'C:/testdir/readme.txt'isDir: false },
]

Một ngoại lệ sẽ được đưa ra khi cố gắng khám phá một thư mục không có đủ quyền

node:internal/fs/utils:344
    throw err;
    ^

Error: EPERM: operation not permitted, lstat 'C://$Recycle.Bin/S-1-5-18'
    at Object.lstatSync (node:fs:1514:3)
    at C:\02_data\getfilelist_recursively.js:27:17

Thông báo lỗi là "Lỗi. EPERM. hoạt động không được phép, lstat XXXX". cho biết rằng quyền truy cập vào đường dẫn "XXXX" không nhận được trạng thái do thiếu quyền

Chúng tôi phân tích cú pháp một đường dẫn Windows – đầu tiên chính xác thông qua API

import * as assert from 'node:assert/strict';
06, sau đó thông qua API
import * as assert from 'node:assert/strict';
05. Chúng ta có thể thấy rằng trong trường hợp sau, đường dẫn không được chia thành các phần của nó một cách chính xác – ví dụ: tên cơ sở của tệp phải là
import * as assert from 'node:assert/strict';
11 (thêm về ý nghĩa của các thuộc tính khác sau)

Các khái niệm đường dẫn cơ bản và hỗ trợ API của chúng

Đoạn đường dẫn, dấu tách đường dẫn, dấu phân cách đường dẫn

Thuật ngữ

  • Một đường dẫn không trống bao gồm một hoặc nhiều đoạn đường dẫn - thường là tên của các thư mục hoặc tệp
  • Dấu phân cách đường dẫn được sử dụng để phân tách hai đoạn đường dẫn liền kề trong một đường dẫn. ________số 8
  • Dấu phân cách đường dẫn phân tách các phần tử trong danh sách đường dẫn.
    > path.posix.delimiter
    ':'
    > path.win32.delimiter
    ';'
    

Chúng ta có thể thấy dấu phân cách đường dẫn và dấu phân cách đường dẫn nếu chúng ta kiểm tra biến trình bao PATH – chứa các đường dẫn mà hệ điều hành tìm kiếm các tệp thực thi khi một lệnh được nhập vào trình bao

Đây là một ví dụ về macOS PATH (biến shell

import * as assert from 'node:assert/strict';
12)

> node getfilelist_recursively.js
[
  'C:/testdir/lv1-image/magictexture.png',
  'C:/testdir/lv2-prog/3dgame.js',
  'C:/testdir/lv2-prog/main.js',
  'C:/testdir/readme.txt'
]
1

Dấu phân tách có độ dài bằng 0 vì

import * as assert from 'node:assert/strict';
13 khớp nếu một vị trí nhất định được đặt trước dấu hai chấm nhưng nó không ghi lại bất kỳ thứ gì. Do đó, dấu phân cách đường dẫn
import * as assert from 'node:assert/strict';
14 được bao gồm trong đường dẫn trước đó

Đây là một ví dụ về Windows PATH (biến shell

import * as assert from 'node:assert/strict';
15)

> node getfilelist_recursively.js
[
  'C:/testdir/lv1-image/magictexture.png',
  'C:/testdir/lv2-prog/3dgame.js',
  'C:/testdir/lv2-prog/main.js',
  'C:/testdir/readme.txt'
]
5

Thư mục làm việc hiện tại

Nhiều shell có khái niệm về thư mục làm việc hiện tại (CWD) – “thư mục tôi hiện đang ở”

  • Nếu chúng tôi sử dụng lệnh có đường dẫn đủ điều kiện một phần, đường dẫn đó sẽ được giải quyết đối với CWD
  • Nếu chúng ta bỏ qua một đường dẫn khi một lệnh mong đợi một đường dẫn, thì CWD được sử dụng
  • Trên cả Unix và Windows, lệnh thay đổi CWD là
    import * as assert from 'node:assert/strict';
    
    16

import * as assert from 'node:assert/strict';
01 là một Nút toàn cầu. biến js. Nó cung cấp cho chúng tôi các phương pháp để nhận và cài đặt CWD

  • trả về CWD
  • thay đổi CWD thành
    import * as assert from 'node:assert/strict';
    
    20
    • Phải có một thư mục tại
      import * as assert from 'node:assert/strict';
      
      20
    • Thay đổi đó không ảnh hưởng đến shell, chỉ có Node hiện đang chạy. quy trình js

Nút. js sử dụng CWD để điền vào các phần còn thiếu bất cứ khi nào đường dẫn không đủ điều kiện (hoàn thành). Điều đó cho phép chúng tôi sử dụng các đường dẫn đủ điều kiện một phần với các chức năng khác nhau – e. g.

import * as assert from 'node:assert/strict';
22

Thư mục làm việc hiện tại trên Unix

Đoạn mã sau minh họa

import * as assert from 'node:assert/strict';
23 và
import * as assert from 'node:assert/strict';
18 trên Unix

C:\TESTDIR
├─ readme.txt
├─ lv1-image
│  ├─ magictexture.png
│  └─ emptyDir  <= Empty Directory
└─lv2-prog
   ├─ 3dgame.js
   ├─ main.js
   └─ package-database
       └─ index.js
3

Thư mục làm việc hiện tại trên Windows

Cho đến nay, chúng tôi đã sử dụng thư mục làm việc hiện tại trên Unix. Windows hoạt động khác đi

  • Mỗi ổ đĩa có một thư mục hiện tại
  • Có một ổ đĩa hiện tại

Chúng tôi có thể sử dụng

import * as assert from 'node:assert/strict';
25 để đặt cả hai cùng một lúc

C:\TESTDIR
├─ readme.txt
├─ lv1-image
│  ├─ magictexture.png
│  └─ emptyDir  <= Empty Directory
└─lv2-prog
   ├─ 3dgame.js
   ├─ main.js
   └─ package-database
       └─ index.js
5

Khi chúng tôi truy cập lại một ổ đĩa, Node. js ghi nhớ thư mục hiện tại trước đó của ổ đĩa đó

import * as assert from 'node:assert/strict';
0

hoàn toàn so với. đường dẫn đủ điều kiện một phần, đường dẫn giải quyết

  • Một đường dẫn đủ điều kiện không dựa vào bất kỳ thông tin nào khác và có thể được sử dụng như là
  • Đường dẫn đủ điều kiện một phần bị thiếu thông tin. Chúng ta cần biến nó thành một đường dẫn đủ điều kiện trước khi có thể sử dụng nó. Điều đó được thực hiện bằng cách giải quyết nó theo một con đường đủ điều kiện

Đường dẫn đầy đủ và một phần đủ điều kiện trên Unix

Unix chỉ biết hai loại đường dẫn

  • Đường dẫn tuyệt đối đủ điều kiện và bắt đầu bằng dấu gạch chéo

    import * as assert from 'node:assert/strict';
    
    1
  • Đường dẫn tương đối đủ điều kiện một phần và bắt đầu bằng tên tệp hoặc dấu chấm

    import * as assert from 'node:assert/strict';
    
    2

Hãy sử dụng

import * as assert from 'node:assert/strict';
26 (được giải thích chi tiết hơn) để giải quyết các đường dẫn tương đối so với các đường dẫn tuyệt đối. Kết quả là đường dẫn tuyệt đối

import * as assert from 'node:assert/strict';
3

Đường dẫn đủ điều kiện và một phần trên Windows

Windows phân biệt bốn loại đường dẫn (để biết thêm thông tin, xem phần )

  • Có đường dẫn tuyệt đối và đường dẫn tương đối
  • Mỗi một trong hai loại đường dẫn đó có thể có một ký tự ổ đĩa ("thiết kế ổ đĩa") hoặc không

Đường dẫn tuyệt đối với ký tự ổ đĩa là đủ điều kiện. Tất cả các đường dẫn khác đều đủ điều kiện một phần

Giải quyết một đường dẫn tuyệt đối không có ký tự ổ đĩa đối với đường dẫn đủ điều kiện

import * as assert from 'node:assert/strict';
27, chọn ký tự ổ đĩa của
import * as assert from 'node:assert/strict';
27

import * as assert from 'node:assert/strict';
4

Giải quyết một đường dẫn tương đối không có ký tự ổ đĩa đối với một đường dẫn đủ điều kiện, có thể được xem là cập nhật cái sau

import * as assert from 'node:assert/strict';
5

Giải quyết một đường dẫn tương đối

import * as assert from 'node:assert/strict';
29 bằng ký tự ổ đĩa so với đường dẫn đủ điều kiện
import * as assert from 'node:assert/strict';
27 phụ thuộc vào ký tự ổ đĩa của
import * as assert from 'node:assert/strict';
29

  • Ký tự ổ đĩa giống như
    import * as assert from 'node:assert/strict';
    
    27?
  • Ký tự ổ đĩa khác với
    import * as assert from 'node:assert/strict';
    
    27?

Điều đó trông như sau

Nhận đường dẫn của các thư mục quan trọng thông qua mô-đun import * as assert from 'node:assert/strict'; 02

Module

import * as assert from 'node:assert/strict';
02 cung cấp cho chúng ta đường dẫn của 2 thư mục quan trọng

  • trả về đường dẫn đến thư mục chính của người dùng hiện tại - ví dụ

    import * as assert from 'node:assert/strict';
    
    6
  • trả về đường dẫn của thư mục hệ điều hành cho các tệp tạm thời - ví dụ

    import * as assert from 'node:assert/strict';
    
    7

Có hai chức năng để nối các đường dẫn

  • import * as assert from 'node:assert/strict';
    
    26 luôn trả về các đường dẫn đủ điều kiện
  • import * as assert from 'node:assert/strict';
    
    43 bảo tồn các đường dẫn tương đối
import * as assert from 'node:assert/strict';
8

Nối

import * as assert from 'node:assert/strict';
44 và trả về một đường dẫn đủ điều kiện. Nó sử dụng thuật toán sau

  • Bắt đầu với thư mục làm việc hiện tại
  • Giải quyết
    import * as assert from 'node:assert/strict';
    
    45 so với kết quả trước đó
  • Giải quyết
    import * as assert from 'node:assert/strict';
    
    46 so với kết quả trước đó
  • Làm tương tự cho tất cả các đường dẫn còn lại
  • Trả về kết quả cuối cùng

Không có đối số,

import * as assert from 'node:assert/strict';
26 trả về đường dẫn của thư mục làm việc hiện tại

import * as assert from 'node:assert/strict';
9

Một hoặc nhiều đường dẫn tương đối được sử dụng để giải quyết, bắt đầu với thư mục làm việc hiện tại

import * as assert from 'node:assert/strict';
60

Mọi đường dẫn đủ điều kiện sẽ thay thế kết quả trước đó

import * as assert from 'node:assert/strict';
61

Điều đó cho phép chúng tôi giải quyết các đường dẫn đủ điều kiện một phần so với các đường dẫn đủ điều kiện

_______562____563

Bắt đầu với

import * as assert from 'node:assert/strict';
48 và diễn giải các đường dẫn còn lại dưới dạng hướng dẫn tăng dần hoặc giảm dần. Ngược lại với
import * as assert from 'node:assert/strict';
26, chức năng này bảo tồn các đường dẫn đủ điều kiện một phần. Nếu
import * as assert from 'node:assert/strict';
48 đủ điều kiện một phần, kết quả đủ điều kiện một phần. Nếu nó đủ điều kiện, kết quả là đủ điều kiện

Các ví dụ của giảm dần

import * as assert from 'node:assert/strict';
64

Dấu chấm đôi tăng dần

import * as assert from 'node:assert/strict';
65

Dấu chấm đơn không làm gì cả

import * as assert from 'node:assert/strict';
66

Nếu các đối số sau đối số đầu tiên là các đường dẫn đủ điều kiện, thì chúng được hiểu là các đường dẫn tương đối

import * as assert from 'node:assert/strict';
67

Sử dụng nhiều hơn hai đối số

import * as assert from 'node:assert/strict';
68

Đảm bảo đường dẫn được chuẩn hóa, đủ điều kiện hoặc tương đối

import * as assert from 'node:assert/strict'; 51. đảm bảo đường dẫn được chuẩn hóa

import * as assert from 'node:assert/strict';
69

Trên Unix,

import * as assert from 'node:assert/strict';
51

  • Xóa các đoạn đường dẫn là các dấu chấm đơn (______553)
  • Giải quyết các đoạn đường dẫn có dấu chấm kép (______554)
  • Biến nhiều đường phân cách thành một đường phân cách duy nhất

Ví dụ

Trên Windows,

import * as assert from 'node:assert/strict';
51

  • Xóa các đoạn đường dẫn là các dấu chấm đơn (______553)
  • Giải quyết các đoạn đường dẫn có dấu chấm kép (______554)
  • Chuyển đổi từng dấu gạch chéo phân cách đường dẫn (
    import * as assert from 'node:assert/strict';
    
    58) – hợp lệ – thành dấu phân cách đường dẫn ưa thích (
    import * as assert from 'node:assert/strict';
    
    59)
  • Chuyển đổi các chuỗi có nhiều dấu tách đường dẫn thành dấu gạch chéo ngược đơn

Ví dụ

Lưu ý rằng

import * as assert from 'node:assert/strict';
43 với một đối số cũng bình thường hóa và hoạt động giống như
import * as assert from 'node:assert/strict';
51

> path.posix.sep
'/'
> path.win32.sep
'\\'
00

import * as assert from 'node:assert/strict'; 26 (một đối số). đảm bảo đường dẫn được chuẩn hóa và đủ điều kiện

Chúng tôi đã gặp phải. Được gọi với một đối số duy nhất, nó vừa chuẩn hóa đường dẫn vừa đảm bảo rằng chúng đủ điều kiện

Sử dụng

import * as assert from 'node:assert/strict';
26 trên Unix

> path.posix.sep
'/'
> path.win32.sep
'\\'
01

Sử dụng

import * as assert from 'node:assert/strict';
26 trên Windows

> path.posix.sep
'/'
> path.win32.sep
'\\'
02

import * as assert from 'node:assert/strict'; 66. tạo đường dẫn tương đối

> path.posix.sep
'/'
> path.win32.sep
'\\'
03

Trả về một đường dẫn tương đối đưa chúng ta từ

import * as assert from 'node:assert/strict';
67 đến
import * as assert from 'node:assert/strict';
68

> path.posix.sep
'/'
> path.win32.sep
'\\'
04

Trên Windows, chúng tôi nhận được một đường dẫn đủ điều kiện nếu

import * as assert from 'node:assert/strict';
67 và
import * as assert from 'node:assert/strict';
68 nằm trên các ổ đĩa khác nhau

> path.posix.sep
'/'
> path.win32.sep
'\\'
05

Chức năng này cũng hoạt động với các đường dẫn tương đối

> path.posix.sep
'/'
> path.win32.sep
'\\'
06

import * as assert from 'node:assert/strict'; 08. tạo một đối tượng với các phần đường dẫn

> path.posix.sep
'/'
> path.win32.sep
'\\'
07

Trích xuất các phần khác nhau của

import * as assert from 'node:assert/strict';
07 và trả về chúng trong một đối tượng có các thuộc tính sau

  • import * as assert from 'node:assert/strict';
    
    73. đoạn cuối cùng của một con đường
    • import * as assert from 'node:assert/strict';
      
      74. phần mở rộng tên tệp của cơ sở
    • import * as assert from 'node:assert/strict';
      
      75. cơ sở mà không có phần mở rộng. Phần này còn được gọi là gốc của đường dẫn
  • import * as assert from 'node:assert/strict';
    
    76. điểm bắt đầu của một đường dẫn (trước đoạn đầu tiên)
  • import * as assert from 'node:assert/strict';
    
    77. thư mục chứa cơ sở – đường dẫn không có cơ sở

Lát nữa, chúng ta sẽ xem cái nào là nghịch đảo của

import * as assert from 'node:assert/strict';
08. Nó chuyển đổi một đối tượng với các phần đường dẫn thành một đường dẫn

Ví dụ.
import * as assert from 'node:assert/strict';
08 trên Unix

Đây là cách sử dụng

import * as assert from 'node:assert/strict';
08 trên Unix

> path.posix.sep
'/'
> path.win32.sep
'\\'
08

Sơ đồ sau đây trực quan hóa phạm vi của các bộ phận

> path.posix.sep
'/'
> path.win32.sep
'\\'
09

Ví dụ, chúng ta có thể thấy rằng

import * as assert from 'node:assert/strict';
77 là đường dẫn không có cơ sở. Và ________ 573 đó là ________ 575 cộng với ________ 574

Ví dụ.
import * as assert from 'node:assert/strict';
08 trên Windows

Đây là cách hoạt động của

import * as assert from 'node:assert/strict';
08 trên Windows

> path.posix.sep
'/'
> path.win32.sep
'\\'
0

Đây là sơ đồ cho kết quả

> path.posix.sep
'/'
> path.win32.sep
'\\'
1
> path.posix.sep
'/'
> path.win32.sep
'\\'
2

Trả về cơ số của

import * as assert from 'node:assert/strict';
07

> path.posix.sep
'/'
> path.win32.sep
'\\'
3

Tùy chọn, chức năng này cũng có thể loại bỏ một hậu tố

> path.posix.sep
'/'
> path.win32.sep
'\\'
4

Xóa tiện ích mở rộng có phân biệt chữ hoa chữ thường – ngay cả trên Windows

> path.posix.sep
'/'
> path.win32.sep
'\\'
5
> path.posix.sep
'/'
> path.win32.sep
'\\'
6

Trả về thư mục mẹ của tệp hoặc thư mục tại

import * as assert from 'node:assert/strict';
07

> path.posix.sep
'/'
> path.win32.sep
'\\'
7
> path.posix.sep
'/'
> path.win32.sep
'\\'
8

Trả về phần mở rộng của

import * as assert from 'node:assert/strict';
07

> path.posix.sep
'/'
> path.win32.sep
'\\'
9

import * as assert from 'node:assert/strict'; 91. Là một đường dẫn nhất định tuyệt đối?

> path.posix.delimiter
':'
> path.win32.delimiter
';'
0

Trả về

import * as assert from 'node:assert/strict';
92 nếu
import * as assert from 'node:assert/strict';
07 là tuyệt đối và ngược lại là
import * as assert from 'node:assert/strict';
94

Kết quả trên Unix rất đơn giản

> path.posix.delimiter
':'
> path.win32.delimiter
';'
1

Trên Windows, “tuyệt đối” không nhất thiết có nghĩa là “đủ điều kiện” (chỉ đường dẫn đầu tiên là đủ điều kiện)

> path.posix.delimiter
':'
> path.win32.delimiter
';'
2

import * as assert from 'node:assert/strict'; 78. tạo đường dẫn ra khỏi các bộ phận

> path.posix.delimiter
':'
> path.win32.delimiter
';'
3

Tạo một đường dẫn ra khỏi một đối tượng đường dẫn

> path.posix.delimiter
':'
> path.win32.delimiter
';'
4

Ví dụ. thay đổi phần mở rộng tên tệp

Chúng ta có thể sử dụng

import * as assert from 'node:assert/strict';
78 để thay đổi phần mở rộng của đường dẫn

Nếu chúng tôi biết phần mở rộng tên tệp gốc, chúng tôi cũng có thể sử dụng biểu thức chính quy để thay đổi phần mở rộng tên tệp

> path.posix.delimiter
':'
> path.win32.delimiter
';'
5

Sử dụng cùng một đường dẫn trên các nền tảng khác nhau

Đôi khi chúng tôi muốn sử dụng cùng một đường dẫn trên các nền tảng khác nhau. Sau đó, có hai vấn đề mà chúng ta đang phải đối mặt

  • Dấu tách đường dẫn có thể khác
  • Cấu trúc tệp có thể khác. thư mục chính và thư mục cho các tệp tạm thời có thể ở các vị trí khác nhau, v.v.

Ví dụ, hãy xem xét một Nút. ứng dụng js hoạt động trên một thư mục có dữ liệu. Giả sử rằng ứng dụng có thể được định cấu hình bằng hai loại đường dẫn

  • Đường dẫn đủ điều kiện ở mọi nơi trên hệ thống
  • Đường dẫn bên trong thư mục dữ liệu

Do các vấn đề nêu trên

  • Chúng tôi không thể sử dụng lại các đường dẫn đủ điều kiện giữa các nền tảng

    • Đôi khi chúng ta cần những đường dẫn tuyệt đối. Chúng phải được định cấu hình cho mỗi "phiên bản" của thư mục dữ liệu và được lưu trữ bên ngoài (hoặc bên trong nó và bị kiểm soát phiên bản bỏ qua). Các đường dẫn này được giữ nguyên và không bị di chuyển cùng với thư mục dữ liệu
  • Chúng ta có thể sử dụng lại các đường dẫn trỏ đến thư mục dữ liệu. Những đường dẫn như vậy có thể được lưu trữ trong các tệp cấu hình (trong thư mục dữ liệu hoặc không) và trong các hằng số trong mã của ứng dụng. Để làm việc đó

    • Chúng ta phải lưu trữ chúng dưới dạng đường dẫn tương đối
    • Chúng tôi phải đảm bảo rằng dấu phân cách đường dẫn là chính xác trên mỗi nền tảng

    Tiểu mục tiếp theo giải thích cách đạt được cả hai

Đường dẫn tương đối độc lập với nền tảng

Các đường dẫn tương đối độc lập với nền tảng có thể được lưu trữ dưới dạng Mảng của các phân đoạn đường dẫn và biến thành các đường dẫn dành riêng cho nền tảng đủ điều kiện như sau

> path.posix.delimiter
':'
> path.win32.delimiter
';'
6

Để tạo các đường dẫn tương đối dành riêng cho nền tảng, chúng ta có thể sử dụng

> path.posix.delimiter
':'
> path.win32.delimiter
';'
7

Hàm sau đây chuyển đổi các đường dẫn dành riêng cho nền tảng tương đối thành các đường dẫn độc lập với nền tảng

> path.posix.delimiter
':'
> path.win32.delimiter
';'
8

Sử dụng

import * as assert from 'node:assert/strict';
97 trên Unix

> path.posix.delimiter
':'
> path.win32.delimiter
';'
9

Sử dụng

import * as assert from 'node:assert/strict';
97 trên Windows

> node getfilelist_recursively.js
[
  'C:/testdir/lv1-image/magictexture.png',
  'C:/testdir/lv2-prog/3dgame.js',
  'C:/testdir/lv2-prog/main.js',
  'C:/testdir/readme.txt'
]
10

Sử dụng thư viện để khớp đường dẫn qua quả cầu

Mô-đun npm

import * as assert from 'node:assert/strict';
99 cho phép chúng tôi khớp các đường dẫn với các mẫu được gọi là biểu thức toàn cầu, mẫu toàn cầu hoặc khối cầu

> node getfilelist_recursively.js
[
  'C:/testdir/lv1-image/magictexture.png',
  'C:/testdir/lv2-prog/3dgame.js',
  'C:/testdir/lv2-prog/main.js',
  'C:/testdir/readme.txt'
]
11

Các trường hợp sử dụng cho quả địa cầu

  • Chỉ định tệp nào trong thư mục sẽ được xử lý bằng tập lệnh
  • Chỉ định những tập tin để bỏ qua

Thêm thư viện toàn cầu

  • multimatch mở rộng minimatch với sự hỗ trợ cho nhiều mẫu
  • micromatch là giải pháp thay thế cho minimatch và multimatch có API tương tự
  • globby là một thư viện dựa trên fast-glob có thêm các tính năng tiện lợi

API đối sánh nhỏ

Toàn bộ API của minimatch được ghi lại trong tệp readme của dự án. Trong tiểu mục này, chúng ta xem xét chức năng quan trọng nhất

Minimatch biên dịch các khối thành các đối tượng JavaScript

import * as assert from 'node:assert/strict';
600 và sử dụng các đối tượng đó để khớp

import * as assert from 'node:assert/strict';
601. biên dịch và kết hợp một lần

> node getfilelist_recursively.js
[
  'C:/testdir/lv1-image/magictexture.png',
  'C:/testdir/lv2-prog/3dgame.js',
  'C:/testdir/lv2-prog/main.js',
  'C:/testdir/readme.txt'
]
12

Trả về

import * as assert from 'node:assert/strict';
92 nếu
import * as assert from 'node:assert/strict';
603 khớp với
import * as assert from 'node:assert/strict';
07 và
import * as assert from 'node:assert/strict';
94 nếu ngược lại

Hai lựa chọn thú vị

  • ____5606 (mặc định.

    import * as assert from 'node:assert/strict';
    
    94)
    Nếu
    import * as assert from 'node:assert/strict';
    
    92, các ký hiệu đại diện như
    import * as assert from 'node:assert/strict';
    
    609 và
    import * as assert from 'node:assert/strict';
    
    610 khớp với các đoạn đường dẫn "ẩn" (có tên bắt đầu bằng dấu chấm).

    > node getfilelist_recursively.js
    [
      'C:/testdir/lv1-image/magictexture.png',
      'C:/testdir/lv2-prog/3dgame.js',
      'C:/testdir/lv2-prog/main.js',
      'C:/testdir/readme.txt'
    ]
    13
  • ____5611 (mặc định.

    import * as assert from 'node:assert/strict';
    
    94)
    Nếu
    import * as assert from 'node:assert/strict';
    
    92, mẫu không có dấu gạch chéo được so khớp với tên cơ sở của đường dẫn.

    > node getfilelist_recursively.js
    [
      'C:/testdir/lv1-image/magictexture.png',
      'C:/testdir/lv2-prog/3dgame.js',
      'C:/testdir/lv2-prog/main.js',
      'C:/testdir/readme.txt'
    ]
    14

Lớp

import * as assert from 'node:assert/strict';
614 cho phép chúng tôi chỉ biên dịch toàn cầu thành biểu thức chính quy một lần và khớp nhiều lần

> node getfilelist_recursively.js
[
  'C:/testdir/lv1-image/magictexture.png',
  'C:/testdir/lv2-prog/3dgame.js',
  'C:/testdir/lv2-prog/main.js',
  'C:/testdir/readme.txt'
]
15

Đây là cách lớp này được sử dụng

> node getfilelist_recursively.js
[
  'C:/testdir/lv1-image/magictexture.png',
  'C:/testdir/lv2-prog/3dgame.js',
  'C:/testdir/lv2-prog/main.js',
  'C:/testdir/readme.txt'
]
16

Cú pháp của biểu thức toàn cầu

Tiểu mục này bao gồm các yếu tố cần thiết của cú pháp. Nhưng có nhiều tính năng hơn. Đây là tài liệu ở đây

Đường dẫn Windows phù hợp

Ngay cả trên Windows, các phân đoạn khối cầu được phân tách bằng dấu gạch chéo – nhưng chúng khớp với cả dấu gạch chéo ngược và dấu gạch chéo (là dấu phân cách đường dẫn hợp pháp trên Windows)

> node getfilelist_recursively.js
[
  'C:/testdir/lv1-image/magictexture.png',
  'C:/testdir/lv2-prog/3dgame.js',
  'C:/testdir/lv2-prog/main.js',
  'C:/testdir/readme.txt'
]
17

Minimatch không chuẩn hóa đường dẫn

Minimatch không chuẩn hóa đường dẫn cho chúng tôi

> node getfilelist_recursively.js
[
  'C:/testdir/lv1-image/magictexture.png',
  'C:/testdir/lv2-prog/3dgame.js',
  'C:/testdir/lv2-prog/main.js',
  'C:/testdir/readme.txt'
]
18

Do đó, chúng ta phải chuẩn hóa các đường dẫn nếu chúng ta không tự tạo chúng

> node getfilelist_recursively.js
[
  'C:/testdir/lv1-image/magictexture.png',
  'C:/testdir/lv2-prog/3dgame.js',
  'C:/testdir/lv2-prog/main.js',
  'C:/testdir/readme.txt'
]
19

Các mẫu không có ký hiệu đại diện. đường phân cách phải xếp hàng

Các mẫu không có ký hiệu đại diện (khớp linh hoạt hơn) phải khớp chính xác. Đặc biệt là các dải phân cách đường đi phải thẳng hàng

> node getfilelist_recursively.js
[
  'C:/testdir/lv1-image/magictexture.png',
  'C:/testdir/lv2-prog/3dgame.js',
  'C:/testdir/lv2-prog/main.js',
  'C:/testdir/readme.txt'
]
50

Đó là, chúng ta phải quyết định đường dẫn tuyệt đối hoặc tương đối

Với tùy chọn

import * as assert from 'node:assert/strict';
615, chúng tôi có thể khớp các mẫu mà không có dấu gạch chéo với tên cơ sở của đường dẫn

> node getfilelist_recursively.js
[
  'C:/testdir/lv1-image/magictexture.png',
  'C:/testdir/lv2-prog/3dgame.js',
  'C:/testdir/lv2-prog/main.js',
  'C:/testdir/readme.txt'
]
51

Dấu hoa thị (
import * as assert from 'node:assert/strict';
609) phù hợp với bất kỳ (một phần của một) phân đoạn duy nhất

Dấu hoa thị biểu tượng ký tự đại diện (_______5609) khớp với bất kỳ đoạn đường dẫn nào hoặc bất kỳ phần nào của đoạn

> node getfilelist_recursively.js
[
  'C:/testdir/lv1-image/magictexture.png',
  'C:/testdir/lv2-prog/3dgame.js',
  'C:/testdir/lv2-prog/main.js',
  'C:/testdir/readme.txt'
]
52

Dấu hoa thị không khớp với "tệp vô hình" có tên bắt đầu bằng dấu chấm. Nếu chúng ta muốn khớp những cái đó, chúng ta phải đặt trước dấu hoa thị bằng dấu chấm

> node getfilelist_recursively.js
[
  'C:/testdir/lv1-image/magictexture.png',
  'C:/testdir/lv2-prog/3dgame.js',
  'C:/testdir/lv2-prog/main.js',
  'C:/testdir/readme.txt'
]
53

Tùy chọn

import * as assert from 'node:assert/strict';
618 cho phép chúng tôi tắt hành vi này

> node getfilelist_recursively.js
[
  'C:/testdir/lv1-image/magictexture.png',
  'C:/testdir/lv2-prog/3dgame.js',
  'C:/testdir/lv2-prog/main.js',
  'C:/testdir/readme.txt'
]
54

Dấu hoa thị kép (
import * as assert from 'node:assert/strict';
610) khớp với 0 hoặc nhiều phân đoạn

´______5620 khớp với 0 hoặc nhiều phân đoạn

> node getfilelist_recursively.js
[
  'C:/testdir/lv1-image/magictexture.png',
  'C:/testdir/lv2-prog/3dgame.js',
  'C:/testdir/lv2-prog/main.js',
  'C:/testdir/readme.txt'
]
55

Nếu chúng ta muốn khớp các đường dẫn tương đối, mẫu vẫn không được bắt đầu bằng dấu phân cách đường dẫn

> node getfilelist_recursively.js
[
  'C:/testdir/lv1-image/magictexture.png',
  'C:/testdir/lv2-prog/3dgame.js',
  'C:/testdir/lv2-prog/main.js',
  'C:/testdir/readme.txt'
]
56

Dấu hoa thị kép không khớp với các đoạn đường dẫn "ẩn" có tên bắt đầu bằng dấu chấm

> node getfilelist_recursively.js
[
  'C:/testdir/lv1-image/magictexture.png',
  'C:/testdir/lv2-prog/3dgame.js',
  'C:/testdir/lv2-prog/main.js',
  'C:/testdir/readme.txt'
]
57

Chúng tôi có thể tắt hành vi đó thông qua tùy chọn

import * as assert from 'node:assert/strict';
618

> node getfilelist_recursively.js
[
  'C:/testdir/lv1-image/magictexture.png',
  'C:/testdir/lv2-prog/3dgame.js',
  'C:/testdir/lv2-prog/main.js',
  'C:/testdir/readme.txt'
]
58

quả cầu phủ định

Nếu chúng ta bắt đầu một quả cầu bằng dấu chấm than, nó sẽ khớp nếu mẫu sau dấu chấm than không khớp

> node getfilelist_recursively.js
[
  'C:/testdir/lv1-image/magictexture.png',
  'C:/testdir/lv2-prog/3dgame.js',
  'C:/testdir/lv2-prog/main.js',
  'C:/testdir/readme.txt'
]
59

mẫu thay thế

Các mẫu được phân tách bằng dấu phẩy bên trong dấu ngoặc nhọn khớp nếu một trong các mẫu khớp

C:\TESTDIR
├─ readme.txt
├─ lv1-image
│  ├─ magictexture.png
│  └─ emptyDir  <= Empty Directory
└─lv2-prog
   ├─ 3dgame.js
   ├─ main.js
   └─ package-database
       └─ index.js
30

Dãy số nguyên

Một cặp số nguyên được phân tách bằng dấu chấm kép xác định một dải số nguyên và khớp nếu bất kỳ phần tử nào của nó khớp

C:\TESTDIR
├─ readme.txt
├─ lv1-image
│  ├─ magictexture.png
│  └─ emptyDir  <= Empty Directory
└─lv2-prog
   ├─ 3dgame.js
   ├─ main.js
   └─ package-database
       └─ index.js
31

Đệm bằng số không cũng được hỗ trợ

C:\TESTDIR
├─ readme.txt
├─ lv1-image
│  ├─ magictexture.png
│  └─ emptyDir  <= Empty Directory
└─lv2-prog
   ├─ 3dgame.js
   ├─ main.js
   └─ package-database
       └─ index.js
32

Sử dụng URL import * as assert from 'node:assert/strict'; 622 để tham khảo các tệp

Có hai cách phổ biến để tham khảo các tệp trong Node. js

  • Đường dẫn trong chuỗi
  • Trường hợp của
    import * as assert from 'node:assert/strict';
    
    623 với giao thức
    import * as assert from 'node:assert/strict';
    
    622

Ví dụ

C:\TESTDIR
├─ readme.txt
├─ lv1-image
│  ├─ magictexture.png
│  └─ emptyDir  <= Empty Directory
└─lv2-prog
   ├─ 3dgame.js
   ├─ main.js
   └─ package-database
       └─ index.js
33

Lớp import * as assert from 'node:assert/strict'; 623

Trong phần này, chúng ta xem xét kỹ hơn về lớp

import * as assert from 'node:assert/strict';
623. Thông tin thêm về lớp học này

Trong bài đăng trên blog này, chúng tôi truy cập lớp

import * as assert from 'node:assert/strict';
623 thông qua một biến toàn cầu vì đó là cách nó được sử dụng trên các nền tảng web khác. Nhưng nó cũng có thể được nhập khẩu

C:\TESTDIR
├─ readme.txt
├─ lv1-image
│  ├─ magictexture.png
│  └─ emptyDir  <= Empty Directory
└─lv2-prog
   ├─ 3dgame.js
   ├─ main.js
   └─ package-database
       └─ index.js
34

URI so với. tài liệu tham khảo tương đối

URL là một tập hợp con của URI. RFC 3986, tiêu chuẩn cho URI, phân biệt

  • Một URI bắt đầu bằng dấu phân cách dấu hai chấm theo sau
  • Tất cả các tham chiếu URI khác là tham chiếu tương đối

Trình tạo của
import * as assert from 'node:assert/strict';
623

Lớp

import * as assert from 'node:assert/strict';
623 có thể được khởi tạo theo hai cách

  • import * as assert from 'node:assert/strict';
    
    630

    import * as assert from 'node:assert/strict';
    
    631 phải là một URI. Nó chỉ định URI của phiên bản mới

  • import * as assert from 'node:assert/strict';
    
    632

    import * as assert from 'node:assert/strict';
    
    633 phải là một URI. Nếu
    import * as assert from 'node:assert/strict';
    
    634 là một tham chiếu tương đối, nó sẽ được giải quyết dựa trên
    import * as assert from 'node:assert/strict';
    
    633 và kết quả trở thành URI của phiên bản mới

    Nếu

    import * as assert from 'node:assert/strict';
    
    634 là một URI, thì nó sẽ thay thế hoàn toàn
    import * as assert from 'node:assert/strict';
    
    633 làm dữ liệu dựa trên phiên bản đó

Ở đây chúng ta có thể thấy lớp đang hoạt động

Giải quyết các tham chiếu tương đối đối với các trường hợp của
import * as assert from 'node:assert/strict';
623

Hãy xem lại biến thể này của hàm tạo

import * as assert from 'node:assert/strict';
623

C:\TESTDIR
├─ readme.txt
├─ lv1-image
│  ├─ magictexture.png
│  └─ emptyDir  <= Empty Directory
└─lv2-prog
   ├─ 3dgame.js
   ├─ main.js
   └─ package-database
       └─ index.js
35

Đối số

import * as assert from 'node:assert/strict';
633 bị ép thành chuỗi. Do đó, bất kỳ đối tượng nào cũng có thể được sử dụng – miễn là nó trở thành một URL hợp lệ khi được ép thành chuỗi

C:\TESTDIR
├─ readme.txt
├─ lv1-image
│  ├─ magictexture.png
│  └─ emptyDir  <= Empty Directory
└─lv2-prog
   ├─ 3dgame.js
   ├─ main.js
   └─ package-database
       └─ index.js
36

Điều đó cho phép chúng tôi giải quyết các tham chiếu tương đối đối với các trường hợp

import * as assert from 'node:assert/strict';
623

C:\TESTDIR
├─ readme.txt
├─ lv1-image
│  ├─ magictexture.png
│  └─ emptyDir  <= Empty Directory
└─lv2-prog
   ├─ 3dgame.js
   ├─ main.js
   └─ package-database
       └─ index.js
37

Được sử dụng theo cách này, hàm tạo tương tự như

import * as assert from 'node:assert/strict';
26

Thuộc tính của phiên bản
import * as assert from 'node:assert/strict';
623

Các trường hợp của

import * as assert from 'node:assert/strict';
623 có các thuộc tính sau

C:\TESTDIR
├─ readme.txt
├─ lv1-image
│  ├─ magictexture.png
│  └─ emptyDir  <= Empty Directory
└─lv2-prog
   ├─ 3dgame.js
   ├─ main.js
   └─ package-database
       └─ index.js
38

Chuyển đổi URL thành chuỗi

Có ba cách phổ biến để chúng tôi có thể chuyển đổi URL thành chuỗi

C:\TESTDIR
├─ readme.txt
├─ lv1-image
│  ├─ magictexture.png
│  └─ emptyDir  <= Empty Directory
└─lv2-prog
   ├─ 3dgame.js
   ├─ main.js
   └─ package-database
       └─ index.js
39

Phương pháp

import * as assert from 'node:assert/strict';
645 cho phép chúng tôi sử dụng URL trong dữ liệu JSON

C:\TESTDIR
├─ readme.txt
├─ lv1-image
│  ├─ magictexture.png
│  └─ emptyDir  <= Empty Directory
└─lv2-prog
   ├─ 3dgame.js
   ├─ main.js
   └─ package-database
       └─ index.js
50

Nhận thuộc tính
import * as assert from 'node:assert/strict';
623

Thuộc tính của phiên bản

import * as assert from 'node:assert/strict';
623 không phải là thuộc tính dữ liệu riêng, chúng được triển khai thông qua getters và setters. Trong ví dụ tiếp theo, chúng tôi sử dụng hàm tiện ích
import * as assert from 'node:assert/strict';
648 (có mã được hiển thị ở cuối), để sao chép các giá trị được trả về bởi các getter đó vào một đối tượng đơn giản

C:\TESTDIR
├─ readme.txt
├─ lv1-image
│  ├─ magictexture.png
│  └─ emptyDir  <= Empty Directory
└─lv2-prog
   ├─ 3dgame.js
   ├─ main.js
   └─ package-database
       └─ index.js
51

Than ôi, tên đường dẫn là một đơn vị nguyên tử. Nghĩa là, chúng ta không thể sử dụng lớp

import * as assert from 'node:assert/strict';
623 để truy cập các phần của nó (cơ sở, phần mở rộng, v.v. )

Đặt các phần của URL

Chúng tôi cũng có thể thay đổi các phần của URL bằng cách đặt các thuộc tính như

import * as assert from 'node:assert/strict';
650

C:\TESTDIR
├─ readme.txt
├─ lv1-image
│  ├─ magictexture.png
│  └─ emptyDir  <= Empty Directory
└─lv2-prog
   ├─ 3dgame.js
   ├─ main.js
   └─ package-database
       └─ index.js
52

Chúng ta có thể sử dụng setters để tạo URL từ các phần (ý tưởng của Haroen Viaene)

Quản lý tham số tìm kiếm qua
import * as assert from 'node:assert/strict';
651

Chúng tôi có thể sử dụng thuộc tính

import * as assert from 'node:assert/strict';
651 để quản lý các tham số tìm kiếm của URL. Giá trị của nó là một thể hiện của

Chúng ta có thể sử dụng nó để đọc các tham số tìm kiếm

C:\TESTDIR
├─ readme.txt
├─ lv1-image
│  ├─ magictexture.png
│  └─ emptyDir  <= Empty Directory
└─lv2-prog
   ├─ 3dgame.js
   ├─ main.js
   └─ package-database
       └─ index.js
53

Chúng tôi cũng có thể thay đổi các tham số tìm kiếm thông qua nó

C:\TESTDIR
├─ readme.txt
├─ lv1-image
│  ├─ magictexture.png
│  └─ emptyDir  <= Empty Directory
└─lv2-prog
   ├─ 3dgame.js
   ├─ main.js
   └─ package-database
       └─ index.js
54

Chuyển đổi giữa các URL và đường dẫn tệp

Thật hấp dẫn khi chuyển đổi giữa các đường dẫn tệp và URL theo cách thủ công. Ví dụ: chúng tôi có thể cố gắng chuyển đổi một phiên bản

import * as assert from 'node:assert/strict';
623
import * as assert from 'node:assert/strict';
655 thành đường dẫn tệp qua
import * as assert from 'node:assert/strict';
656. Tuy nhiên, điều đó không phải lúc nào cũng hiệu quả – tốt hơn là sử dụng

C:\TESTDIR
├─ readme.txt
├─ lv1-image
│  ├─ magictexture.png
│  └─ emptyDir  <= Empty Directory
└─lv2-prog
   ├─ 3dgame.js
   ├─ main.js
   └─ package-database
       └─ index.js
55

Đoạn mã sau so sánh kết quả của hàm đó với các giá trị của

import * as assert from 'node:assert/strict';
657

là nghịch đảo của

import * as assert from 'node:assert/strict';
658

C:\TESTDIR
├─ readme.txt
├─ lv1-image
│  ├─ magictexture.png
│  └─ emptyDir  <= Empty Directory
└─lv2-prog
   ├─ 3dgame.js
   ├─ main.js
   └─ package-database
       └─ index.js
56

Nó chuyển đổi

import * as assert from 'node:assert/strict';
07 thành URL tệp

C:\TESTDIR
├─ readme.txt
├─ lv1-image
│  ├─ magictexture.png
│  └─ emptyDir  <= Empty Directory
└─lv2-prog
   ├─ 3dgame.js
   ├─ main.js
   └─ package-database
       └─ index.js
57

Trường hợp sử dụng cho URL. truy cập các tệp liên quan đến mô-đun hiện tại

Một trường hợp sử dụng quan trọng đối với URL là truy cập tệp là anh chị em của mô-đun hiện tại

C:\TESTDIR
├─ readme.txt
├─ lv1-image
│  ├─ magictexture.png
│  └─ emptyDir  <= Empty Directory
└─lv2-prog
   ├─ 3dgame.js
   ├─ main.js
   └─ package-database
       └─ index.js
58

Hàm này sử dụng chứa URL của mô-đun hiện tại (thường là URL

import * as assert from 'node:assert/strict';
622 trên Nút. js)

Sử dụng

import * as assert from 'node:assert/strict';
662 sẽ làm cho mã trước đó đa nền tảng hơn. Tuy nhiên, kể từ Node. js 18. 5,
import * as assert from 'node:assert/strict';
662 chưa hoạt động đối với URL
import * as assert from 'node:assert/strict';
622

C:\TESTDIR
├─ readme.txt
├─ lv1-image
│  ├─ magictexture.png
│  └─ emptyDir  <= Empty Directory
└─lv2-prog
   ├─ 3dgame.js
   ├─ main.js
   └─ package-database
       └─ index.js
59

Trường hợp sử dụng cho URL. phát hiện xem mô-đun hiện tại có đang chạy dưới dạng tập lệnh không

Xem bài đăng trên blog “Nút. js. kiểm tra xem mô-đun ESM có phải là 'chính' hay không"

Đường dẫn so với. import * as assert from 'node:assert/strict'; 622 URL

Khi tập lệnh shell nhận tham chiếu đến tệp hoặc xuất tham chiếu đến tệp (e. g. bằng cách đăng nhập chúng trên màn hình), chúng hầu như luôn luôn là các đường dẫn. Tuy nhiên, có hai trường hợp chúng tôi cần URL (như đã thảo luận trong các tiểu mục trước)

Làm cách nào để có được đường dẫn tệp đầy đủ trong NodeJS?

Chúng ta có thể lấy đường dẫn của tập lệnh hiện tại trong nút. js bằng cách sử dụng các biến phạm vi mô-đun __dirname và __filename . __tên thư mục. Nó trả về tên thư mục của mô-đun hiện tại chứa tập lệnh hiện tại. __tên tệp. Nó trả về tên tệp của mô-đun hiện tại.

Làm cách nào để tìm đường dẫn tuyệt đối của tệp trong js?

đường dẫn. abspath() trả về đường dẫn tuyệt đối.

Làm cách nào để có được đường dẫn tương đối trong JavaScript?

Đường dẫn . Phương thức relative() được sử dụng để tìm đường dẫn tương đối từ một đường dẫn đã cho đến một đường dẫn khác dựa trên thư mục làm việc hiện tại. Nếu cả hai đường dẫn đã cho đều giống nhau, nó sẽ phân giải thành một chuỗi có độ dài bằng không.

Làm cách nào để có được đường dẫn thư mục hiện tại trong JavaScript?

cửa sổ. địa điểm. tên đường dẫn trả về đường dẫn và tên tệp của trang hiện tại.