1:  在你的文件打开对话框中, 设置 OFN_ALLOWMULTISELECT标志
  CFileDialog fOpen(TRUE,NULL,NULL, OFN_ALLOWMULTISELECT|OFN_HIDEREADONLY |
     OFN_OVERWRITEPROMPT,  NULL,  NULL );
2:  FindFristFile,FindNexFile,FindCloseFile的使用没啥困难的, 其方法是首先用FindFristFile找到一个开始开始点, 然后利用FindNexFile一个一个查找, 当结束是要调用FindCloseFile, 以下是一个例程, 查找当前目录下的所有文件:
char string[MAX_PATH];
WIN32_FIND_DATA finddata;
HANDLE handle;
         BOOL bret; finddata.dwFileAttributes=FILE_ATTRIBUTE_DIRECTORY;
strcpy(string,"*.dat");  //find *.dat file handle=FindFirstFile(string,&finddata1);
while(bret && handle=INVALID_HANDLE_VALUE)
{ finddata1.cFileName;   //file name bret=FindNextFile(handle,&finddata1);
}
FindClose(handle1);    不过如果你是要查找文件对话框中打开的多个文件, 需要用GetStartPosition和GetNextPathName.
3. 你不要这个文件头, 只有你将你的大对象的没一个变量一个一个对象来串行化, 而不用MFC类对象提供的, 不过即使那样, 也可能有一些你可能不需要的信息, 最彻底的只有你自己定义, 直接写了

解决方案 »

  1.   

    chinabjgod说的没错,补充一点:
    查找文件用CFileFind类比较方便:
    CFileFind f
    BOOL bFind = f.FindFile("c:\\*.cpp");
    while ( bFind )
    {
      bFind = f.FindNextFile();
      // 以下对找到文件进行处理 f.GetFileName() 得到文件名,f.IsDirectory()判断是否目录名...
    }
    f.Close();
      

  2.   

    很感谢两位,不过我要的是在Win32SDK编程中在文件对话框中打开的多个文件,如果使用CFileDialog和GetStartPosition和GetNextPathName我就没问题了。 我以为可以使用FindFristFile,FindNexFile,FindCloseFile在Win32SDK编程中在文件对话框中得到的多个文件名。我自已再试试吧。
    你不要这个文件头, 只有你将你的大对象的没一个变量一个一个对象来串行化, 而不用MFC类对象提供的,不会吧?应有方法,我不信photoshop之类的都是这么做的。 
      

  3.   

    标准的Win32 SDK中的打开文件对话框是通过API:GetOpenFileName来实现的,
    BOOL GetOpenFileName(
      LPOPENFILENAME lpofn   // address of structure with initialization 
                             // data);
    这个函数使用一个参数lpofn,类型为LPOPENFILENAME .
    typedef struct tagOFN { // ofn     
    DWORD         lStructSize; 
    HWND          hwndOwner;     
    HINSTANCE     hInstance;     
    LPCTSTR       lpstrFilter;     
    LPTSTR        lpstrCustomFilter; 
    DWORD         nMaxCustFilter;     
    DWORD         nFilterIndex; 
    LPTSTR        lpstrFile;     
    DWORD         nMaxFile; 
    LPTSTR        lpstrFileTitle;     
    DWORD         nMaxFileTitle; 
    LPCTSTR       lpstrInitialDir;     
    LPCTSTR       lpstrTitle; 
    DWORD         Flags;     
    WORD          nFileOffset; 
    WORD          nFileExtension;     
    LPCTSTR       lpstrDefExt; 
    DWORD         lCustData;     
    LPOFNHOOKPROC lpfnHook; 
    LPCTSTR       lpTemplateName; 
    } OPENFILENAME; 
    在MSDN中有一个例子,你可以看一看,这些信息也可以再MSDN中找到。
      

  4.   

    标准的Win32 SDK中的打开文件对话框是通过API:GetOpenFileName来实现的,ok,那么如何具体实现?MSDN的示例叫什么名字?请说说。我只知道用GetOpenFileName来打开单个文件,多个文件我就不知道了。MSDN上好象说要用到FindFristFile,FindNexFile,FindCloseFile的,我只能用FindFristFile,FindNexFile,FindCloseFile找到一个文件名,多于一个就成了程序自已的名称,why?
      

  5.   

    GEtOpenFileName使用如下:
    OPENFILENAME    ofn; 
    char            szFile[256], szFileTitle[256]; 
    char     szFilter[]="All File\0*.*\0*.wmf\0*.wmf\0\0"; 
    UINT            uiSize; 
    HANDLE          hFile, hMapFile; 
    LPVOID          pMapFile; 
    DWORD           dwHigh, dwLow; 

    strcpy(szFile, ""); 
    ofn.lStructSize = sizeof(OPENFILENAME); 
    ofn.hwndOwner =m_hWnd; 
    ofn.lpstrFilter = szFilter; 
    ofn.lpstrCustomFilter = (LPSTR) NULL; 
    ofn.nMaxCustFilter = 0L; 
    ofn.nFilterIndex = 1; 
    ofn.lpstrFile = szFile; 
    ofn.nMaxFile = sizeof(szFile); 
    ofn.lpstrFileTitle = szFileTitle; 
    ofn.nMaxFileTitle = sizeof(szFileTitle); 
    ofn.lpstrInitialDir = NULL; 
    ofn.lpstrTitle = "Hello"; 
    ofn.Flags = OFN_ALLOWMULTISELECT|OFN_EXPLORER; 
    ofn.nFileOffset = 0; 
    ofn.nFileExtension = 0; 
    ofn.lpstrDefExt = "WMF"; 

    if(GetOpenFileName(&ofn))
    {
    if(ofn.nFileOffset==0)//多个文件
    {
    char Buf[MAX_PATH];
    char Path[MAX_PATH];
    char * Pos;
    Pos=szFile;
    strcpy(Path,Pos);
    char ch;
    Pos+=ofn.nFileOffset;
    Pos+=strlen(Path);
    Pos++;
    do
    {
    strcpy(Buf,Pos);
    char file[MAX_PATH];
    strcpy(file,Path);
    strcat(file,"\\");
    strcat(file,Buf);
    AfxMessageBox(file,MB_OK,0);
    Pos+=strlen(Buf);
    Pos++;
    ch=*Pos;
    }while(ch!='\0');
    }
    else//单个文件
    {
    AfxMessageBox(szFile,MB_OK,0);
    }
    }
    关于使用FindFirstFile等是当你使用OldStyle的打开对话框时(也就是Win31下的那种对话框),你需要使用这些函数来进行长文件和短文件名之间的转换。打开的文件名,都存储在lpstrFile中.
      

  6.   

    wingsun您好,我试了试您介绍的方法,发现无论打开几个文件,它总只显示一个文件名,即if(ofn.nFileOffset==0)此句并不起作用,是不是ofn.nFileOffset==0为打开多个文件呢?
      

  7.   

    由于打开的文件名都存储在lpstrFile中,每个文件名之间以'\0'分隔,所以每一次读取lpstrFile时都显示一个文件名。nFileOffset表示文件名在lpstrFile中的偏移量,当不是多个文件时这个数值大于0,多个文件时该值等于0。你可以跟踪一下查看他的内容,你就知道了。