问题描述
- 关于 CFileDialog函数的使用问题
- 我在编一个CSocket的s/c模式的简单聊天程序,其中涉及到简单文件传输
接收文件的时候用到了这个另存为的函数
代码如下
CSocket cliSock;
cliSock.Create();if(!cliSock.Connect((LPCTSTR)m_strip1001)){ AfxMessageBox(""未发送文件!""); return;}SOCKET_STREAM_FILE_INFO StreamFileInfo;cliSock.Receive(&StreamFileInfosizeof(SOCKET_STREAM_FILE_INFO));CString type=StreamFileInfo.szFileTitle;const char *ty=(LPCTSTR)type;CFileDialog dlg(falsetyty);if(IDOK!=dlg.DoModal()) return;strcpy(StreamFileInfo.szFileTitledlg.GetFileName());CFile myFile(StreamFileInfo.szFileTitle CFile::modeCreate | CFile::modeWrite | CFile::typeBinary);AfxMessageBox(StreamFileInfo.szFileTitle);UINT nSize=0;UINT nData=0;while (nSize < StreamFileInfo.nFileSizeLow)//分段接收{ byte * szBuf=new byte[1024]; nData=cliSock.Receive(szBuf 1024); myFile.Write(szBuf nData); nSize+=nData;}SetFileTime((HANDLE)myFile.m_hFile/*系统文件句柄*/&StreamFileInfo.ftCreationTime/*文件创建时间*/ &StreamFileInfo.ftLastAccessTime/*文件上一次访问时间*/&StreamFileInfo.ftLastWriteTime)/*文件上一次修改时间*/;//设置文件的创建、访问、上次修改时间,myFile.Close();SetFileAttributes(StreamFileInfo.szFileTitleStreamFileInfo.dwFileAttributes);//设置文件属性cliSock.Close();AfxMessageBox(""接收完毕!"");
}
CFileDialog dlg(FALSE NULL tyOFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY NULL);
两个问题,
第一,这个函数需要设置存储文件类型,难道我需要把所有传输文件类型都写上去么?有没有更好的办法?
第二,程序运行后接收到的文件并没有存储到另存为窗口的指定文件夹,反而存储到了我编程文件的那个文件夹下面,问题在哪里?翻遍兜里也找不到可以悬赏的C币QAQ
小妹是初学者,跪求指点!
解决方案
strcpy(StreamFileInfo.szFileTitledlg.GetFileName());
这里不应该用GetFileName(),它只获得文件名,不带路径。应该用GetPathName(),能够带全路径。如果你只用文件名,那么就会存储到相对路径下,就是你现在的工程路径
解决方案二:
dlg.m_ofn.lpstrInitialDir = 指定初始目录
需要设置存储文件类型,这是可选的,不一定,这里的类型说的是扩展名
解决方案三:
第一个问题没看明白意思......
解决方案四:
第一,这个函数需要设置存储文件类型,难道我需要把所有传输文件类型都写上去么?有没有更好的办法?
你需要自定义协议,比如带个包头,里面是文件名(包含扩展名)和文件大小信息,接收端接收到这个包以后就知道接下来要接收的文件的名称和大小信息了。
时间: 2025-01-24 04:59:31