如何在不存在的文件夹中原子性地创建文件?

3
给定一个文件路径,我想创建这个文件和它所在路径上的所有目录,但如果这些目录不存在,则不希望我的程序中的任何其他实例能够看到只有基本目录而没有文件的存在。
基本上,我想要同时原子地创建所需的目录和文件。从我的理解来看,必须分两步完成(创建目录、创建文件),所以我考虑使用锁文件,但是同样的问题也适用:在哪里创建锁文件?我不知道需要创建多少级文件夹,在路径下某个点,我可能会失去写入权限,因此没有“安全的地方”放置锁文件。
然后我考虑使用锁目录而不是锁文件,但我找不到任何“测试并设置”方法来创建目录(Directory.CreateDirectory(path)不会告诉您它是否做了什么)。
那么正确的方法是什么?

这取决于还有哪些东西会尝试创建文件夹+文件。是你的应用程序吗?使用系统范围的Mutex /其他IPC。您可以查看NTFS API,它是事务性的,尽管您可能需要进行P / Invoke。 - Kieren Johnstone
使用临时文件有什么问题?随机文件名,其他应用程序几乎不可能知道它。 - C.J.
2个回答

5
创建一个临时名称的目录和文件,然后将目录原子重命名为最终名称。
或者使用事务性NTFS(更加困难)。

1
您可以使用 Mutex 类来同步进程间的操作。

http://msdn.microsoft.com/en-us/library/system.threading.mutex.aspx

对于所有进程的伪代码

grab the mutex
try
 check or create directory and file
finally
release the mutex 

这适用于在同一台计算机上运行的本地程序实例。虽然没有具体说明,但对于跨网络使用相同数据库的程序实例,您可以在数据库中实现类似互斥锁的功能。


嗯,除非多台计算机可以在共享上访问该目录...但我在问题中没有指定这一点。 - Zonko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接