Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 错误号::EMFILE-“;打开的文件太多@rb_sysopen";打开第一个文件时_Ruby - Fatal编程技术网

Ruby 错误号::EMFILE-“;打开的文件太多@rb_sysopen";打开第一个文件时

Ruby 错误号::EMFILE-“;打开的文件太多@rb_sysopen";打开第一个文件时,ruby,Ruby,我有一个使用ruby 2.2.3的应用程序。对于大多数用户,应用程序工作正常,但对于2个用户,他们遇到了错误“打开的文件太多@rb\u sysopen-C:\users\Samuel\AppData\Roaming\Oneshot\save.dat(Errno::EMFILE)” 这发生在游戏试图从ruby级别写入的第一个文件上。我让受影响的用户运行process explorer来检查程序打开了多少个文件句柄,但最多只有30个,所以我认为他们实际上没有太多打开的文件。该目录存在于用户的计算机上

我有一个使用ruby 2.2.3的应用程序。对于大多数用户,应用程序工作正常,但对于2个用户,他们遇到了错误“打开的文件太多@rb\u sysopen-C:\users\Samuel\AppData\Roaming\Oneshot\save.dat(Errno::EMFILE)”

这发生在游戏试图从ruby级别写入的第一个文件上。我让受影响的用户运行process explorer来检查程序打开了多少个文件句柄,但最多只有30个,所以我认为他们实际上没有太多打开的文件。该目录存在于用户的计算机上,因此也不是问题。有人知道还有什么会导致抛出此错误吗

这是导致问题的ruby代码,我不认为它有任何问题(它在打开时是正确的,而不是在转储期间):


我要看两件事:1、
.save
是否在循环中被反复调用,或者是
.save\u perma\u flags
调用
.save
并进入递归循环?我99%肯定
.save
没有循环,也不是
。save\u perma\u flags
(这部分根本没有涉及到)。由
.save
.save\u perma\u flags
创建的文件均未实际创建(用户检查了文件应在崩溃后保存的目录),并且在遇到异常时使用process explorer检查打开的文件句柄时,不会打开这些文件中的任何一个,因此,我很确定它在第一次调用时调用了异常。查看ruby源代码,它尝试通过
\u open\u osfhandle
获取文件,如果失败,它只是假设进程打开了太多文件。有没有办法告诉这些用户为什么
\u open\u osfhandle
会失败?(我可以重新编译ruby源代码)您确定该目录存在吗?我想你不是在硬编码c:\users。。。路径和正在使用类似于
ENV['APPDATA']
的东西来获取相应的基本目录。我确信该目录存在,异常在失败时显示目录,并且我已经让受影响的用户导航到该路径以检查它是否存在。我将看两件事:1,是
.save
在循环中被反复调用,还是
.save\u perma\u flags
调用
.save
并进入递归循环?我99%确定
.save
没有循环,也没有
.save\u perma\u flags
(这部分根本没有)。由
.save
.save\u perma\u flags
创建的文件均未实际创建(用户检查了文件应在崩溃后保存的目录),并且在遇到异常时使用process explorer检查打开的文件句柄时,不会打开这些文件中的任何一个,因此,我很确定它在第一次调用时调用了异常。查看ruby源代码,它尝试通过
\u open\u osfhandle
获取文件,如果失败,它只是假设进程打开了太多文件。有没有办法告诉这些用户为什么
\u open\u osfhandle
会失败?(我可以重新编译ruby源代码)您确定该目录存在吗?我想你不是在硬编码c:\users。。。路径和正在使用类似于
ENV['APPDATA']
的内容来获取相应的基本目录。我确信该目录存在,异常会在失败时显示该目录,并且我已让受影响的用户导航到该路径以检查其是否存在。
def save
  if ($game_variables[3] == 0) #don't save if intro variable isn't set
    return
  end
  File.open(SAVE_FILE_NAME, 'wb') do |file|
    # Wrire frame count for measuring play time
    Marshal.dump(Graphics.frame_count, file)
    # Increase save count by 1
    $game_system.save_count += 1
    # Save magic number
    # (A random value will be written each time saving with editor)
    $game_system.magic_number = $data_system.magic_number
    # Write each type of game object
    Marshal.dump($game_system, file)
    Marshal.dump($game_switches, file)
    Marshal.dump($game_variables, file)
    Marshal.dump($game_self_switches, file)
    Marshal.dump($game_screen, file)
    Marshal.dump($game_actors, file)
    Marshal.dump($game_party, file)
    Marshal.dump($game_map, file)
    Marshal.dump($game_player, file)
    Marshal.dump($game_followers, file)
    Marshal.dump($game_oneshot, file)
    Marshal.dump($game_fasttravel, file)
    Marshal.dump($game_temp.footstep_sfx , file)
  end
  save_perma_flags
end