Windows中TEMP目录的限制?

5 投票
4 回答
15252 浏览
提问于 2025-04-15 15:42

我有一个用Python写的应用程序,它会往%TEMP%文件夹里写很多数据。奇怪的是,偶尔它会崩溃,出现IOError: [Errno 28] No space left on device的错误。其实这个驱动器有很多空闲空间,%TEMP%也不是单独的分区,我是管理员,而且系统没有设置配额。

难道Windows对%TEMP%里的数据有一些人为的限制吗?如果没有,那还有什么可能导致这个问题呢?

编辑:根据下面的讨论,我进一步澄清了问题,以更好地解释发生了什么。

4 个回答

1

在临时文件夹里不应该有这么大的空间限制。如果你是写这个应用程序的人,我建议你把文件放在ProgramData文件夹里...

2

在使用FAT32文件系统时,我能想到以下几种情况可能会出现问题:

  • 当你往一个文件里写入大量数据时,可能会碰到4GB的文件大小限制。
  • 或者当你创建很多小文件时,可能会达到每个文件夹最多只能有65534个文件的限制。

除此之外,我不知道系统对临时文件夹还有什么其他限制,除了物理分区真的满了。

还有一个限制是,正如Mike Atlas所提到的,GetTempFileName()这个函数会创建类型为tmpXXXX.tmp的文件。虽然你可能没有直接使用这个函数,但要检查一下%TEMP%文件夹里是否有太多这样的文件(最多65534个)。

还有一个显而易见的问题,你有没有尝试在运行工具之前清空%TEMP%文件夹?

11

你遇到的具体错误是什么?

你是不是创建了太多临时文件

如果使用 GetTempFileName 方法创建超过65535个文件而没有删除之前的临时文件,就会出现 IOException 错误。

如果没有可用的唯一临时文件名,GetTempFileName 方法也会引发 IOException 错误。要解决这个问题,删除所有不需要的临时文件。

需要注意的是,如果你是间接使用 Win32 API,并且只是用它来获取临时文件名,要知道在(间接)调用它时:

会在磁盘上创建一个唯一命名的零字节临时文件,并返回该文件的完整路径。

如果你使用了这个路径,但又改变了返回的值,要注意你可能实际上是在创建一个零字节文件,并且在此基础上又创建了一个额外的文件(例如 My_App_tmpXXXX.tmp 和 tmpXXXX.tmp)。

正如 Nestor 在下面建议的,考虑在使用完临时文件后将其删除。

撰写回答