NodeJS fs.open 在现有文件上失败(不是路径问题)

Posted

技术标签:

【中文标题】NodeJS fs.open 在现有文件上失败(不是路径问题)【英文标题】:NodeJS fs.open failing on existing file (not a path issue) 【发布时间】:2012-02-26 10:36:16 【问题描述】:

我已经处理这个问题很长时间了,因此非常感谢任何帮助。所以,我正在下载一个文件并使用 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 存在于目录中,但打开失败。

简单的代码sn-p在这里:

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

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

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

在此之前和之后还有很多事情要做,但这些都不重要,因为这个基本功能失败了。请帮忙!这已经困扰了好几个星期了。

【问题讨论】:

嗯。你检查权限了吗?另外,像这样运行 node.js: strace ./node - 这将跟踪所有系统调用,并且您正在寻找一个 open(),检查节点正在使用的路径等。这将告诉您节点进程实际上是什么做。 @EdH。对于权限是的。所有文件都具有相同的权限:-rw-r--r-- 1 Home staff 216102 Feb 3 15:00 bdTcK6hSdownload.csv 还值得注意的是,如果我重新启动节点,我可以毫无问题地访问该文件。 @EdH.Hmm,由于某种原因,我无法在 strace 模式下运行:mac:dev Home$ strace -fF -o strace.log node app.js -bash: strace: command not found - 不知道我用那个命令做错了什么 您运行的是最新版本的节点吗?你检查过问题队列吗? ENOENT 有很多 Windows 问题,尽管现在大多数都已关闭。 github.com/joyent/node/issues/search?q=ENOENT @loganfsmyth 是的,我在 OS X Lion 上运行 Node 0.6.7。我应该把它添加到问题中。 【参考方案1】:

我的猜测是当前工作目录存在差异。您是否从同一目录启动 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);

【讨论】:

感谢周到的答案和示例,但您可以从我发布的代码中看到它们返回相同的目录。 caspertemp 位于 root 中,但工作目录位于 node_modules 中。例如,如果我使用您的代码并删除 __dirname 变量,我会得到:/Users/Home/dev/caspertemp/pwAA3Kzzdownload.csv ENOENT, no such file or directory '/Users/Home/dev/caspertemp/pwAA3Kzzdownload .csv【参考方案2】:

另一种可能性是时机。

我过去曾遇到过这样的情况,即文件条目立即出现在文件夹中,但该文件无法使用,因为写入它的内容尚未完成或尚未释放它的句柄。在这种情况下,需要推迟处理或进行一些其他检查以查看事情是否准备就绪是很正常的。

在这些情况下,重启可能会“修复”问题,但这只是因为它的副作用是释放句柄或延迟处理,因此当您的代码再次尝试时一切正常。

【讨论】:

【参考方案3】:

仅当您提供错误的路径时才会发生这种情况。我遇到了同样的问题。

最初我直接运行文件节点 xyz.js 并且所需的静态文件在同一个存储库中。但是当我执行 npm start 时,代码会抛出错误:

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

然后我移动了静态资源,重命名了路径并且它起作用了。希望这对您有所帮助。

【讨论】:

【参考方案4】:

文件扩展名可以输入两次,因此找不到。使用命令提示符导航到文件目录并获取该目录中的文件列表

命令:

dir

ls

在那里获取实际的文件名并使用它。在我的例子中,我将一个文本文档保存为“readMe.txt”,在命令提示符下它显示为“readMe.txt.txt”。保存时我不必附加文件扩展名,这造成了问题。

【讨论】:

以上是关于NodeJS fs.open 在现有文件上失败(不是路径问题)的主要内容,如果未能解决你的问题,请参考以下文章

nodejs——避免判断创建多级目录

nodejs 文件系统

nodeJs文件系统(fs)与流(stream)

nodejs模块——fs模块 使用fs.write读文件

nodejs文件操作模块FS(File System)常用函数简明总结

Windows std::fstream 在 open() 之后修改文件?