Ruby 错误号::EMFILE-“;打开的文件太多@rb_sysopen";打开第一个文件时
我有一个使用ruby 2.2.3的应用程序。对于大多数用户,应用程序工作正常,但对于2个用户,他们遇到了错误“打开的文件太多@rb\u sysopen-C:\users\Samuel\AppData\Roaming\Oneshot\save.dat(Errno::EMFILE)” 这发生在游戏试图从ruby级别写入的第一个文件上。我让受影响的用户运行process explorer来检查程序打开了多少个文件句柄,但最多只有30个,所以我认为他们实际上没有太多打开的文件。该目录存在于用户的计算机上,因此也不是问题。有人知道还有什么会导致抛出此错误吗 这是导致问题的ruby代码,我不认为它有任何问题(它在打开时是正确的,而不是在转储期间):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个,所以我认为他们实际上没有太多打开的文件。该目录存在于用户的计算机上
我要看两件事: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