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 无效的参数
关闭文件 成功
以上是WindowsCopyFileA失败然后成功的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>