写入临时位置,然后将其复制到目标位置有什么好处?


47

我正在编写一个可处理卫星图像的应用程序,老板要求我研究一些商业应用程序,并观察它们的表现。我发现了一个奇怪的行为,然后在寻找时,我也在其他标准应用程序中发现了它。

这些程序首先写入temp文件夹,然后将其复制到预期的目标位置。

示例:7zip首先提取到temp文件夹,然后将提取的数据复制到您要求其将数据提取到的位置。

我看到这种方法的几个问题:

  1. 临时文件夹可能没有足够的空间,而预期的位置可能有那么多的空间。

  2. 如果文件很大,则复制操作可能会花费很短的时间。

我考虑了很多,但是我看不出这样做有什么积极的意义。我是否缺少某些东西,或者这样做真的有好处?


如果应用程序需要它,请执行。否则,请执行有意义的操作。您的大脑告诉您在这种情况下不需要它。正如您所回答的那样,我正在尽量减少工作量,因此我建议为该应用程序尽量减少工作量。
杰森·塞布林2012年

1
您确定它是“复制”文件而不是“移动”文件吗?巨大差距。
frankc 2012年

blogs.rsa.com/…,对于恶意软件,优点是1) 保证的可写性避免了在将病毒完全下载到用户计算机上之前进行“红色错误”检测2) TEMP磁盘通常更快(RAMDisk)减少了时间检测而病毒仍然在下载阶段(一旦病毒完全形成,并成功地执行了0.05秒,游戏就结束了,所以它的时间赛跑)
Pacerier

3)在您仍在下载或运行时,如果杀毒软件(有时不知道自己)被砸进了您的脑袋,但您仍然可以指望操作系统或用户意外地帮助您删除该病毒的可能性为x%您的死骨头,尽管它们从TEMP文件夹中大量清除东西,这有助于降低检测概率。
佩里耶

Answers:


95

我能想到的几个原因:

  • 在大多数平台上,文件移动是原子的,但文件写入不是原子的(特别是如果您无法一次性写入所有数据)。因此,如果您具有典型的生产者/消费者模式(一个进程生成文件,另一个进程监视目录并获取其找到的所有内容),则首先写入临时文件夹,然后再移至实际位置,这意味着消费者永远看不到未完成的文件。
  • 如果写入文件的过程中途结束,则表明磁盘上的文件损坏。如果在真实位置,则必须自己清理,但如果在临时位置,则操作系统将对其进行处理。
  • 如果在运行备份作业时恰好创建了该文件,则该作业可能会拾取不完整的文件;否则,该文件可能会丢失。临时目录通常不包括在备份中,因此,仅在移动到最终目的地后才包含该文件。
  • 临时目录可以位于快速但易失的文件系统(例如ramdisk)上,这对于诸如并行下载同一文件的多个块或对文件进行大量查找就地处理之类的事情可能是有益的。此外,与不经常读取,写入和删除的目录相比,临时目录往往导致更多的碎片,而将temp目录保留在单独的分区上可以帮助降低其他分区的碎片。

TL; DR-它主要归结为原子性,也就是说,您想要使其原子化(在最终位置)是完整文件还是在任何给定时间根本不存在文件。


12
如果临时目录位于单独的分区上,则会失去原子性。
yfeldblum 2012年

16
某些程序将提取/复制到预期的目录,但是它们将使用临时文件扩展名(例如.tmp)并在完成后将其重命名。
Dan Diplo

5
当程序的多个实例可以尝试同时上载同一文件,并且您不能依靠文件系统提供正确的锁定级别时(例如定义不明确的云存储API),有时写入临时文件也很有用。 。使用临时文件将确保生成的文件不会最终混入两次上传的数据。当然,这只是原子性的另一个实例。
Krzysztof Kozielczyk 2012年

1
更新现有文件时,Dan Diplo的案例非常有用。您不希望在成功写入新旧文件之前更换旧旧书,以免新旧书的写入失败或在新旧书完全写入之前读取新旧书。
RalphChapin 2012年

1
不幸的是,尽管OS Temp文件夹到处都是旧文件和文件夹,因为OS无法清理它!因此,我们作为开发人员仍应清理它!superuser.com/questions/296824/...
markmnl

15

在Windows中,这似乎是一个问题,尤其与拖放的管理方式有关。

的的开发者WINSCP客户都开发了自己的外壳扩展,它覆盖了该拖放行为,并允许文件立即下降到正确的文件夹。他们在文档中解释了窍门,更有趣的是,问题出在哪里以及如何解决。

这是有趣的部分:

Windows拖放机制不允许拖放操作的源应用程序轻松找到文件放置的位置。由目标应用程序(通常是Windows资源管理器)将文件传输到目标位置。这是相当合理的,因为源应用程序几乎无法将文件传输到所有可能的目的地。请记住,您不仅可以将文件拖放到目录,甚至可以拖放到ZIP文件(或任何其他存档),远程目录(通过FTP,SFTP,SCP等),垃圾箱等。

显然,即使Windows资源管理器(或任何其他目标应用程序,如WinZip)也无法从任何可能的源下载文件(尤其是它不知道SFTP / SCP)。

另外,专门针对7Zip:用户ray023在超级用户堆栈问答中回答了这个问题:https ://superuser.com/a/422463

基本上,如果不是使用bith 7-ZIP和Winrar中可用的“此处提取”方法来拖放文件,而是将文件直接提取到正确的目录中。


2
问题不是“为什么7zip使用临时文件?” 实际的问题是“为什么在软件开发中经常使用临时文件?”
Phil

@Phil根据我的理解,给出的示例是,当您将一个文件从档案文件拖到系统上的文件夹而没有明确要求“提取”时会发生什么。但是,我重新阅读了这个问题,是的,我想您是对的,因为作者想了解有关临时文件夹实用程序的更多信息,顺便说一句,tdammers很好地回答了临时文件夹的问题(我也对+1投票)
Jalayn 2012年

虽然您的答案并非我要找的答案,但+1可以解决7zip的问题
Devdatta Tengshe 2012年

1
好的注释基本上可以归结为:为什么程序使用temp文件夹?因为当拖放时它不知道目标文件夹,而只是将其“提供”给Windows,因此Windows会接管并将文件放在正确的位置。
Pieter B

0

如果您必须对文件进行任何类型的数据处理(解码/转换/等),则最好使用临时文件,并且在完成后使用,并且仅在完成后才将结果传输到最终目的地。

好处:

  1. 仅完成的文件到达目的地
  2. 临时文件可能(应该)驻留在快速媒体中
  3. 避免最终文件碎片化
  4. 允许使用其他媒体作为最终目的地(ftp,云等)
  5. 中止的临时文件更易于清除

我看不到在处理数据时直接写入目标的真正好处。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.