?? peerfileoperator.cpp
字號:
?
+
// PeerFileOperator.cpp: implementation of the PeerFileOperator.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "PeerFileOperator.h"
#include "command.h"
#include "peersocket.h"
#include "shellapi.h"
////////得到驅動器名稱//////////////
bool PeerFileGetDriver(SOCKET s,WSAEVENT hEvent)
{
DWORD retLen;
DRIVER driver;
///////////發送////////////////
char sdriver[10];
int count=0;
int maskdriver;
int drivertype;
if(!(maskdriver=GetLogicalDrives()))
return false;
for(int i=0;i<26;i++)
{
if(!(maskdriver>>i)) //得到所有驅動器號
break;
if(maskdriver>>i&1)
{
sdriver[0]=i+'A';
sdriver[1]=':';
sdriver[2]=0;
drivertype=GetDriveType(sdriver);
strcpy(driver.driver,sdriver);
driver.drivertype=drivertype;
PeerSendDataS(s,(char*)&driver,sizeof(driver),&retLen,
hEvent,SENDRECV_TIMEOUT);
}
}
return true;
}
//////得到文件及其屬性
bool PeerFileGetAttrib(SOCKET s,WSAEVENT hEvent)
{
DWORD retLen;
HANDLE hFile;
FILEATTRIB attrib;
WIN32_FIND_DATA WFD;
//得到需返回那個目錄的文件信息
if(!PeerRecvDataS(s,(char*)&attrib,sizeof(attrib),&retLen,
hEvent,SENDRECV_TIMEOUT))
return false;
//查找第一個文件
if((hFile=FindFirstFile(attrib.filename,&WFD))==INVALID_HANDLE_VALUE)
return false;
SHFILEINFO shfi;
DWORD len;
char slen[32];
char stime[32];
SYSTEMTIME systime;
FILETIME localtime;
memset(&shfi,0,sizeof(shfi));
//得到文件的相關信息
SHGetFileInfo(WFD.cFileName,
FILE_ATTRIBUTE_NORMAL,
&shfi, sizeof(shfi),
SHGFI_ICON|SHGFI_USEFILEATTRIBUTES|SHGFI_TYPENAME );
//寫入文件信息結構
strcpy(attrib.filename,WFD.cFileName);
strcpy(attrib.attrib,WFD.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY?"文件夾":shfi.szTypeName);
len=(WFD.nFileSizeHigh*MAXDWORD+WFD.nFileSizeLow)/1024;
sprintf(slen,"%dK",len);
strcpy(attrib.len,WFD.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY?"":slen);
//轉化格林時間到本地時間
FileTimeToLocalFileTime(&WFD.ftLastWriteTime,&localtime);
FileTimeToSystemTime(&localtime,&systime);
sprintf(stime,"%4d-%02d-%02d %02d:%02d:%02d",
systime.wYear,systime.wMonth,systime.wDay,systime.wHour,
systime.wMinute,systime.wSecond);
strcpy(attrib.time,stime);
//發送第一個文件信息
if(strcmp(WFD.cFileName,".")!=0&&
strcmp(WFD.cFileName,"..")!=0)
PeerSendDataS(s,(char*)&attrib,sizeof(attrib),&retLen,
hEvent,SENDRECV_TIMEOUT);
while(hFile)
{
//查完所有信息
if(FindNextFile(hFile,&WFD))
{
if(strcmp(WFD.cFileName,".")==0||
strcmp(WFD.cFileName,"..")==0)
continue;
memset(&shfi,0,sizeof(shfi));
SHGetFileInfo(WFD.cFileName,
FILE_ATTRIBUTE_NORMAL,
&shfi, sizeof(shfi),
SHGFI_ICON|SHGFI_USEFILEATTRIBUTES|SHGFI_TYPENAME );
strcpy(attrib.filename,WFD.cFileName);
strcpy(attrib.attrib,WFD.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY?"文件夾":shfi.szTypeName);
len=(WFD.nFileSizeHigh*MAXDWORD+WFD.nFileSizeLow)/1024;
sprintf(slen,"%dK",len);
strcpy(attrib.len,WFD.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY?"":slen);
FileTimeToLocalFileTime(&WFD.ftLastWriteTime,&localtime);
FileTimeToSystemTime(&localtime,&systime);
sprintf(stime,"%4d-%02d-%02d %02d:%02d:%02d",
systime.wYear,systime.wMonth,systime.wDay,systime.wHour,
systime.wMinute,systime.wSecond);
strcpy(attrib.time,stime);
PeerSendDataS(s,(char*)&attrib,sizeof(attrib),&retLen,
hEvent,SENDRECV_TIMEOUT);
}
else
{
if(GetLastError()==ERROR_NO_MORE_FILES)
break;
}
}
FindClose(hFile);
return true;
}
/////保存發送過來的文件///////////////////
bool PeerFileSave(SOCKET s,WSAEVENT hEvent)
{
char buf[4096];
bool iffalse=false;
DWORD retLen;
FILEINFO fi;
while(1)
{
if(!PeerRecvDataS(s,(char*)&fi,sizeof(fi),&retLen,
hEvent,SENDRECV_TIMEOUT)||retLen!=sizeof(fi))
return false;
FILE *fp;
if(!(fp=fopen(fi.filename,"wb+")))
return false;
DWORD dwGetSize=0;
while(dwGetSize<fi.filesize)
{
if(fi.filesize-dwGetSize>4096)
{
if(!PeerRecvDataS(s,buf,4096,&retLen,
hEvent,SENDRECV_TIMEOUT))
{
fclose(fp);
DeleteFile(fi.filename);
return false;
}
else
if(fwrite(buf,sizeof(char),4096,fp)!=4096)
{
fclose(fp);
DeleteFile(fi.filename);
return false;
}
else
dwGetSize+=4096;
}
else
{
if(!PeerRecvDataS(s,buf,fi.filesize-dwGetSize,&retLen,
hEvent,SENDRECV_TIMEOUT))
{
fclose(fp);
DeleteFile(fi.filename);
return false;
}
else
if(fwrite(buf,sizeof(char),fi.filesize-dwGetSize,fp)!=fi.filesize-dwGetSize)
{
fclose(fp);
DeleteFile(fi.filename);
return false;
}
else
dwGetSize+=fi.filesize-dwGetSize;
}
}
fclose(fp);
}
return true;
}
/////////////發送文件到客戶端///////////////
bool PeerFileSend(SOCKET s,WSAEVENT hEvent)
{
char buf[4096];
DWORD retLen;
FILEINFO fi;
while(1)
{
if(!PeerRecvDataS(s,(char*)&fi,sizeof(fi),&retLen,
hEvent,SENDRECV_TIMEOUT)||retLen!=sizeof(fi))
return false;
FILE *fp;
if(!(fp=fopen(fi.filename,"rb")))
return false;
DWORD dwGetSize=0;
if(fseek(fp,0l,SEEK_END))
{
fclose(fp);
return false;
}
if((dwGetSize=ftell(fp))==-1)
{
fclose(fp);
return false;
}
if(fseek(fp,0l,SEEK_SET))
{
fclose(fp);
return false;
}
fi.filesize=dwGetSize;
if(!PeerSendDataS(s,(char*)&fi,sizeof(fi),&retLen,hEvent))
{
fclose(fp);
return false;
}
DWORD fcount;
while((fcount=fread(buf,sizeof(char),4096,fp)))
{
if(!PeerSendDataS(s,buf,fcount,&retLen,hEvent,SENDRECV_TIMEOUT)||retLen!=fcount)
{
fclose(fp);
return false;
}
}
fclose(fp);
}
return true;
}
/////創建文件夾
bool PeerFileDirCreate(SOCKET s,WSAEVENT hEvent)
{
DWORD retLen;
FILEINFO fi;
COMMAND com;
if(!PeerRecvDataS(s,(char*)&fi,sizeof(fi),&retLen,
hEvent,SENDRECV_TIMEOUT)||retLen!=sizeof(fi))
return false;
if(::CreateDirectory(fi.filename,NULL))
{
com.CommandID=PEER_CFM_OK;
}
else
{
com.CommandID=PEER_CFM_ERR;
}
PeerSendDataS(s,(char*)&com,sizeof(com),&retLen,
hEvent,SENDRECV_TIMEOUT);
return true;
}
////////執行程序////////////
bool PeerFileExcute(SOCKET s,WSAEVENT hEvent)
{
DWORD retLen;
FILEINFO fi;
if(!PeerRecvDataS(s,(char*)&fi,sizeof(fi),&retLen,
hEvent,SENDRECV_TIMEOUT)||retLen!=sizeof(fi))
return false;
ShellExecute(NULL, "open", fi.filename, NULL,NULL, SW_SHOWNORMAL);
return true;
}
/////////刪除文件或目錄//////////////
bool PeerFileDelete(SOCKET s,WSAEVENT hEvent)
{
DWORD retLen;
FILEINFO fi;
COMMAND com;
while(1)
{
if(!PeerRecvDataS(s,(char*)&fi,sizeof(fi),&retLen,
hEvent,SENDRECV_TIMEOUT)||retLen!=sizeof(fi))
return false;
if(fi.dir)
{
if(RemoveDirectory(fi.filename))
com.CommandID=PEER_CFM_OK;
else
com.CommandID=PEER_CFM_ERR;
}
else
{
if(DeleteFile(fi.filename))
com.CommandID=PEER_CFM_OK;
else
com.CommandID=PEER_CFM_ERR;
}
PeerSendDataS(s,(char*)&com,sizeof(com),&retLen,
hEvent,SENDRECV_TIMEOUT);
}
return true;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -