【问题标题】:Opening the same file twice with different flags?用不同的标志打开同一个文件两次?
【发布时间】:2011-01-13 22:27:18
【问题描述】:

我能否使用不同的标志打开同一个文件两次(使用 CreateFileA)(在这种情况下,一个带有 FILE_FLAG_NO_BUFFERING,一个没有)?

具体来说,是这样的:在启动期间,我创建了一个临时文件(带有 FILE_FLAG_DELETE_ON_CLOSE)。我按顺序填充它,我不想担心在这部分做无缓冲的 IO。然后,在进程运行时,我想使用无缓冲 IO 访问该文件,因为我有自己的缓存逻辑。因此,我正在考虑再次打开同一个文件,这次使用 FILE_FLAG_NO_BUFFERING,然后关闭旧句柄。我想以这种重叠的方式这样做有两个原因:

  1. 并发。如果我在打开新句柄之前关闭旧句柄,那么其他人可能会在此期间弄乱我的文件。
  2. FILE_FLAG_DELETE_ON_CLOSE 会在我关闭第一个句柄而不打开另一个句柄时删除我的文件。这是一个小烦恼,我可以解决。

【问题讨论】:

  • 随机问题:为什么要使用CreateFileA 而不是CreateFileW
  • 整个系统不是我自己写的,只写了这一部分。他们将文件名作为 char* 给我,所以我将它用作 char* :-) 此外,我可以写一篇关于为什么 WCHAR 愚蠢的咆哮,当然,除了它在 Windows API 中的广泛使用你不得不使用它。
  • 啊,好的。很抱歉我在这里的情绪,但我经常被那些拒绝打开文件的应用程序咬伤,因为我有一些使用不适合旧代码页的 Unicode 的文件夹。
  • 我不怎么做winapi的东西,但如果有充分的理由使用CreateFile而不是fopenfstream
  • 是的,@Kitsune。您提到的技术不允许指定诸如缓冲模式或删除模式之类的东西,这是本问题的主题。

标签: c++ windows winapi


【解决方案1】:

请记住在共享模式中包含 FILE_SHARE_DELETE。我认为 FILE_FLAG_DELETE_ON_CLOSE 是唯一影响不仅仅是“你的”句柄的标志。

【讨论】:

    【解决方案2】:

    是不是很可笑?

    您想打开两次,因为如果在关闭前一个句柄后打开,有人可能会弄乱您的文件。但现实情况是,您正试图弄乱您的文件。

    如果不能保证独占文件访问,你怎么能阻止某人做某事?但是,如果您以独占方式打开,如何重新打开文件?

    AFAIK,如果文件已经以独占方式打开,则不允许再打开,即使来自同一进程。

    【讨论】:

    • 虽然他确实需要在第一次打开文件时指定共享写入,但他可以使用 LockFile() 锁定它,但由于他使用的是 FILE_FLAG_DELETE_ON_CLOSE 我假设这是一个临时文件,可能没有其他应用程序会弄乱它
    • @Anders LockFile.. 哦.. 我不知道这样的 API 存在。感谢您的启发性评论。
    猜你喜欢
    • 1970-01-01
    • 2018-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-17
    • 1970-01-01
    相关资源
    最近更新 更多