【问题标题】:Lock file but allow usage by current process?锁定文件但允许当前进程使用?
【发布时间】:2011-03-26 02:31:59
【问题描述】:

我希望能够在 Win32 中锁定一个文件,以便它只能由我当前的进程使用。最明显的实现方式似乎是通过CreateFile

HANDLE file = ::CreateFile("c:\\foo.txt", 
                           GENERIC_READ | GENERIC_WRITE,
                           0,
                           NULL,
                           OPEN_EXISTING,
                           FILE_ATTRIBUTE_NORMAL,
                           NULL);

但是,一旦调用成功,该文件显然也被我自己的进程锁定,即。一旦 MFC 框架的东西试图打开它,我就会收到“共享冲突”。

有没有一种方便的方法可以防止其他进程访问文件但我的进程仍然允许它?我宁愿不必替换所有加载/保存框架代码...我在传递给 CreateFile 的参数中做错了吗?

【问题讨论】:

    标签: winapi mfc locking


    【解决方案1】:

    来自Creating and Opening Files

    应用程序也使用 CreateFile 来 指定是否要共享 用于读取、写入或两者的文件 两者都不。这被称为共享 模式。未共享的打开文件 (dwShareMode 设置为零)不能 再次打开,无论是由 打开它的应用程序或通过 另一个应用程序,直到它的句柄 已经被关了。这也被提及 以独占访问权限。

    另见How do the FILE_SHARE_* bits interact with the desired access bits?

    【讨论】:

      【解决方案2】:

      我不知道有任何简单的方法可以做到这一点。至于更复杂的方法,您可以:

      1. 为访问文件设置一个特殊的用户名。
      2. 打开非共享文件。
      3. 编辑 ACL 以允许仅通过特殊用户名使用
      4. 关闭文件。
      5. 冒充该用户
      6. 打开文件,允许共享
      7. 关闭文件
      8. 重新设置 ACL 以允许其他用户访问

      请注意,我并不是说我会建议这样做——这很丑陋,或多或少是对系统的滥用——但如果你确定需要这样做,那可能是一种可能会工作。

      【讨论】:

        猜你喜欢
        • 2019-10-20
        • 1970-01-01
        • 1970-01-01
        • 2011-03-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-23
        • 1970-01-01
        相关资源
        最近更新 更多