Я не могу получить результаты поиска, которые объясняют, как это сделать.
Все, что я хочу сделать, это знать, является ли данный путь файлом или каталогом (папкой).
Я не могу получить результаты поиска, которые объясняют, как это сделать.
Все, что я хочу сделать, это знать, является ли данный путь файлом или каталогом (папкой).
Ответы:
fs.lstatSync(path_string).isDirectory()
должен сказать вам. Из документов :
Объекты, возвращаемые из fs.stat () и fs.lstat (), относятся к этому типу.
stats.isFile() stats.isDirectory() stats.isBlockDevice() stats.isCharacterDevice() stats.isSymbolicLink() (only valid with fs.lstat()) stats.isFIFO() stats.isSocket()
Выше решение будет если; Например, или не существует.throw
Error
file
directory
Если вы хотите true
или false
подход, попробуйте, fs.existsSync(dirPath) && fs.lstatSync(dirPath).isDirectory();
как упоминал Джозеф в комментариях ниже.
let isDirExists = fs.existsSync(dirPath) && fs.lstatSync(dirPath).isDirectory();
Мы можем использовать новый API fs.promises.
const fs = require('fs').promises;
(async() => {
const stat = await fs.lstat('test.txt');
console.log(stat.isFile());
})().catch(console.error)
Вот как вы можете определить, является ли путь асинхронным файлом или каталогом , что является рекомендуемым подходом для узла. используя 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()}`);
});
Обратите внимание при использовании синхронного API:
При использовании синхронной формы любые исключения сразу выдаются. Вы можете использовать try / catch для обработки исключений или для их разрешения.
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
}
}
В зависимости от ваших потребностей, вы можете полагаться на path
модуль .
Возможно, вам не удастся поразить файловую систему (например, файл еще не создан) и, возможно, вы захотите избежать попадания в файловую систему, если вам действительно не нужна дополнительная проверка. Если вы можете сделать предположение, что то, что вы проверяете, следует .<extname>
формату, просто посмотрите на название.
Очевидно, что если вы ищете файл без extname, вам нужно будет поразить файловую систему, чтобы быть уверенным. Но будьте проще, пока вам не понадобятся более сложные.
const path = require('path');
function isFile(pathItem) {
return !!path.extname(pathItem);
}
Ответы выше проверяют, содержит ли файловая система путь к файлу или каталогу. Но он не определяет, является ли данный путь одним файлом или каталогом.
Ответ заключается в том, чтобы определить пути на основе каталогов, используя «/». как -> "/ c / dos / run /." <- завершающий период.
Как путь к каталогу или файлу, который еще не был записан. Или путь с другого компьютера. Или путь, где существует файл и каталог с одинаковым именем.
// /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);
}
Версия узла: v11.10.0 - февраль 2019
Последняя мысль: зачем вообще попадать в файловую систему?
Вот функция, которую я использую. Никто не использует promisify
и не await/async
использует эту функцию в этом посте, поэтому я решил поделиться.
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;
}
}
Примечание: я не использую, require('fs').promises;
потому что это экспериментально в течение одного года, лучше не полагаться на это.