【问题标题】:OPENFILENAME open dialogOPENFILENAME 打开对话框
【发布时间】:2013-05-23 10:02:48
【问题描述】:

我想通过 win32 中的打开文件对话框获取完整的文件路径。 我是通过这个函数来做的:

  string openfilename(char *filter = "Mission Files (*.mmf)\0*.mmf", HWND owner = NULL)      {
  OPENFILENAME ofn  ;
  char fileName[MAX_PATH] = "";
  ZeroMemory(&ofn, sizeof(ofn));
  ofn.lStructSize = sizeof(OPENFILENAME);
  ofn.hwndOwner = owner;
  ofn.lpstrFilter = filter;
  ofn.lpstrFile = fileName;
  ofn.nMaxFile = MAX_PATH;
  ofn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
  ofn.lpstrDefExt = "";
  ofn.lpstrInitialDir ="Missions\\";

  string fileNameStr;
  if ( GetOpenFileName(&ofn) )
    fileNameStr = fileName;

  return fileNameStr;
}

它工作正常并返回路径。但我无法写入那个文件,我用 openfilename 获取它的路径。

注意: 我调用此代码写入文件(序列化):

string Mission_Name =openfilename();
ofstream  ofs ;
ofs =  ofstream ((char*)Mission_Name.c_str(), ios::binary   );
ofs.write((char *)&Current_Doc, sizeof(Current_Doc));
ofs.close();

【问题讨论】:

  • 你检查fileNameStr的值了吗?
  • LPCSTR 演员让我毛骨悚然...MyfilePath 的声明是什么?
  • 我认为(不确定)这将是您的字符串转换中 \0 的问题。
  • Zigma 我检查了值,它是真的并且包含完整的文件路径。
  • 很多问题。不要尝试写入 c:\program 文件中的文件。不要将二进制数据写入 .txt 文件。不要忽视错误检查的要求。

标签: c++ file winapi


【解决方案1】:

试试这个写:

string s = openfilename();

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 writes;
bool writeok = WriteFile(hFile, &Current_Doc, sizeof(Current_Doc), &writes, NULL);

CloseHandle(hFile);

...然后阅读:

HANDLE hFile = CreateFile(s.c_str(),       // name of the write
                   GENERIC_READ,           // open for reading
                   0,                      // do not share
                   NULL,                   // default security
                   OPEN_EXISTING,          // Creates a new file, always
                   FILE_ATTRIBUTE_NORMAL,  // normal file
                   NULL);                  // no attr. template
DWORD readed;
bool readok = ReadFile(hFile, &Current_Doc, sizeof(Current_Doc), &readed, NULL);

CloseHandle(hFile);

帮助链接:

http://msdn.microsoft.com/en-us/library/windows/desktop/bb540534%28v=vs.85%29.aspx

http://msdn.microsoft.com/en-us/library/windows/desktop/aa363858%28v=vs.85%29.aspx

【讨论】:

    【解决方案2】:

    尝试关闭它然后重新打开以进行写作。

    【讨论】:

      猜你喜欢
      • 2022-06-17
      • 1970-01-01
      • 2015-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-11
      • 2010-12-27
      相关资源
      最近更新 更多