ネットワーク上のファイルで __dirname が正しく取れない
◆ file スキームでサーバ名があると __dirname は共有名以降の相対パス
Electron アプリを共有フォルダ上に置いて実行していたら予想外のエラーが置きました
__dirname で絶対パスが取得できません
ファイル自身は
のような file スキームのファイルになります
このファイル上で __dirname を使うと
が取得できます
サーバ名の部分が消えて共有名以降だけになってます
相対パスになるので __dirname を使った join でファイル名を作って
のようなことをしてると予想外の場所に書き込まれます
起動は package.json と同じフォルダにある bat ファイルから行ったのですが コマンドプロンプトがドライブレターなしのパスに移動できないからかカレントディレクトリは
になっていました
bat は単純にこんなものです
そのせいもあって書き込み先は C:\Windows\hdd\data\略 になっていました
親フォルダがなければ作るという処理も入っていたのですが 一般ユーザ権限だったので権限不足で書き込み失敗エラーになりました
管理者権限でファイルパスによっては最悪 C:\Windows のファイルが壊れていた可能性もあるので怖いですね
念の為 絶対パスかの確認処理を入れておいたほうが安心かもしれません
__dirname で絶対パスが取得できません
ファイル自身は
file://server/hdd/data/programs/apps/electron/test/index.html
のような file スキームのファイルになります
このファイル上で __dirname を使うと
hdd\data\programs\apps\electron\test
が取得できます
サーバ名の部分が消えて共有名以降だけになってます
相対パスになるので __dirname を使った join でファイル名を作って
fs.writeFileSync(path.join(__dirname, "output.txt"), "data")
のようなことをしてると予想外の場所に書き込まれます
起動は package.json と同じフォルダにある bat ファイルから行ったのですが コマンドプロンプトがドライブレターなしのパスに移動できないからかカレントディレクトリは
C:\Windows
になっていました
bat は単純にこんなものです
start C:\data\programs\electron5\electron.exe %~dp0
そのせいもあって書き込み先は C:\Windows\hdd\data\略 になっていました
親フォルダがなければ作るという処理も入っていたのですが 一般ユーザ権限だったので権限不足で書き込み失敗エラーになりました
管理者権限でファイルパスによっては最悪 C:\Windows のファイルが壊れていた可能性もあるので怖いですね
念の為 絶対パスかの確認処理を入れておいたほうが安心かもしれません
path.isAbsolute(__dirname)