今天我打算写一个测试程序,需要读取和写入文件,想往常一样,写了如下代码
std::wstring sourcefilename = L"F:\\1.txt";
//打开源文件
HANDLE hSourceFile = CreateFile(sourcefilename.c_str(),GENERIC_ALL,NULL,NULL,OPEN_EXISTING,NULL,NULL);
却发现访问文件失败,错误码为5(拒绝访问)。尝试访问这个磁盘下同样的文件也会失败。而后分析出这个磁盘为NTFS,会不会和这个有关系?于是我访问了另一个FAT32磁盘的文件,同样用GENERIC_ALL标志位,访问成功。
经测试,默认情况下(文件的安全性为默认,文件的安全属性为NULL),用GENERIC_ALL访问NTFS分区上已存在的文件会失败,而如果用GENERIC_READ、GENERIC_WRITE甚至GENERIC_EXECUTE都会成功。而如果访问文件不存在,则会成功(若文件存在,即使用CREATE_ALWARYS创建文件也会失败)