我应该将临时文件写入临时目录吗?或者将临时文件写入最终目录?

时间:2009-07-15 00:21:49

标签: windows file permissions io acl

当应用程序保存文件时,典型的模型是将文件保存到临时位置,然后将临时文件移动到最终位置。在某些情况下,“移动”变为“替换”。在伪代码中:

Save temp file;
if final file exists
   delete final file;
move temp file to final filename;

在那里有一个窗口,删除可能会成功,但移动可能没有,所以你可以通过以下方式处理:

Save temp file;
if final file exists
   move final file to parking lot
move temp file to final filename;
if move succeeded       
   delete previous final file. 
else
   restore previous final file. 

现在回答我的问题:

  1. 是否首选将临时文件保存到临时目录,然后将其移动,而不是将临时文件保存到最终目录? (如果是,为什么?)

  2. 与保存到临时文件的文件相比,首先保存到临时目录的文件的属性和权限是否存在差异,然后移动到不同目录中的最终文件? em>在最终目录中,然后在目录中重命名?

  3. 如果两者的答案都是YES,那么在获取文件中的相应ACL时,如何首先保存到临时目录然后移动到最终目录,我该如何做首选项?

9 个答案:

答案 0 :(得分:1)

Microsoft Word将临时文件保存到以波浪号(〜)开头的原始目录。我会遵循这个惯例。

答案 1 :(得分:1)

如果temp文件只是一个临时文件,则在temp文件夹中创建一个临时文件。否则,在最终目的地创建它。

注意事项:

1)如果最终目的地是“提货”文件夹(除非'提货'流程检查锁定的文件(它应该),这可能不起作用)

2)最终目的地具有特殊权限,必须在代码中创建并应用才能移动到最终目的地。

答案 2 :(得分:1)

如果这些是临时文件变成永久文件,请在同一位置创建它们,以避免任何必须跨磁盘/分区“移动”文件的风险,这将导致更多的I / O(作为副本后跟删除)。

如果这些是真正临时的临时文件,请在临时目录中创建(并保留它们)。

答案 3 :(得分:1)

  1. 最好使用GetTempFile例程创建临时文件,因为这会在预定义位置(例如C:\ temp)创建临时文件,如果您的应用程序崩溃或损坏文件,实用程序可以删除。如果相同事情发生在你的最终目录中,它是不可恢复的。

  2. 是,如果已编辑目标文件的属性或ACL,则属性可能不同。即使您在同一文件夹中创建临时文件,也可能发生这种情况。

  3. 通过使用File.Replace例程来解决这个问题,该例程执行一个文件与另一个文件的原子替换,用旧文件替换新文件的属性和ACL。

  4. 执行此操作的C#方法是Safe stream update of file的答案。

答案 4 :(得分:1)

您可能希望永远不要将文件写入一个目录并将其移动到另一个目录的原因是因为这些目录可能位于不同的文件系统上。虽然这在Windows上不太常见,但只要父文件系统是ntfs,它仍然是合理可行的。在unix中,/ tmp是不同文件系统的标准做法。

这可能是一个问题的原因是因为这意味着必须将文件从一个地方复制到另一个地方。这显着影响了大量文件的性能,并且即使文件很小,也肯定需要更多的搜索。此外,在跨文件系统边界移动文件时,还有许多方法可能导致失败。当然,访问权限可能不同,但目标文件系统可能已满,或者您现在推迟到现在为止的任何其他其他并发症。

答案 5 :(得分:0)

我更喜欢将临时文件保存到最终目录:

  1. 它避免了您所描述的潜在权限问题。

  2. 最终目录可能位于不同的卷上,在这种情况下,(临时文件到最终文件)的移动实际上是一个副本+删除 - 如果经常这样做,会产生很多开销,或者如果文件很大。

  3. 您始终可以将现有文件重命名为第二个临时文件,将新临时文件重命名为现有文件的名称,并在出错时回滚。在我看来,这是最安全的组合。

    已编辑:我看到你的“停车场”已经描述了我的建议,所以我不确定我在这里添加了多少。

答案 6 :(得分:0)

1。是的,首选保存到临时文件

因为如果文件的创建因任何原因失败,最终文件永远不会处于损坏状态。如果您直接写入最终文件并且您的程序在中途崩溃...它肯定会使最终文件处于无效状态。

2。是

“继承”的属性和权限当然会有所不同。但是大多数系统上的临时目录通常是为所有应用程序预先配置的。但是,可能需要配置“最终文件”目录。例如,说“Program Files”文件夹和Vista UAC。

3。在替换?

之前,将ACL从最终文件复制到临时文件

答案 7 :(得分:0)

默认情况下,当File.createTempFile()中的后缀param设置为null时,Android会将.tmp作为后缀。我建议你使用它。

File file = File.createTempFile(imageFileName, null, storageDir);

您应该在应用中完成.tmp文件后立即自行调用file.delete()。你不应该依赖file.deleteOnExit(),因为它绝对不能保证它将被Android系统/ VM使用。

答案 8 :(得分:-1)

为什么不让用户配置?有些用户不喜欢临时文件污染他们当前的目录。