CFileDialog保存多个文件

liqianfu0214 2009-04-13 05:16:36
先用CFileDialog打开对话框,多选几个文件点击打开,然后怎么把这几个文件保存到我指定的文件夹里,希望哪位大侠给我个代码,谢谢!还有为什么这样运行MoveFile(E:\music.mp3,E:\home)会报错呢?
...全文
257 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
fuqianli 2009-04-14
  • 打赏
  • 举报
回复
MoveFile(E:\music.mp3,E:\home\music.mp3)函数必须这样用,不然实现不了。
fairchild811 2009-04-13
  • 打赏
  • 举报
回复
movefile内e:\\m.mp3, e:\\m\n\m.mp3
jixingzhong 2009-04-13
  • 打赏
  • 举报
回复
POSITION CFileDialog::GetStartPosition( ) 对于选择了多个文件的情况得到第一个文件位置。
CString CFileDialog::GetNextPathName( POSITION& pos ) 对于选择了多个文件的情况得到下一个文件位置,并同时返回当前文件名。但必须已经调用过POSITION CFileDialog::GetStartPosition( )来得到最初的POSITION变量。
jixingzhong 2009-04-13
  • 打赏
  • 举报
回复
使用CFileDialog类并设置OFN_ALLOWMULTISELECT标志时,OPENFILENAME结构体的lpstrFile成员是一个指向用户申请分配的缓冲区,里面接受所选的路径和文件名列表,这个列表的每一项由一个NULL隔开,最末以两个NULL结束。nMaxFile成员指明了缓冲区的大小,如果所选择的文件名的加起来的总长度超过了此值,则DoModal函数返回IDCANCEL,如果用户试图打开超过缓冲区大小的文件集的话,CommDlgExtendedError()将返回FNERR_BUFFERTOOSMALL,这时候,lpstrFile的前两个byte将会包含实际需要的缓冲区的字节数。

如果是在Windows NT 4.0下,能被拷贝到lpstrFile缓冲区的字节数被限制在2562字节以内,如果超过将被截断。

以下是一个使用该类进行多文件名选择的例子。

#include "cderr.h" //for definition of FNERR_BUFFERTOOSMALL

CFileDialog dlg(TRUE, NULL, NULL, OFN_ALLOWMULTISELECT, NULL, NULL);
DWORD MAXFILE = 4000
dlg.m_ofn.nMaxFile = MAXFILE;
char* pc = new char[MAXFILE];
dlg.m_ofn.lpstrFile = pc;
dlg.m_ofn.lpstrFile[0] = NULL;

int iReturn = dlg.DoModal();
if(iReturn == IDOK)
...{
int nCount = 0;
POSITION pos = dlg.GetStartPosition();
while (pos != NULL)
...{
dlg.GetNextPathName(pos);
nCount++;
}
CString str;
str.Format("Successfully opened %d files ", nCount);
AfxMessageBox(str);
}
else if(iReturn == IDCANCEL)
AfxMessageBox("Cancel");

if(CommDlgExtendedError() == FNERR_BUFFERTOOSMALL)
AfxMessageBox("BUFFERTOOSMALL");
delete []pc;


如果需要进一步的信息,可以参看:http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vcmfc98/html/_mfc_cfiledialog.asp
xmrforever 2009-04-13
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 liqianfu0214 的回复:]
各位就不能给出个像样点的答案来吗?我都说过了那种方法没有用,像这种方法我自己还不会吗?晕倒!
[/Quote]

注意态度
oyljerry 2009-04-13
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 liqianfu0214 的回复:]
各位就不能给出个像样点的答案来吗?我都说过了那种方法没有用,像这种方法我自己还不会吗?晕倒!
[/Quote]
你说不能用,那你起码要检查首先是否正确读取出来,其次如果读出来了,那是写入文件不对?
liqianfu0214 2009-04-13
  • 打赏
  • 举报
回复
各位就不能给出个像样点的答案来吗?我都说过了那种方法没有用,像这种方法我自己还不会吗?晕倒!
tnswy 2009-04-13
  • 打赏
  • 举报
回复
_T("Text Files (*.txt)|*.txt|All Files (*.*)|*.*||"),
这个是用来设置对话框里面能看到的文件类型,这里设置的是 txt,你可以根据自己的需要设置。
tnswy 2009-04-13
  • 打赏
  • 举报
回复
while(mPos!=NULL)
10 {
11 pathName=mFileDlg.GetNextPathName(mPos);
12 TRACE("%s\n",pathName);
// 在这里copy文件,
CopyFile(pathName,你的目标目录,true);
//或者move文件
MoveFile(pathName,你的目录,true);


13 }
tnswy 2009-04-13
  • 打赏
  • 举报
回复
// 首先创建一个 CFIleDialog 类实例,并设置多选标志
1 CFileDialog mFileDlg(TRUE, NULL,NULL,
2 OFN_ALLOWMULTISELECT,
3 _T("Text Files (*.txt)|*.txt|All Files (*.*)|*.*||"),
4 AfxGetMainWnd());
5 CString pathName;
6 If(mFileDlg.DoModal ()==IDOK)
7 {
8 POSITION mPos=mFileDlg.GetStartPosition();
9 while(mPos!=NULL)
10 {
11 pathName=mFileDlg.GetNextPathName(mPos);
12 TRACE("%s\n",pathName);
13 }
14 }
15 else
16 TRACE(“IDCANCLE\n”);
liqianfu0214 2009-04-13
  • 打赏
  • 举报
回复
这种方法我用过了,没有用,根本就不能把它们保存到我指定的文件夹里去。
oyljerry 2009-04-13
  • 打赏
  • 举报
回复
CFileDialog参数加上OFN_ALLOWMULTISELECT

用GetStartPosition()取得第一个文件的位置,如果没有多的文件,其返回值0;
用GetNextPathName(POSITION &pos)取得文件名,并指向下一个文件的POSITION。
如:
POSITION pos;
CString str;
pos=dlg.GetStartPosition();
while(!pos)
{
str=dlg.GetNextPathName(pos);
//...
//...
}
liqianfu0214 2009-04-13
  • 打赏
  • 举报
回复
没有兄弟帮帮忙吗 我实在是没有分了哦

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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