小问题两个

MMX 2000-08-14 09:20:00
请问如何在WIN32SDK编程中实现open对话框多文件名选取?FindFristFile,FindNexFile,FindCloseFile如何使用?
我要在程序中存放我自已的数据,但使用串行化数据对象存放的文件总有一个文件头,如我的数据是CObArray类型的,存放的文件头上总有个CObArray的十几个字节的头,而后才是我的数据,但我不要这个文件头,我应如何做?

还有,CSDN能否来个分数透支,不然小弟我无能,快要没分提问了。
...全文
185 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Wingsun 2000-08-18
  • 打赏
  • 举报
回复
由于打开的文件名都存储在lpstrFile中,每个文件名之间以'\0'分隔,所以每一次读取lpstrFile时都显示一个文件名。nFileOffset表示文件名在lpstrFile中的偏移量,当不是多个文件时这个数值大于0,多个文件时该值等于0。你可以跟踪一下查看他的内容,你就知道了。
MMX 2000-08-18
  • 打赏
  • 举报
回复
wingsun您好,我试了试您介绍的方法,发现无论打开几个文件,它总只显示一个文件名,即if(ofn.nFileOffset==0)此句并不起作用,是不是ofn.nFileOffset==0为打开多个文件呢?
Wingsun 2000-08-16
  • 打赏
  • 举报
回复
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中.
Wingsun 2000-08-15
  • 打赏
  • 举报
回复
标准的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中找到。
MMX 2000-08-15
  • 打赏
  • 举报
回复
很感谢两位,不过我要的是在Win32SDK编程中在文件对话框中打开的多个文件,如果使用CFileDialog和GetStartPosition和GetNextPathName我就没问题了。 我以为可以使用FindFristFile,FindNexFile,FindCloseFile在Win32SDK编程中在文件对话框中得到的多个文件名。我自已再试试吧。
你不要这个文件头, 只有你将你的大对象的没一个变量一个一个对象来串行化, 而不用MFC类对象提供的,不会吧?应有方法,我不信photoshop之类的都是这么做的。
MMX 2000-08-15
  • 打赏
  • 举报
回复
标准的Win32 SDK中的打开文件对话框是通过API:GetOpenFileName来实现的,ok,那么如何具体实现?MSDN的示例叫什么名字?请说说。我只知道用GetOpenFileName来打开单个文件,多个文件我就不知道了。MSDN上好象说要用到FindFristFile,FindNexFile,FindCloseFile的,我只能用FindFristFile,FindNexFile,FindCloseFile找到一个文件名,多于一个就成了程序自已的名称,why?
U皮特U 2000-08-14
  • 打赏
  • 举报
回复
chinabjgod说的没错,补充一点:
查找文件用CFileFind类比较方便:
CFileFind f
BOOL bFind = f.FindFile("c:\\*.cpp");
while ( bFind )
{
bFind = f.FindNextFile();
// 以下对找到文件进行处理 f.GetFileName() 得到文件名,f.IsDirectory()判断是否目录名...
}
f.Close();
chinabjgod 2000-08-14
  • 打赏
  • 举报
回复
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、完整成体系的小程序开发知识: 对于没有学习过小程序开发的同学,本课程由浅入深系统的向同学们讲解了小程序开发知识,将知识点串联起来,让同学们可以更好更快的掌握小程序开发。2、视频及相关功能开发的掌握: 借助于小程序开发使得视频方向的开发变的尤为简单,即使你是入门小白也可以熟练掌握小程序中视频的相关开发,其中涉及了视频的常规控制如播放暂停等也有比较流行的视频弹幕功能,并结合了一下视频开发中相关的性能优化问题,可以让同学们通过本课程的学习对于视频类的开发有更深层次的认识。3、打造智能闲聊小程序: 借助于网络上开放的人工智能接口,去实现智能闲聊功能,使得开发的过程不仅能够收获更多的知识也变得更加有趣。项目中虽然知识讲解了智能闲聊功能的调用,但是通过此功能的调用方法大家可以举一反三去使用更多的开发功能使得开发变得简单且有趣。4、掌握项目级开发知识及技巧: 本课程中融入了两大当前比较主流的项目实例,视频功能和人工智能。通过项目的练习不仅可以让大家掌握较为主流的项目方向且融入很多的中高级语法及项目开发知识,如ES6+的一些语法和模块化、组件化开发的知识。【课程内容设计】   设计本门课程时考虑到很多同学可能没有小程序开发相关经验,本门课程将由浅入深,渐进式的讲解知识点。我把课程分为了三个阶段分别为:初次接触、基础入门、实战提升。   1、初次接触:   主要给大家讲解小程序开发的相关知识,让大家在宏观上对向程序开发能有一定的概念。并且讲授的开发环境的搭建让大家对在开发前期做一个充分的热身。先激发起大家对线程序开发的热情,这样为下一步小程序的开发学习做一个铺垫。   2、基础入门:   这个阶段主要为入门的同学提供了一个比较全面的小程序开发基础知识知识汇总,并伴有实践的例子简单且易上手,让大家能够体验到小程序的开发乐趣,并未下一步的项目实战开发打定基础。   3、实战提升:   这个阶段为项目实践阶段,通过实战项目让大家深入了解和学习小程序开发,项目中同时融入了现在主流的视频内容,和有趣并贴近生活的智能闲聊功能,项目中涉及到的技术点也是由浅入深,同学们在掌握小程序的开发能力的同时也掌握了问题解决与深入学习的能力。 【实战项目展示】 【学习完课程你将收获】

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧