web-dev-qa-db-ja.com

NodeJS fs.openが既存のファイルで失敗する(パスの問題ではない)

私は長い間これに取り組んできましたので、どんな助けでも大歓迎です。そのため、ファイルをダウンロードして、PhantomJSとCasperJSを使用して保存しています。それらは問題ではないことを指摘させてください。ファイルは問題なくダウンロードされます。

問題は、ダウンロード後にNodeJSがファイルを認識または開かないことです。 fs.stat、fs.openなどができません。何も機能しません。

すぐにコードを共有しますが、ログは次のとおりです。

Here: bdTcK6hSdownload.csv

[ '2puzZMeLdownload.csv',
  '2s5ICbKNdownload.csv',
  'bdTcK6hSdownload.csv',
  'izIfagwCdownload.csv' ]

fs.js:230

return binding.open(pathModule._makeLong(path), stringToFlags(flags), mode);

Error: ENOENT, no such file or directory './caspertemp/bdTcK6hSdownload.csv'

at Object.openSync (fs.js:230:18)
at Object.processCSV (/Users/Home/dev/node_modules/inviter/index.js:64:29)
at /Users/Home/dev/node_modules/inviter/index.js:36:33
at ChildProcess.exithandler (child_process.js:281:7)
at ChildProcess.emit (events.js:70:17)
at maybeExit (child_process.js:361:16)
at Process.onexit (child_process.js:397:5)

ご覧のとおり、作成したファイル名を出力し、ディレクトリの内容を出力して、ファイルを開こうとしています。ご覧のとおり、bdTcK6hSdownload.csvはディレクトリに存在しますが、開くと失敗します。

簡単なコードスニペットは次のとおりです。

console.log('Here: ' + filename);

filenames = fs.readdirSync('./caspertemp/');
console.log(filenames);

var fd = fs.openSync('./caspertemp/' + filename, 'r');
console.log(fd);

この前後にはさらに多くのことが起こっていますが、この基本的な機能が失敗するため、問題はありません。助けてください!これは何週間もしつこいです。

13
Brandon

私の推測では、それは現在の作業ディレクトリの不一致です。 casperJSプロセスとnode.jsプロセスを同じディレクトリから開始していますか?それらのいずれかが実行時に作業ディレクトリを変更しますか?このようなものを試してください。ノードの__dirnameは、現在実行中の.jsファイルのディレクトリパスを示します。

var path = require("path");
var filename = "bdTcK6hSdownload.csv";
var csvPath = path.resolve(path.join(__dirname, "caspertemp", filename));
console.log(csvPath);
3
Peter Lyons

これは、間違ったパスを指定している場合にのみ発生します。私は同じ問題に遭遇しました。

最初はファイルをノードxyz.jsで直接実行していましたが、必要な静的ファイルは同じリポジトリにあります。しかし、npm startを実行すると、コードが上記のエラーをスローしていました:

    fs.js 495 
    return binding.open(pathModule._makeLong(path), stringToFlags(flags), mode);
    **Error: ENOENT, no such file or directory**

次に、静的リソースを移動し、パスの名前を変更すると、機能しました。これがお役に立てば幸いです。

0
atul

ファイル拡張子を2回入力できたため、見つかりませんでした。コマンドプロンプトでファイルディレクトリに移動し、そのディレクトリ内のファイルのリストを取得します

コマンド:

dir

または

ls

そこで実際のファイル名を取得して使用します。私の場合、テキストドキュメントを「readMe.txt」として保存し、コマンドプロンプトで「readMe.txt.txt」と表示されました。保存時にファイル拡張子を追加する必要がなかったため、問題が発生しました。

0
ndheti

別の可能性はタイミングです。

過去に、ファイルエントリがフォルダにすぐに表示されるという状況がありましたが、ファイルの書き込みが完了していないか、ハンドルがまだ解放されていないため、ファイルを使用できません。このような状況では、処理を延期するか、準備ができているかどうかを確認するために他のチェックを行う必要があることは珍しくありません。

そのような場合、再起動によって「修正」される可能性がありますが、副作用としてハンドルが解放されるか、処理が遅れるため、コードを再試行しても問題はありません。

0
K Cartlidge