Tôi dường như không thể nhận được bất kỳ kết quả tìm kiếm nào giải thích cách làm điều này.
Tất cả những gì tôi muốn làm là có thể biết liệu một đường dẫn cụ thể là một tệp hoặc một thư mục (thư mục).
Tôi dường như không thể nhận được bất kỳ kết quả tìm kiếm nào giải thích cách làm điều này.
Tất cả những gì tôi muốn làm là có thể biết liệu một đường dẫn cụ thể là một tệp hoặc một thư mục (thư mục).
Câu trả lời:
fs.lstatSync(path_string).isDirectory()
nên nói với bạn Từ các tài liệu :
Các đối tượng được trả về từ fs.stat () và fs.lstat () thuộc loại này.
stats.isFile() stats.isDirectory() stats.isBlockDevice() stats.isCharacterDevice() stats.isSymbolicLink() (only valid with fs.lstat()) stats.isFIFO() stats.isSocket()
Các giải pháp trên sẽ throw
một Error
nếu; cho ex, các file
hoặc directory
không tồn tại.
Nếu bạn muốn một true
hoặc false
tiếp cận, hãy thử fs.existsSync(dirPath) && fs.lstatSync(dirPath).isDirectory();
như được đề cập bởi Joseph trong các ý kiến dưới đây.
let isDirExists = fs.existsSync(dirPath) && fs.lstatSync(dirPath).isDirectory();
Chúng tôi có thể sử dụng API fs.promises mới
const fs = require('fs').promises;
(async() => {
const stat = await fs.lstat('test.txt');
console.log(stat.isFile());
})().catch(console.error)
Đây là cách bạn sẽ phát hiện nếu một đường dẫn là một tệp hoặc một thư mục không đồng bộ , đó là cách tiếp cận được đề xuất trong nút. sử dụng fs.lstat
const fs = require("fs");
let path = "/path/to/something";
fs.lstat(path, (err, stats) => {
if(err)
return console.log(err); //Handle error
console.log(`Is file: ${stats.isFile()}`);
console.log(`Is directory: ${stats.isDirectory()}`);
console.log(`Is symbolic link: ${stats.isSymbolicLink()}`);
console.log(`Is FIFO: ${stats.isFIFO()}`);
console.log(`Is socket: ${stats.isSocket()}`);
console.log(`Is character device: ${stats.isCharacterDevice()}`);
console.log(`Is block device: ${stats.isBlockDevice()}`);
});
Lưu ý khi sử dụng API đồng bộ:
Khi sử dụng hình thức đồng bộ, mọi ngoại lệ sẽ được đưa ra ngay lập tức. Bạn có thể sử dụng thử / bắt để xử lý các trường hợp ngoại lệ hoặc cho phép chúng nổi bong bóng.
try{
fs.lstatSync("/some/path").isDirectory()
}catch(e){
// Handle error
if(e.code == 'ENOENT'){
//no such file or directory
//do something
}else {
//do something else
}
}
Tùy thuộc vào nhu cầu của bạn, có lẽ bạn có thể dựa vào path
mô-đun của nút .
Bạn có thể không thể truy cập hệ thống tệp (ví dụ: tệp chưa được tạo) và bạn có thể muốn tránh nhấn hệ thống tệp trừ khi bạn thực sự cần xác thực thêm. Nếu bạn có thể đưa ra giả định rằng những gì bạn đang kiểm tra .<extname>
định dạng sau , chỉ cần nhìn vào tên.
Rõ ràng nếu bạn đang tìm kiếm một tệp không có tên mở rộng, bạn sẽ cần phải nhấn hệ thống tệp để chắc chắn. Nhưng giữ cho nó đơn giản cho đến khi bạn cần phức tạp hơn.
const path = require('path');
function isFile(pathItem) {
return !!path.extname(pathItem);
}
Các câu trả lời ở trên kiểm tra xem một hệ thống tập tin có chứa một đường dẫn là một tập tin hoặc thư mục. Nhưng nó không xác định nếu một đường dẫn nhất định là một tệp hoặc thư mục.
Câu trả lời là xác định các đường dẫn dựa trên thư mục bằng cách sử dụng "/." như -> "/ c / dos / run /." <- thời gian kéo dài.
Giống như một đường dẫn của một thư mục hoặc tập tin chưa được viết. Hoặc một đường dẫn từ một máy tính khác. Hoặc một đường dẫn tồn tại cả tệp và thư mục cùng tên.
// /tmp/
// |- dozen.path
// |- dozen.path/.
// |- eggs.txt
//
// "/tmp/dozen.path" !== "/tmp/dozen.path/"
//
// Very few fs allow this. But still. Don't trust the filesystem alone!
// Converts the non-standard "path-ends-in-slash" to the standard "path-is-identified-by current "." or previous ".." directory symbol.
function tryGetPath(pathItem) {
const isPosix = pathItem.includes("/");
if ((isPosix && pathItem.endsWith("/")) ||
(!isPosix && pathItem.endsWith("\\"))) {
pathItem = pathItem + ".";
}
return pathItem;
}
// If a path ends with a current directory identifier, it is a path! /c/dos/run/. and c:\dos\run\.
function isDirectory(pathItem) {
const isPosix = pathItem.includes("/");
if (pathItem === "." || pathItem ==- "..") {
pathItem = (isPosix ? "./" : ".\\") + pathItem;
}
return (isPosix ? pathItem.endsWith("/.") || pathItem.endsWith("/..") : pathItem.endsWith("\\.") || pathItem.endsWith("\\.."));
}
// If a path is not a directory, and it isn't empty, it must be a file
function isFile(pathItem) {
if (pathItem === "") {
return false;
}
return !isDirectory(pathItem);
}
Phiên bản nút: v11.10.0 - Tháng 2 năm 2019
Suy nghĩ cuối cùng: Tại sao thậm chí nhấn hệ thống tập tin?
Đây là một chức năng mà tôi sử dụng. Không ai đang sử dụng promisify
và await/async
tính năng trong bài viết này vì vậy tôi nghĩ rằng tôi sẽ chia sẻ.
const promisify = require('util').promisify;
const lstat = promisify(require('fs').lstat);
async function isDirectory (path) {
try {
return (await lstat(path)).isDirectory();
}
catch (e) {
return false;
}
}
Lưu ý: Tôi không sử dụng require('fs').promises;
vì nó đã được thử nghiệm trong một năm nay, tốt hơn là không nên dựa vào nó.