我在編一個CSocket的s/c模式的簡單聊天程序,其中涉及到簡單文件傳輸
接收文件的時候用到了這個另存為的函數
代碼如下
CSocket cliSock;
cliSock.Create();
if(!cliSock.Connect((LPCTSTR)m_strip,1001))
{
AfxMessageBox("未發送文件!");
return;
}
SOCKET_STREAM_FILE_INFO StreamFileInfo;
cliSock.Receive(&StreamFileInfo,sizeof(SOCKET_STREAM_FILE_INFO));
CString type=StreamFileInfo.szFileTitle;
const char *ty=(LPCTSTR)type;
CFileDialog dlg(false,ty,ty);
if(IDOK!=dlg.DoModal()) return;
strcpy(StreamFileInfo.szFileTitle,dlg.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.szFileTitle,StreamFileInfo.dwFileAttributes);//設置文件屬性
cliSock.Close();
AfxMessageBox("接收完畢!");
}
CFileDialog dlg(FALSE, NULL, ty,OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY, NULL);
兩個問題,
第一,這個函數需要設置存儲文件類型,難道我需要把所有傳輸文件類型都寫上去麼?有沒有更好的辦法?
第二,程序運行後接收到的文件並沒有存儲到另存為窗口的指定文件夾,反而存儲到了我編程文件的那個文件夾下面,問題在哪裡?
翻遍兜裡也找不到可以懸賞的C幣QAQ
小妹是初學者,跪求指點!
strcpy(StreamFileInfo.szFileTitle,dlg.GetFileName());
這裡不應該用GetFileName(),它只獲得文件名,不帶路徑。應該用GetPathName(),能夠帶全路徑。如果你只用文件名,那麼就會存儲到相對路徑下,就是你現在的工程路徑