网站支付宝怎么做的,天门网站开发,wordpress设定主页,如何在阿里云上做网站备案在写 《翻译《The Old New Thing》- What did MakeProcInstance do?》 文章时#xff0c;了解到了 Michael Geary #xff0c;他也有不少优秀的技术文章#xff0c;现翻译一篇关于文件操作的细节的文章 原文
Use FILE_SHARE_DELETE in your shell extension | mg.tohttps:… 在写 《翻译《The Old New Thing》- What did MakeProcInstance do?》 文章时了解到了 Michael Geary 他也有不少优秀的技术文章现翻译一篇关于文件操作的细节的文章 原文
Use FILE_SHARE_DELETE in your shell extension | mg.tohttps://mg.to/2004/09/30/file_share_delete-in-shell-extension
Michael Geary | 星期三, 2004-09-29 18:24 通过文件内容提供信息的 Windows shell 扩展必须打开文件才能实现。打开文件会在某种程度上锁定文件这取决于您使用的文件共享标志。即使打开文件的时间很短也足以影响其他程序对文件的使用。 如果有人将文件从一个文件夹拖到另一个文件夹而你的外壳扩展可以为选定的文件类型显示缩略图会发生什么情况Windows 会调用你的 IExtractImage 接口然后你就开始渲染缩略图。然后只要客户松开鼠标Windows 就会尝试将文件移动到新文件夹。如果移动速度足够快当你还在打开文件渲染缩略图时就会发生这种情况。结果就会出现这条可爱的信息 如果幸运的话他们会再试一次速度再慢一点这样就能成功了你完成了缩略图的渲染关闭了文件Windows 就可以顺利地移动它了。 对于 Windows NT、2000 和 XP有一种简单的方法可以解决这个问题。在打开文件的调用中在 dwShareMode 参数中使用 CreateFile()FILE_SHARE_READ | FILE_SHARE_DELETE MSDN 文档中并没有明确说明但它的工作方式与 .NET Framework 中的工作方式相同。 换句话说它为你提供了 Unix 风格的删除/重命名语义。即使您打开了文件Windows 也可以删除它或重命名它但您可以继续读取它--您对文件的句柄一直有效直到您关闭它。FILE_SHARE_DELETEMoveFile()DeleteFile() 因此在上述情况下Windows 会将文件移动到目标文件夹而不会受到缩略图代码的干扰。Mike Mascari 对此进行了测试并将结果发布在 comp.databases.postgresql.hackers 新闻组中 这就是测试 foo.txt 内容是 This is FOO! bar.txt 内容是 This is BAR! Process 1 打开 foo.txt Process 2 打开 foo.txt Process 1 sleeps 7.5 秒 Process 2 sleeps 15 秒 Process 1 调用 MoveFile() 改名 foo.txt to foo2.txt Process 1 调用 MoveFile() 改名 bar.txt to foo.txt Process 1 调用 DeleteFile() 删除 foo2.txt Process 2 唤醒后显示 This is FOO! 在文件系统上我们将看到: foo.txt 内容是 This is BAR! 好消息是只需使用 MoveFile() 即可在 NT 4 下正常运行。坏消息是它要求使用设置了 FILE_SHARE_DELETE 标志的 CreateFile() 打开文件。Visual C 6 随附的 C 库最终会通过 fopen() 调用 CreateFile()但无法通过标准 C 库例程使用 FILE_SHARE_DELETE 标志。而在 Windows 95/98 下FILE_SHARE_DELETE 标志无法使用错误参数。这意味着在这些平台上似乎仍然没有解决方案。在 NT/XP/2K 下AllocateFile() 必须修改为调用 CreateFile()而不是 fopen()。我不清楚 ME 的情况但我怀疑它的行为与 95/98 类似。 即使在 Mike 发表文章的两年后C 运行时也没有什么改进。和函数声称支持文件共享但都不支持.NET。对于 shell 扩展来说这可能并不重要你可以直接使用 Win32 文件 I/O 函数。如果你需要流 I/O 函数提供的缓冲功能可以使用 打开文件 然后获取一个 C 运行时文件描述符并从中打开一个流。_fsopen()_sopen()FILE_SHARE_DELETECreateFile()FILE_SHARE_DELETE_open_osfhandle()_fdopen() 抱歉在 95、98 或 Me 上无法运行必须取消标记。我不知道如何解决这些操作系统的问题。FILE_SHARE_DELETE