WindowsCopyFileA失败然后成功
尝试将文件复制到具有特定权限的文件夹时遇到问题。
这是我非常简单的测试程序:
#include <iostream>
#include <windows.h>
int main()
{
if(CopyFileA("D:/SOURCE/File.txt", "D:/LOCKED/dst1.txt", TRUE))
std::cout << "OKn";
else
std::cout << "Failn";
if (CopyFileA("D:/SOURCE/File.txt", "D:/LOCKED/dst2.txt", TRUE))
std::cout << "OKn";
else
std::cout << "Failn";
system("PAUSE");
}
结果如下:
Fail
OK
我可以复制任意数量的文件。对于每次运行,第一次总是失败,后续总是成功。错误是 ERROR_ACCESS_DENIED。
这是重要的细节:我的目标文件夹具有受限的权限,只有当我删除“写入属性”或“写入扩展属性”时才会出现此行为。
我使用了 sysInternals 的进程监视器:没有其他进程正在访问源文件和目标文件。但是,目标文件上的行为并不相似。第一次尝试关闭文件并尝试重新打开它。以下是日志:
| 行动 | 地位 | 细节 |
|---|---|---|
| 失败的尝试(第一次) | —— | —— |
| 创建文件 | 成功 | 所需访问:通用读/写、删除、写 DAC、处置:创建、选项:顺序访问、非目录文件、属性:A、ShareMode:无、AllocationSize:0、OpenResult:已创建 |
| 关闭文件 | 成功 | |
| 创建文件 | 拒绝访问 | 所需访问:通用读/写、删除、写 DAC、处置:OpenIf、选项:顺序访问、同步 IO 非警报、非目录文件、属性:A、共享模式:无、分配大小:0 |
| 创建文件 | 拒绝访问 | 所需访问:通用读/写、删除、写 DAC、处置:OpenIf、选项:顺序访问、同步 IO 非警报、非目录文件、属性:A、共享模式:读、写、分配大小:0 |
| 创建文件 | 拒绝访问 | 所需访问:通用读/写、写 DAC、处置:OpenIf、选项:顺序访问、同步 IO 非警报、非目录文件、属性:A、共享模式:读、写、分配大小:0 |
| 创建文件 | 拒绝访问 | 所需访问:通用读/写,处置:OpenIf,选项:顺序访问,同步 IO 非警报,非目录文件,属性:A,共享模式:无,分配大小:0 |
| 创建文件 | 拒绝访问 | 所需访问:通用读/写,处置:OpenIf,选项:顺序访问,同步 IO 非警报,非目录文件,属性:A,共享模式:读、写,分配大小:0 |
| 成功的尝试(第二次和后续) | —— | —— |
| 创建文件 | 成功 | 所需访问:通用读/写、删除、写 DAC、处置:创建、选项:顺序访问、同步 IO 非警报、非目录文件、属性:A、ShareMode:无、AllocationSize:0、OpenResult:已创建 |
| QueryAttributeInformationVolume | 成功 | 文件系统属性:保留大小写、区分大小写、Unicode、ACL、压缩、命名流、EFS、对象 ID、重新分析点、稀疏文件、配额、事务、0x3c00600、MaximumComponentNameLength:255、FileSystemName:NTFS |
| 查询基本信息文件 | 成功 | CreationTime:19/08/2021 15:20:32,LastAccessTime:19/08/2021 15:20:32,LastWriteTime:19/08/2021 15:20:32,ChangeTime:19/08/2021 15:20: 32、FileAttributes:A |
| SetEndOfFileInformationFile | 成功 | 文件结尾:24 |
| 写文件 | 成功 | 偏移:0,长度:24,优先级:正常 |
| 读取文件 | 成功 | 偏移量:0,长度:24,I/O 标志:非缓存,分页 I/O,同步分页 I/O,优先级:正常 |
| 设置基本信息文件 | 成功 | CreationTime:01/01/1601 02:00:00,LastAccessTime:01/01/1601 02:00:00,LastWriteTime:19/08/2021 14:50:49,ChangeTime:19/08/2021 14:50: 49、FileAttributes:不适用 |
| QueryRemoteProtocolInformation | 无效的参数 | |
| 关闭文件 | 成功 |