【问题标题】:How to atomically create a file in a non-existing folder?如何在不存在的文件夹中自动创建文件?
【发布时间】:2012-08-21 13:59:02
【问题描述】:

给定一个文件的路径,我想创建这个文件,以及指向它的目录字符串(如果它们不存在);但我不希望我的程序的任何其他实例能够看到其中没有文件的基本目录。

基本上,我想一次自动创建所需的目录和文件。据我了解,它必须分两步完成(创建目录,创建文件),所以我在考虑使用锁定文件,但同样的问题适用:我在哪里创建锁定文件?我不知道需要创建多少级文件夹,并且在某些时候,我可能会失去写入权限,因此锁定文件没有“安全的地方”。

然后我考虑使用锁定目录而不是锁定文件,但是我找不到任何“测试和设置”方法来创建目录(Directory.CreateDirectory(path) 不会告诉你它是否做了什么)。

那么正确的做法是什么?

【问题讨论】:

  • 这取决于要尝试制作文件夹+文件的其他内容。是你的应用吗?使用系统范围的互斥体/其他 IPC。您可以查看 NTFS API,它是事务性的,尽管您可能需要为它 P/Invoke
  • 使用临时文件有什么问题?随机文件名。任何其他应用程序知道它的可能性很小。

标签: c# file directory atomic


【解决方案1】:

以临时名称创建目录和文件,并将目录自动重命名为最终名称。

或者使用事务性 NTFS(更难)。

【讨论】:

    【解决方案2】:

    您可以使用 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 
    

    这适用于在同一台电脑上运行的本地程序实例。未指定,但对于跨网络使用相同数据库的程序实例,您可以在数据库中实现类似互斥的功能。

    【讨论】:

    • 嗯,除非多台机器可以访问共享上的目录...但我没有在我的问题中指定。
    猜你喜欢
    • 1970-01-01
    • 2018-09-05
    • 1970-01-01
    • 2011-03-13
    • 1970-01-01
    • 2018-02-10
    • 2018-03-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多