Denoではファイルを読み込むためには、Deno.readTextFileまたはDeno.readTextFileSyncを使います。
当然、読み込むファイルのパスを指定しなければなりません。
Deno.readTextFile("path_to_file")
文章を読む関数が実行されるTSファイルにある場合は、問題がありませんが、文章を読む関数を再利用しようと思って、その関数を別のTSファイルにインポートすると、パスのエラーが発生します。
例えば、こういうフォルダー構成があるとしましょう。
- read.ts // 文章を読み込む関数が入っているTSファイル
- data.json // 文章、ここではJSONデータ
- folder/processor.ts // 文章を読み込む関数をインポートするTSファイル
const dataFilePath ="./data.json"
export function readData(){
let dataToReturn=JSON.parse(Deno.readTextFileSync(dataFilePath));
return dataToReturn
}
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
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にインポートします。
import {absolutePath} from "./absolutePath.ts"
const dataFilePath ="./data.json"
export function readData(){
let dataToReturn=JSON.parse(Deno.readTextFileSync(dataFilePath));
return dataToReturn
}
最後に、readTextFileSyncのパスをabsolutePathで包みます。
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エラーが回避できます。