为什么隐藏文件无法在 MFC 中的创建和写入模式下打开?
Why hidden file can't be open in create and write mode in MFC?
我正在使用Visual C++ 2010和MFC编写一个小程序。
以下是我的代码:
CFile MyFile;
CFileException* pException = NULL;
CString strErrorMessage;
// The Test.txt is a hidden file that I created already.
if (!MyFile.Open(_T("E:\Test.txt"), CFile::modeWrite | CFile::modeCreate, pException))
{
TCHAR lpCause[255];
pException->GetErrorMessage(lpCause, 255);
strErrorMessage += lpCause;
}
// ...
// rewrite the Test.txt
// ...
MyFile.Close();
以下是我的问题:
1.运行代码时,出现未处理的异常。那么如何修改我的代码以使其工作呢?
2.我尝试删除Test.txt隐藏文件属性,它似乎工作得很好。我想知道:为什么具有文件隐藏属性的文件(存在)无法在创建和写入模式下打开?
谢谢。
pException
只初始化为NULL
,它没有被分配。您应该分配它,或者只是声明CFileException exception;
并将地址传递&exception
。此外,如果CFile::Open
失败,请不要尝试关闭文件。
CFile 的文档说不要对现有文件使用CFile::modeCreate
,因为它会引发异常。推理并不完全正确。
在Visual Studio 15中,MFC的CFile::Open
源代码显示:
// map creation flags
if (nOpenFlags & modeCreate)
{
if (nOpenFlags & modeNoTruncate)
dwCreateFlag = OPEN_ALWAYS;
else
dwCreateFlag = CREATE_ALWAYS;
}
else
dwCreateFlag = OPEN_EXISTING;
...
CreateFile(... nOpenFlags ...)
CFile::modeCreate
(不带modeNoTruncate
)在 API 中设置标志CREATE_ALWAYS
CreateFile
。WinAPI 文档 for CreateFile 说
如果指定了
CREATE_ALWAYS
和FILE_ATTRIBUTE_NORMAL
,则CreateFile
失败并将最后一个错误设置为ERROR_ACCESS_DENIED
如果文件出现 存在并具有FILE_ATTRIBUTE_HIDDEN
或FILE_ATTRIBUTE_SYSTEM
属性。若要避免此错误,请指定与 现有文件。
这就解释了为什么该函数仅对现有和隐藏的文件失败。
要解决此问题,我们可以添加modeNoTruncate
强制OPEN_ALWAYS
.如果需要,请使用CFile::SetLength(0)
截断文件。
CFile MyFile;
CFileException exception;
CString strErrorMessage;
CString filename = _T("e:\Test.txt");
if(MyFile.Open(filename, CFile::modeWrite | CFile::modeCreate | CFile::modeNoTruncate,
&exception))
{
//SetLength(0) if file needs to truncate
MyFile.SetLength(0);
MyFile.Close();
}
else
{
TCHAR lpCause[255];
exception.GetErrorMessage(lpCause, 255);
strErrorMessage += lpCause;
}
或者,测试旧文件是否存在,如果文件不存在,则添加CFile::modeCreate
。再次后跟SetLength(0)
以截断文件。
UINT flags = CFile::modeWrite;
if(!PathFileExists(filename))
flags |= CFile::modeCreate;
if (MyFile.Open(filename, flags, &exception))
{
MyFile.SetLength(0);
MyFile.Close();
}
- 当注入程序的内存空间时,如何读取从 0 到 0xFFFFFFFFF 的每个字节?我正在创建模式扫描仪
- 在C++中创建观察器设计模式的好方法
- 基于模式创建位掩码作为 constexpr
- 无法在硬件模式下创建 SGX 安全区 - "invalid launch token"即使文档将无效的启动令牌指定为第一个
- 为什么隐藏文件无法在 MFC 中的创建和写入模式下打开?
- 如何创建一个新过程,而没有从管理模式运行的MFC应用程序中的管理特权
- 用于存储由第一个功能创建的指针的设计模式将在以后使用
- 替换decorator模式以强制执行创建顺序
- 当主GUI线程被阻塞时,如何从工作线程创建无模式对话框
- 模板化的使用是否为具有自定义键的unordered_map/set创建了一个良好的模式
- Qt:当主窗口被模式QDialog阻止时,如何聚焦从主窗口创建的无模式QDialog
- C 双重调度,出厂模式或一种从接收到的序列数据创建派生对象的方法
- 如何创建一个可以在GUI对话模式下或通过命令行启动的C MFC程序
- 如何在 3D 模式下为 VTK 创建等值线
- 如何删除在设计器模式下创建的插槽
- 使用嵌套 while 循环创建模式
- 当周围有线程时,创建类的许多实例会失败吗?- 单例模式
- 为什么每当我创建一个新的C++项目时,Eclipse都默认为调试模式
- 如何使用基于现有文件数据库的模式创建内存中数据库
- 从用户模式创建BSOD