我正在尝试使用 pugixml 创建一个 xml 文件。代码是;
//Open the save as diolog
TCHAR szFilters[]= _T("Files (*.abc)|*.abc|All Files (*.*)|*.*||");
// Create an SaveAs dialog; the default file name extension is ".abc".
CFileDialog fileDlg(FALSE, _T("abc"), NULL,
OFN_OVERWRITEPROMPT |OFN_CREATEPROMPT| OFN_PATHMUSTEXIST, szFilters);
// Display the file dialog.
CString pathName;
CString fileName;
if(fileDlg.DoModal() == IDOK)
{
pathName = fileDlg.GetPathName();
fileName = fileDlg.GetFileName();
::CreateFile(pathName,GENERIC_WRITE,0,NULL,CREATE_NEW, FILE_ATTRIBUTE_NORMAL|FILE_FLAG_SEQUENTIAL_SCAN,NULL);
} //File is created in explorer
else
return;
//[code_modify_add
// add node with some name
pugi::xml_document xmlDoc;
pugi::xml_parse_result result = xmlDoc.load_file(fileName);
问题是结果总是给出"file_not_found"状态,但我可以看到该文件是在 Windows 资源管理器中创建的。当我尝试在程序执行期间选择相同的文件时,它仍然返回"file_not_found"。
但是,如果我关闭程序并再次运行,然后选择文件,则结果返回 true。我
注意到在程序执行时我无法打开新创建的文件,但是当程序关闭时,我可以打开它。
这到底是怎么回事?
谢谢。
您正在创建一个文件,并使其保持打开状态,仅以零共享模式写入(意味着它不能共享),并丢弃其句柄,然后尝试重新打开文件以使用 xml 解析器读取。
您可能希望对 ::CreateFile() 的返回值使用 CloseHandle()
HANDLE hFile = ::CreateFile(pathName,GENERIC_WRITE,0,NULL,CREATE_NEW, FILE_ATTRIBUTE_NORMAL|FILE_FLAG_SEQUENTIAL_SCAN,NULL);
if (hFile == INVALID_HANDLE_VALUE) {
// Call GetLastError() to figure out why the file creation failed.
}
else
{
CloseHandle(hFile);
}