我在我的项目中看到一个奇怪的问题,即perl看不到文件,尽管它存在于磁盘中。我们通过perl运行一系列简短的后端工作(每个工作跨越10秒)。后端作业写一个输出文件并退出,稍后perl进程会尝试传输它。该作业最初运行正常,并且突然无法检测到后端写入的文件。调试perl代码(来自http://www.cpan.org/src/的5.10.1),我发现stati64(win32.c中的win32_stat)失败并返回-1。重试时,通话似乎工作正常。我可以保证后端进程不涉及竞争条件,因为我们只在后端退出后尝试访问perl中的文件。
有没有人知道条件(在短期工作中递归使用时)stat(或stati64)可以说文件缺席虽然文件存在于Windows中?它是否缓存先前执行的结果以进行优化?
答案 0 :(得分:1)
如果您可以重现该问题,请使用SysInternals Process Monitor(或已弃用但更易于使用的Filemon)查看正在发生的情况。
一个可能的原因是某些其他应用程序(例如防病毒程序或索引引擎)已锁定该文件,但Procmon应显示stat
的错误代码。
答案 1 :(得分:0)
如果您想了解收到错误的原因,请检查错误消息。它可以在$!
中找到,也可能更准确地在$^E
中找到。
答案 2 :(得分:0)
我最近遇到了一个在不同情况下非常相似的问题。尝试通过CGI访问文件时,_stati64()
将返回-1,其中包含ENOENT“无此文件或目录”的错误。我写了一个简单的C程序来对文件运行_stati64()
,看看结果是否相同,并且它是否正常工作。
使用Procmon进一步调查显示,通过CGI调用的进程将在相关文件的父目录上的CreateFile
操作中失败;结果始终为ACCESS DENIED,这与尝试访问实际不存在的文件的结果相同。
该修复最终成为以下
是的,我不知道是什么导致了这一点,但调试是一个非常令人沮丧的问题。我的猜测是CGI访问由于原始目录中的拙劣权限而失败。