小问题两个

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

还有,CSDN能否来个分数透支,不然小弟我无能,快要没分提问了。
...全文
184 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类对象提供的, 不过即使那样, 也可能有一些你可能不需要的信息, 最彻底的只有你自己定义, 直接写了

16,471

社区成员

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

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

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