Как можно проверить, существует ли файл или каталог с помощью Deno?
Среда выполнения Deno TypeScript имеет встроенные функции, но ни одна из них не предназначена для проверки существования файла или каталога. Как можно проверить, существует ли файл или каталог?
5 ответов
Не существует функции, специально предназначенной для проверки существования файла или каталога, но Deno.stat
Функция, которая возвращает метаданные о пути, может быть использована для этой цели путем проверки потенциальных ошибок Deno.ErrorKind.NotFound
,
const exists = async (filename: string): Promise<boolean> => {
try {
await Deno.stat(filename);
// successful, file or directory must exist
return true;
} catch (error) {
if (error && error.kind === Deno.ErrorKind.NotFound) {
// file or directory does not exist
return false;
} else {
// unexpected error, maybe permissions, pass it along
throw error;
}
}
};
exists("test.ts").then(result =>
console.log("does it exist?", result)); // true
exists("not-exist").then(result =>
console.log("does it exist?", result)); // false
Здесь также есть реализация стандартной библиотеки https://deno.land/std/fs/mod.ts
import {existsSync } from "https://deno.land/std/fs/mod.ts";
const isPathExist = existsSync(filePath)
console.log(isPathExist)
этот код напечатает истину, если путь существует, и ложь, если нет.
и это реализация async
import {exists} from "https://deno.land/std/fs/mod.ts"
exists(filePath).then((result : boolean) => console.log(result))
убедитесь, что вы запускаете NAME с флагом нестабильности и предоставляете доступ к этому файлу вашей программе, например,
deno run --unstable --allow-read={filePath} index.ts
API Deno изменился с момента выпуска Deno 1.0.0
. Если файл не найден, возникает исключение.Deno.errors.NotFound
const exists = async (filename: string): Promise<boolean> => {
try {
await Deno.stat(filename);
// successful, file or directory must exist
return true;
} catch (error) {
if (error instanceof Deno.errors.NotFound) {
// file or directory does not exist
return false;
} else {
// unexpected error, maybe permissions, pass it along
throw error;
}
}
};
exists("test.ts").then(result =>
console.log("does it exist?", result)); // true
exists("not-exist").then(result =>
console.log("does it exist?", result)); // false
Поскольку учетная запись исходного ответа приостановлена и не может изменить его ответ, если я прокомментирую его, я повторно отправляю фиксированный фрагмент кода.
Устаревание было отменено в версии 0.182.0, поскольку существует слишком много допустимых вариантов использования, однако вам следует избегать этого, насколько это возможно, поскольку это потенциально может вызвать состояние гонки в вашем коде, то есть ваш файл или каталог должен быть ограничен третье лицо после проверки его существования, поскольку не заблокирует файл или каталог.
Например: если вы хотите удалить файл, только если он существует, вместо этого:
import { exists } from "https://deno.land/std/fs/mod.ts";
if (await exists("./foo")) {
await Deno.remove("./foo",);
}
Вам лучше сделать:
try {
await Deno.remove("./foo");
} catch (error) {
if (!(error instanceof Deno.errors.NotFound)) {
throw error;
}
// Do nothing...
}
То же самое касается редактирования файлов. Если вы собираетесь работать со своим файлом, просто попробуйте открыть/отредактировать его и поймать исключение.
Однако существуют допустимые варианты использования, такие как проверка существования файла или каталога для стороннего инструмента и пропуск запуска инструмента, если он отсутствует. Это может быть очень удобно, если запуск инструмента требует больших затрат или не выдает правильное сообщение об ошибке на неправильном пути.
Но с первым были проблемы:
- Во-первых, была ловушка, в которой вы должны были проверить каталог и вернуться
true
, но в месте назначения был найден файл с тем же именем, что привело к последующим ошибкам. - Во-вторых, вернулся бы
false
если файл не может быть прочитан только в Windows, но не в системах POSIX , поскольку его базовый вызов все равно будет успешным в системах POSIX, несмотря на то, что путь не доступен для чтения пользователем.
Новая реализация решает все эти проблемы и предоставляет опции, которые вам обязательно стоит использовать, если вам действительно нужно:
import { exists } from "https://deno.land/std/fs/mod.ts";
const fooDirExistsAndIsReadable = await exists("./foo", {
isReadable: true, // check if foo can be read on POSIX and Windows
isDirectory: true // check if foo is a directory
});
const barFileExistsAndIsReadable = await exists("./bar", {
isReadable: true, // check if bar can be read on POSIX and Windows
isFile: true // check if bar is a file
});
Помимо этого, вы все равно можете использовать реализацию, как и раньше:
const foobarExists = await exists("./foobar");
Важно знать, чтоexists
используетstat
вместоlstat
now, что означает, что теперь он следует по символическим ссылкам, чтобы параметры работали должным образом.
Отказ от ответственности: я предоставил реализацию Deno после довольно долгого обсуждения с долгими размышлениями между всеми сторонами. Я рад, что в конце концов мы это сделали.
В exists
функция фактически является частью модуля std/fs, хотя в настоящее время она помечена как нестабильная. Это означает, что вам нужноdeno run --unstable
: https://deno.land/std/fs/README.md