gpt4 book ai didi

c++ - 为什么windows下改属性为readonly后还能写入文件?

转载 作者:行者123 更新时间:2023-11-28 02:05:09 26 4
gpt4 key购买 nike

给定一个普通文件,它可以被读写。然后我通过

将此文件属性更改为 Read-only

enter image description here

但是,这个文件仍然可以通过文件处理程序写入。这是我的代码

#define CREATE_FILE_OPT FILE_ATTRIBUTE_NORMAL | FILE_FLAG_WRITE_THROUGH | FILE_FLAG_RANDOM_ACCESS
std::string name("test.txt");
HANDLE hfile = ::CreateFile(name.c_str(),
GENERIC_READ | GENERIC_WRITE, NULL, NULL, OPEN_EXISTING, CREATE_FILE_OPT, NULL);

if (hfile == INVALID_HANDLE_VALUE) {
hfile = ::CreateFile(name.c_str(),
GENERIC_READ | GENERIC_WRITE, NULL, NULL, CREATE_NEW, CREATE_FILE_OPT, NULL);
if (hfile == INVALID_HANDLE_VALUE) {
printf("so sad, invalid file handler....");
return -1;
}
}

int i = 0;
char rbuf[] = "you are";
DWORD bytesWritten;
do {
Sleep(5000);
++i;
bytesWritten = 0;
BOOL bret = ::WriteFile(hfile, rbuf, strlen(rbuf), &bytesWritten, NULL);
if (bret == FALSE) {
printf("Cannot write bytes into file.....");

DWORD err = GetLastError();

printf("The error code is %d\n", err);
}
else
printf("write %d bytes to file\n", bytesWritten);

DWORD ret = GetFileAttributes(name.c_str());
printf("The file attribute is %d\n", ret);

} while (i < 10000);

文件属性在我改成Read-only之前是32,但是这个文件是之后就是33只读

我想知道为什么文件改成Read-only后还能写入?我的测试代码有问题吗?

PS:在windows 7下的VS2015中测试

最佳答案

对不起,我终于明白你的意思了。我猜你是在谈论先创建一个文件,在不关闭程序的情况下将其设置为只读。 READONLY 属性检查仅发生在 CreateFile 例程中。

在 Windows 内核中,每个对象一旦创建就被分配一个临时访问权限列表,除非明确刷新,这种情况很少发生在固定磁盘上的实际文件上。因此,即使您在使用 NTFS 访问控制的 CreateFile 之后拒绝所有权限,您的程序的行为也将与调用 CreateFile 时一样。

总而言之,在将文件热更改为 READONLY 后,您的程序仍然可以自然地写入文件,这只会将信息写入磁盘,不会更改内核访问表。

关于c++ - 为什么windows下改属性为readonly后还能写入文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37804712/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com