Как можно проверить, существует ли файл или каталог с помощью 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вместоlstatnow, что означает, что теперь он следует по символическим ссылкам, чтобы параметры работали должным образом.

Отказ от ответственности: я предоставил реализацию Deno после довольно долгого обсуждения с долгими размышлениями между всеми сторонами. Я рад, что в конце концов мы это сделали.

В existsфункция фактически является частью модуля std/fs, хотя в настоящее время она помечена как нестабильная. Это означает, что вам нужноdeno run --unstable: https://deno.land/std/fs/README.md

Другие вопросы по тегам