1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Denoの相対パスの注意点

Posted at

Denoではファイルを読み込むためには、Deno.readTextFileまたはDeno.readTextFileSyncを使います。
当然、読み込むファイルのパスを指定しなければなりません。
Deno.readTextFile("path_to_file")

文章を読む関数が実行されるTSファイルにある場合は、問題がありませんが、文章を読む関数を再利用しようと思って、その関数を別のTSファイルにインポートすると、パスのエラーが発生します。

例えば、こういうフォルダー構成があるとしましょう。

- read.ts // 文章を読み込む関数が入っているTSファイル
- data.json // 文章、ここではJSONデータ
- folder/processor.ts // 文章を読み込む関数をインポートするTSファイル
//read.ts
const dataFilePath ="./data.json"
export function readData(){
let dataToReturn=JSON.parse(Deno.readTextFileSync(dataFilePath));
return dataToReturn
}
//processor.ts
import {readData} from "../read.ts"
console.log(readData())

processor.tsからreadTextFileSyncを起動すると、「指定された
パスが見つかりません。 (os error 2)」というエラーが発生します。

そのエラーの原因はDenoがパスを取り扱う方法にあります。
Denoはパスを実行されたファイルから読み解いていきます。
read.tsをインポートして、パスが"./data.json"になっていると思うかもしれませんが、
実行のフォルダーが"folder"なので、ルートフォルダーが"folder"になってしまいます。
すなわち、processor.tsからreadTextFileSyncが起動されると、
パスは"./data.json"ではなくて、"folder/data.json"になってしまいます。

この問題を解決するためには、import.meta.urlを使います。
import.meta.urlを使って、本当のルートフォルダーを特定できます。
パスをよく扱う場合は、個別のモージュルにまとめると便利です。
ここでは、absolutePath.tsのモージュルにします。

- absolutePath.ts
- read.ts
- data.json
- folder/processor.ts
//absolutePath.ts
import { path } from "https://deno.land/std/path/mod.ts";
const dir = path.dirname(import.meta.url);
export function absolutePath(relativePath: string): string {
  return path.fromFileUrl(path.join(dir, relativePath));
}

absolutePath.tsではルートとなるフォルダー名を取得します。その後で、ルートのフォルダーに相対的なパスをくっつけて、絶対的なパスを作ります。
パスの操作のためには、Deno.landからPathのモージュルをインポートします。

続いて、absolutePath.tsをread.tsにインポートします。

//read.ts
import {absolutePath} from "./absolutePath.ts"
const dataFilePath ="./data.json"
export function readData(){
let dataToReturn=JSON.parse(Deno.readTextFileSync(dataFilePath));
return dataToReturn
}

最後に、readTextFileSyncのパスをabsolutePathで包みます。

//read.ts
import {absolutePath} from "./absolutePath.ts"
const dataFilePath ="./data.json"
export function readData(){
let dataToReturn=JSON.parse(Deno.readTextFileSync(absolutePath(dataFilePath)));
return dataToReturn
}

そうすると、read.tsをサブフォルダーのファイルにインポートしても、パスが正しく解消されます。

ここでは、readTextFileSyncだけを取り上げましたが、ファイルシステムの他の操作を行う時にも起こります。
Denoは実行されるファイルが置かれているフォルダーをルートフォルダーにしていると覚えると、絶対パスを利用することでOSエラーが回避できます。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?