调用打开文件对话框后文件写入不起作用
Posted
技术标签:
【中文标题】调用打开文件对话框后文件写入不起作用【英文标题】:file writing not working after call to open file dialog 【发布时间】:2013-06-05 07:54:37 【问题描述】:调用以下函数后,我无法写入我尝试过的任何文件 c++ fstream 和 c 的 fopen 出了什么问题,请帮助提前谢谢 我正在使用代码块 mingw windows 7
string openFileDialog(HWND hwnd,char *fileFilter,char *defaultExtension)
string fileName = "";
OPENFILENAME ofn;
char szFileName[MAX_PATH] = "";
ZeroMemory(&ofn, sizeof(ofn));
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.hwndOwner = hwnd;
ofn.lpstrFilter = fileFilter;
ofn.lpstrFile = szFileName;
ofn.nMaxFile = MAX_PATH;
ofn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
ofn.lpstrDefExt = defaultExtension;
if(GetOpenFileName(&ofn))
fileName.assign(szFileName);
ZeroMemory(&ofn, sizeof(ofn));
return fileName;
【问题讨论】:
您是否检查过您返回的字符串是否有效?当GetOpenFileName
返回FALSE
时会发生什么? 如何打开文件?你为什么在回来之前打电话给ZeroMemory
?由于不再使用该结构,因此不需要它。
fileFilter
的值是多少?这是一个棘手的问题。还有,为什么不是const
参数?
那么这个函数没有错误,但是你如何处理文件。请告诉我们您如何打开和读取/写入文件。
如果您在对话框中更改文件夹,它将更改您进程的当前文件夹 - 尝试添加 OFN_NOCHANGEDIR
标志。
如果例如fopen
失败,您应该检查 errno
。您可以使用例如strerror
获取错误的可打印文本。
【参考方案1】:
如果您在对话框中更改文件夹,它将更改您的进程的当前文件夹 - 尝试添加 OFN_NOCHANGEDIR
标志。
【讨论】:
【参考方案2】:试试 CreateFile 和 WriteFile。
string s = "file.dat";
HANDLE hFile = CreateFile(s.c_str(), // name of the write
GENERIC_WRITE, // open for writing
0, // do not share
NULL, // default security
CREATE_ALWAYS, // Creates a new file, always
FILE_ATTRIBUTE_NORMAL, // normal file
NULL); // no attr. template
DWORD writesBytes;
bool writeok = WriteFile(hFile, &Current_Doc, sizeof(Current_Doc), &writesBytes, NULL);
CloseHandle(hFile);
类似的问题,我的答案在这里:
OPENFILENAME open dialog
【讨论】:
@marbel82 它通过不更改进程的当前工作目录来解决问题。 @bartimar 我已经在 c++ 中创建了我的文件处理类,所以 win32 的文件处理不是一个选项 + 我湖声誉使你的答案有用:p以上是关于调用打开文件对话框后文件写入不起作用的主要内容,如果未能解决你的问题,请参考以下文章