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

Windows 我应该将临时文件写入临时目录吗?或者将临时文件写入最终目录?,windows,file,permissions,io,acl,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

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

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. 
现在回答我的问题:

  • 与将临时文件保存到最终目录相比,是否更倾向于将临时文件保存到临时目录,然后将其移动?(若然,原因为何?)

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

  • 如果这两个问题的答案都是肯定的,那么在获取文件上的适当ACL(该文件首先保存到临时目录,然后移动到最终目录)时,我如何做首选的事情


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

  • 它避免了您描述的潜在权限问题

  • 最终目录可能位于不同的卷上,在这种情况下,移动(临时文件到最终文件)实际上是一个复制+删除操作——如果您经常这样做或者文件很大,这会导致大量开销

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


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

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

  • 它避免了您描述的潜在权限问题

  • 最终目录可能位于不同的卷上,在这种情况下,移动(临时文件到最终文件)实际上是一个复制+删除操作——如果您经常这样做或者文件很大,这会导致大量开销

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


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

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

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

    如果临时文件只是临时文件,就在临时文件夹中创建一个临时文件。否则,请在其最终目标中创建它

    注意事项:

    1) 如果最终目的地是“拾取”文件夹,则这可能不起作用(除非“拾取”进程检查锁定的文件(它应该这样做))


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

    如果临时文件只是临时文件,请在临时文件夹中创建临时文件。否则,请在其最终目标中创建它

    注意事项:

    1) 如果最终目的地是“拾取”文件夹,则这可能不起作用(除非“拾取”进程检查锁定的文件(它应该这样做))


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

    1。是的,最好先保存到临时文件

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

    2。是

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


    3。在替换之前,将ACL从最终文件复制到临时文件?1。是的,最好先保存到临时文件

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

    2。是

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


    3。在替换之前,将ACL从最终文件复制到临时文件?

    为什么不使用户可以配置它?一些用户不喜欢临时文件污染他们的当前目录

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

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


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

    如果这些临时文件变成永久文件,请在同一位置创建它们,以避免必须跨磁盘/分区“移动”文件的风险,这将导致更多的I/O(作为副本,然后是
    File file = File.createTempFile(imageFileName, null, storageDir);