在任何编程语言中(仅)读取后是否有必要关闭文件?
Is it necessary to close files after reading (only) in any programming language?
我读到程序应该在写入文件后关闭文件,以防写入缓冲区中仍有数据尚未实际写入。我还读到一些语言,例如 Python 会自动关闭所有超出范围的文件,例如程序结束时。
但是如果我只是读取文件而不以任何方式修改它,也许除了 OS 更改其上次访问日期之外,是否需要关闭它(即使程序永不终止,例如监视日志文件的守护进程)?
(Why is it necessary to close a file after using it? 询问一般的文件访问,而不仅仅是阅读。)
是的,读取完成后最好关闭文件。
这是必要的,因为其他软件可能会请求对该文件的独占访问权限。如果文件仍处于打开状态,则此类请求将失败。
不关闭文件将导致从系统中占用不必要的资源(File Descriptors on Unix and Handles on windows)。尤其是当错误发生在某种循环中或系统永远不会关闭时,这就变得很重要。有些语言会在 运行 超出范围时自行管理未关闭的文件,而其他语言则不会或仅在检查时的某个随机时间(如 Java 中的垃圾收集器)。
假设您有某种系统需要 运行 永远。例如服务器。然后未关闭的文件会消耗越来越多的资源,直到最终所有 space 都被未关闭的文件使用。
要读取文件,您必须打开它。因此,无论您对文件做什么,space 都将为该文件保留。到目前为止,我试图解释为资源关闭文件的重要性,同样重要的是,作为程序员,您知道何时可以关闭对象(文件),因为不需要进一步使用 .我认为至少不了解未关闭的文件是一种不好的做法,如果不需要进一步使用,关闭文件是一种很好的做法。
一些应用程序也只需要访问一个文件,因此不需要其他应用程序打开该文件。例如,当您尝试清空回收站或移动您仍在 windows 上打开的文件时。 (这被称为 file locking)。当您仍然打开文件时,windows 不会让您丢弃或移动文件。这只是一个例子,说明当文件应该(而不是)不应该打开时会很烦人。这个例子每天都发生在我身上。
一般来说,您应该始终在使用完文件后将其关闭。
原因 1: 没有无限可用的文件描述符
(或在 windows 中,概念上类似的 HANDLES)。
每次访问文件资源时,即使是读取,也会减少其他进程可用的句柄(或 FD)的数量。
每次关闭句柄时,都会释放它并使其可用于其他进程。
现在考虑打开文件、读取文件但不关闭文件的循环的后果...
http://en.wikipedia.org/wiki/File_descriptor
https://msdn.microsoft.com/en-us/library/windows/desktop/aa364225%28v=vs.85%29.aspx
原因 2: 如果您正在执行除读取文件以外的任何操作,则存在竞争条件问题,如果多个进程或线程访问同一个文件..
为避免这种情况,您可能会发现文件锁定。
http://en.wikipedia.org/wiki/File_locking
如果您正在读取一个文件,并且之后没有关闭它,其他可能尝试获取文件锁的应用程序将被拒绝访问。
哦 - 任何无权终止您的进程的人都无法删除该文件..
原因 3: 绝对没有理由让文件处于未关闭状态。在任何语言中,这就是为什么 Python 帮助懒惰的程序员,并自动关闭超出范围的句柄,以防程序员忘记。
我读到程序应该在写入文件后关闭文件,以防写入缓冲区中仍有数据尚未实际写入。我还读到一些语言,例如 Python 会自动关闭所有超出范围的文件,例如程序结束时。
但是如果我只是读取文件而不以任何方式修改它,也许除了 OS 更改其上次访问日期之外,是否需要关闭它(即使程序永不终止,例如监视日志文件的守护进程)?
(Why is it necessary to close a file after using it? 询问一般的文件访问,而不仅仅是阅读。)
是的,读取完成后最好关闭文件。
这是必要的,因为其他软件可能会请求对该文件的独占访问权限。如果文件仍处于打开状态,则此类请求将失败。
不关闭文件将导致从系统中占用不必要的资源(File Descriptors on Unix and Handles on windows)。尤其是当错误发生在某种循环中或系统永远不会关闭时,这就变得很重要。有些语言会在 运行 超出范围时自行管理未关闭的文件,而其他语言则不会或仅在检查时的某个随机时间(如 Java 中的垃圾收集器)。
假设您有某种系统需要 运行 永远。例如服务器。然后未关闭的文件会消耗越来越多的资源,直到最终所有 space 都被未关闭的文件使用。
要读取文件,您必须打开它。因此,无论您对文件做什么,space 都将为该文件保留。到目前为止,我试图解释为资源关闭文件的重要性,同样重要的是,作为程序员,您知道何时可以关闭对象(文件),因为不需要进一步使用 .我认为至少不了解未关闭的文件是一种不好的做法,如果不需要进一步使用,关闭文件是一种很好的做法。
一些应用程序也只需要访问一个文件,因此不需要其他应用程序打开该文件。例如,当您尝试清空回收站或移动您仍在 windows 上打开的文件时。 (这被称为 file locking)。当您仍然打开文件时,windows 不会让您丢弃或移动文件。这只是一个例子,说明当文件应该(而不是)不应该打开时会很烦人。这个例子每天都发生在我身上。
一般来说,您应该始终在使用完文件后将其关闭。
原因 1: 没有无限可用的文件描述符 (或在 windows 中,概念上类似的 HANDLES)。 每次访问文件资源时,即使是读取,也会减少其他进程可用的句柄(或 FD)的数量。 每次关闭句柄时,都会释放它并使其可用于其他进程。
现在考虑打开文件、读取文件但不关闭文件的循环的后果...
http://en.wikipedia.org/wiki/File_descriptor
https://msdn.microsoft.com/en-us/library/windows/desktop/aa364225%28v=vs.85%29.aspx
原因 2: 如果您正在执行除读取文件以外的任何操作,则存在竞争条件问题,如果多个进程或线程访问同一个文件.. 为避免这种情况,您可能会发现文件锁定。 http://en.wikipedia.org/wiki/File_locking
如果您正在读取一个文件,并且之后没有关闭它,其他可能尝试获取文件锁的应用程序将被拒绝访问。
哦 - 任何无权终止您的进程的人都无法删除该文件..
原因 3: 绝对没有理由让文件处于未关闭状态。在任何语言中,这就是为什么 Python 帮助懒惰的程序员,并自动关闭超出范围的句柄,以防程序员忘记。