翻译《Use FILE_SHARE_DELETE in your shell extension》

news2024/12/25 13:50:16

         在写 《翻译《The Old New Thing》- What did MakeProcInstance do?》 文章时,了解到了 Michael Geary ,他也有不少优秀的技术文章,现翻译一篇关于文件操作的细节的文章

原文

Use FILE_SHARE_DELETE in your shell extension | mg.toicon-default.png?t=N7T8https://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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1711214.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Unity之FGUI】白仙章Fairy GUI控件详解二

👨‍💻个人主页:元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏:就业…

硬盘监控,保障硬盘性能

硬盘驱动器是个人计算机和服务器中用于存储数字数据的硬件部件,硬盘突然故障可能导致永久数据丢失,大多数硬盘驱动器使用自我监控、分析和报告技术(SMART)来跟踪各种性能指标并分析其自身的运行状况。然而,并不是所有的…

HackTheBox-Machines--Popcorn

文章目录 0x01 端口扫描0x02 测试思路2.1 80端口测试 0x03 /torrent 目录文件上传测试0x04 权限提升 Popcorn 测试过程 0x01 端口扫描 (base) gryphonwsdl ~ %nmap -sC -sV 10.129.138.22 Starting Nmap 7.94 ( https://nmap.org ) at 2024-05-28 14:22 CST Nmap scan report …

Linux shell编程学习笔记51: cat /proc/cpuinfo:查看CPU详细信息

0 前言 2024年的网络安全检查又开始了,对于使用基于Linux的国产电脑,我们可以编写一个脚本来收集系统的有关信息。对于中央处理器CPU比如,我们可以使用cat /proc/cpuinfo命令来收集中央处理器CPU的信息。 1. /proc/cpuinfo 保存了系统的cpu…

贵州大学24计算机考研数据速览,国家重点实验室22408复试线285分!贵州大学计算机考研考情分析!

贵州大学计算机科学与技术学院坐落在贵州大学北校区(贵阳花溪)。 学院现有教职工139人,其中专职教师126人,教授17人,副教授37人,讲师46人,高级实验师4人,实验师17人。具有博士学位的…

【易错题】数据可视化基础练习题(30道选择题)#CDA Level 1

本文整理了数据可视化基础知识相关的练习题,共30道,适用于想巩固数据可视化知识的同学,也可作为备考CDA一级的补充习题。来源:如荷学数据科学题库(技术专项-可视化)。 1) 2) 3&…

通义千问图像识别功能的23个实用案例

●给出穿搭建议 这位女士佩戴的是一款精致的长款耳坠,设计上融合了复古和现代元素。为了更好地搭配这款耳环,以下是一些建议: 服装风格:由于耳环本身具有一定的华丽感,建议选择简约而优雅的服装来平衡整体造型。可以选…

栈和队列专题(LeetCode)

目录 有效的括号题解代码加解释 用队列实现栈题解代码加解释 设计循环队列题解代码加解释 用栈实现队列题解代码加解释 有效的括号 题解 左括号从s字符串中取出来放入栈中 s中就只有右括号了 那么栈顶的左括号和s的右括号匹配即可 代码中也详细解释了左括号和右括号多少的问题…

如何成为快手外卖代理?本地生活服务平台加盟条件解析

近年来,以抖音、快手和小红书等为代表的互联网大厂纷纷进军本地生活领域,改变美团和饿了么二分天下的这一局面的同时,也让本地生活成为了众多创业者眼中的“香饽饽”。其中,快手凭借着其庞大的用户群体,让快手团购外卖…

关于本人VIP付费文章说明

郑重声明:我写博客只是为了记录分享经验 自从上次写完数据结构系列后我就一直没有登陆,目前也没打算继续开新内容。今天偶然发现我之前写的文章被设为vip文章,要vip解锁才能看,我很确定当初我发布的时候选择的是公开,…

LeetCode 474.一和零

没做出来,最后看了解析,看了半天才懂。 我一开始把这个题当成多重背包来做了,因为有0和1两个参数需要考虑,但是中间很多情况不知道怎么处理。后面看了解析才知道这是个01背包问题,0和1都是一个物品上的属性&#xff0c…

HTML静态网页成品作业(HTML+CSS)——游戏阴阳师介绍网页(4个页面)

🎉不定期分享源码,关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 🏷️本套采用HTMLCSS,未使用Javacsript代码,共有4个页面。 二、作品演示 三、代…

RDP方式连接服务器上传文件方法

随笔 目录 1. RDP 连接服务器 2. 为避免rdp 访问界面文字不清晰 3. 本地上传文件到服务器 1. RDP 连接服务器 # mstsc 连接服务器step1: 输入mstscstep2: 输入 IP, username, passwd 2. 为避免rdp 访问界面文字不清晰 解决方法: 3. 本地上传文件到服务器 step…

《KAN》论文笔记

原文出处 KAN: Kolmogorov–Arnold Networks (arxiv.org)https://arxiv.org/html/2404.19756v1 论文笔记 What 《KAN: Kolmogorov–Arnold Networks》——我们提出了 KolmogorovArnold Networks (KANs) 作为多层感知器 (MLP) 的有前途的替代方案。 我们表明,这…

小程序自动化辅助渗透脚本(2024)

简介 1.还在一个个反编译小程序吗? 2.还在自己一个个注入hook吗? 3.还在一个个查看找接口、查找泄露吗? 现在有自动化辅助渗透脚本了,自动化辅助反编译、自动化注入hook、自动化查看泄露 注:本工具仅用于学习交流&…

数据库系统概论(个人笔记)(第三部分)

数据库系统概论(个人笔记) 文章目录 数据库系统概论(个人笔记)3、SQL介绍3.1 SQL查询语言概述3.2 SQL数据定义3.3 SQL查询的基本查询结构3.4 其他基本操作3.5 设置操作3.6 空值3.7 聚合函数3.8 嵌套子查询3.9 数据库的修改 3、SQL…

VSCODE常用插件记录

重点提名: back & ForthBookmarksC/ChighlightSSH FS //SSH插件

SQL2017附加从其他电脑复制过来的mdf数据后出现【只读】无法写入数据

1. 尝试给它所在的文件夹的属性中的“只读”去勾,无果。 2. 其他文章提示是文件的问题。 该错误为文件权限错误,找到该数据库的 数据库文件 和 日志文件,在安全中添加 Authenticated Users 用户的权限,并设置 “完全控制”

Linux:进程控制(二.详细讲解进程程序替换)

上次讲了:Linux:进程地址空间、进程控制(一.进程创建、进程终止、进程等待) 文章目录 1.进程程序替换1.1概念1.2原理1.3使用一个exec 系列函数execl()函数结论与细节 2.多进程时的程序替换3.其他几个exec系…

【链表】Leetcode 82. 删除排序链表中的重复元素 II【中等】

删除排序链表中的重复元素 II 给定一个已排序的链表的头 head , 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表 。 示例 1: 输入:head [1,2,3,3,4,4,5] 输出:[1,2,5] 解题思路 由于链表…