在Linux下,我的程序会做这样的事情:在Windows中删除打开的文件(创建一个匿名文件)?
- 过程1打开一个文件(例如,通过将其映射到内存)。我们称这个文件为#1
- 进程2取消链接该文件,并创建一个具有相同名称的新文件。我们称这个文件为#2。
- 进程1继续处理文件#1。当它关闭时,它被删除(因为它没有链接)。进程1继续处理文件#1中的内容,并且不会看到文件#2中的内容。
- 当两个进程退出时,文件#2仍保留在磁盘上。
我想在Windows中实现相同的语义。在阅读this question后,我认为FILE_SHARE_DELETE基本上做到了这一点。是否足够使用FILE_SHARE_DELETE打开文件,还是需要考虑更多内容?
上面的执行流程仅仅是一个例子,我知道还有其他方法可以解决Windows中的确切问题,但我想了解如何使这些代码在Windows和Linux之间移植。
编辑:澄清:使用情况是为不同的不相关文件重新使用文件名,但让现有进程保留其数据(例如,考虑配置文件的事务更新),并使文件匿名(未命名),但继续像使用匿名内存映射一样使用它。我再次通过其他方式知道这两种方式都可以在Windows上使用,但我试图找到一种跨平台移植的方式。
不,这不是什么'FILE_SHARE_DELETE'。该文件在进程1关闭之前不会被删除,因此进程2将无法创建具有相同名称的新文件。 – 2015-03-31 23:09:40
第二个进程应该能够重命名该文件,然后*删除它,然后创建一个具有相同名称的新文件。 (关于何时可以或不能重命名正在使用的文件的规则,我有点模糊,但我认为它会起作用。) – 2015-03-31 23:14:46
我不明白你的第一个用例:你的例子与你的描述矛盾,因为不同版本的配置文件不是无关的。 (如果这些文件真的不相关,那么正确的和可移植的解决方案就是文件具有唯一的名称。)所描述的第二个用例在Windows上绝对不可能,因为没有这样的事情就像没有命名的文件一样。 – 2015-04-03 00:53:52