📄 remotefile.cpp
字号:
try {
nRead = localFile.Read(szBuffer, FTP_TRANSFER_BUFFER_SIZE);
if( nRead ) { client.WriteFile(szBuffer, nRead); nTotalRead += nRead; }
} catch( CException * ex ) {
CString szMessage; szMessage.Format(IDS_ERR_REMOTE_TRANSFER);
AfxMessageBox( szMessage, MB_OK | MB_ICONSTOP );
localFile.Close(); client.Close(); ex->Delete(); return FALSE;
}
if( fcnCallback ) bContinue = fcnCallback(nTotalRead);
if( ! bContinue || nRead < FTP_TRANSFER_BUFFER_SIZE ) break;
}
bTransferCompleted = bContinue;
localFile.Close(); // close local file
client.CloseFile(); client.LogOff(); client.Close();
return bTransferCompleted;
}
BOOL GetRemoteFileList(CSortStringArray & arrFileInfo, CFtpAccount & rFtpAccount, LPCTSTR lpszFilter)
{
if( rFtpAccount.m_bUseWinInet ) {
return GetRemoteFileListWinInet(arrFileInfo, rFtpAccount, lpszFilter);
} else {
return GetRemoteFileListFtpClnt(arrFileInfo, rFtpAccount, lpszFilter);
}
}
BOOL GetRemoteFileListWinInet(CSortStringArray & arrFileInfo, CFtpAccount & rFtpAccount, LPCTSTR lpszFilter)
{
if( ! rFtpAccount.IsValid() ) return FALSE;
CInternetSession clsInternetSession; CWaitCursor wait;
CFtpConnection * pFtpConnection = NULL;
try {
pFtpConnection = clsInternetSession.GetFtpConnection(
rFtpAccount.m_szServerName, rFtpAccount.m_szUserName, rFtpAccount.m_szPassword,
rFtpAccount.m_nPortNumber, rFtpAccount.m_bPassiveMode );
} catch( CException * ex ) {
ex->ReportError(MB_OK | MB_ICONSTOP);
ex->Delete(); return FALSE;
}
if( rFtpAccount.m_szSubDirectory.GetLength() ) {
if( ! pFtpConnection->SetCurrentDirectory( rFtpAccount.m_szSubDirectory ) ) {
CString szMessage; szMessage.Format(IDS_ERR_REMOTE_CWD2, rFtpAccount.m_szSubDirectory, "Not a directory?");
AfxMessageBox( szMessage, MB_OK | MB_ICONSTOP ); // return FALSE;
}
}
pFtpConnection->GetCurrentDirectory( rFtpAccount.m_szSubDirectory );
TRACE1("[PWD]: %s\n", rFtpAccount.m_szSubDirectory);
CFtpFileFind find(pFtpConnection);
BOOL bFound = find.FindFile(NULL);
arrFileInfo.RemoveAll();
while( bFound ) {
bFound = find.FindNextFile();
CString szFileInfo;
CString szName = find.GetFileName();
DWORD dwSize = find.GetLength();
TRACE2("RemoteFileList: %s (%d)\n", szName, dwSize);
if( find.IsDirectory() && ! find.IsDots() ) { szFileInfo.Format("D/%s/N", szName); arrFileInfo.Add(szFileInfo); }
if( ! find.IsDirectory() && ! find.IsNormal() ) { szFileInfo.Format("D/%s/L", szName); arrFileInfo.Add(szFileInfo); }
if( ! find.IsDirectory() && find.IsNormal() && MatchFileFilter(szName, lpszFilter) ) { szFileInfo.Format("F/%s/%d", szName, dwSize); arrFileInfo.Add(szFileInfo); }
}
pFtpConnection->Close(); delete pFtpConnection;
return TRUE;
}
BOOL GetRemoteFileListFtpClnt(CSortStringArray & arrFileInfo, CFtpAccount & rFtpAccount, LPCTSTR lpszFilter)
{
if( ! rFtpAccount.IsValid() || ! CheckIfWinSockInitialized() ) return FALSE;
CFtpClient client; CWaitCursor wait;
if( ! client.Open(rFtpAccount.m_szServerName, rFtpAccount.m_nPortNumber) ) {
CString szMessage; szMessage.Format(IDS_ERR_REMOTE_CONNECT, client.GetResponseMessage());
AfxMessageBox( szMessage, MB_OK | MB_ICONSTOP ); return FALSE;
}
if( ! client.LogOn(rFtpAccount.m_szUserName, rFtpAccount.m_szPassword) ) {
CString szMessage; szMessage.Format(IDS_ERR_REMOTE_LOGON, client.GetResponseMessage());
AfxMessageBox( szMessage, MB_OK | MB_ICONSTOP ); client.Close(); return FALSE;
}
if( rFtpAccount.m_szSubDirectory.GetLength() ) {
if( ! client.SetCurrentDirectory( rFtpAccount.m_szSubDirectory ) ) {
CString szMessage; szMessage.Format(IDS_ERR_REMOTE_CWD1, client.GetResponseMessage());
AfxMessageBox( szMessage, MB_OK | MB_ICONSTOP ); // client.Close(); return FALSE;
}
}
client.GetCurrentDirectory( rFtpAccount.m_szSubDirectory );
TRACE1("[PWD]: %s\n", rFtpAccount.m_szSubDirectory);
CStringArray arrList;
client.ListDirectory(arrList, NULL, rFtpAccount.m_bPassiveMode);
INT nSize = arrList.GetSize();
CString szMode, szTime, szName; DWORD dwSize;
arrFileInfo.RemoveAll();
for(INT i = 0; i < nSize; i++) {
CString szFileInfo, szListItem = arrList.GetAt(i);
CleanRemoteFileListItem( szListItem );
if( ! ParseRemoteFileListItem(szMode, dwSize, szTime, szName, szListItem) ) continue;
TRACE2("RemoteFileList: %s (%d)\n", szName, dwSize);
if( szMode[0] == 'd' && szName.Compare("..") && szName.Compare(".") ) { szFileInfo.Format("D/%s/N", szName); arrFileInfo.Add(szFileInfo); }
if( szMode[0] == 'l' ) { szFileInfo.Format("D/%s/L", szName); arrFileInfo.Add(szFileInfo); }
if( szMode[0] == '-' && MatchFileFilter(szName, lpszFilter) ) { szFileInfo.Format("F/%s/%d", szName, dwSize); arrFileInfo.Add(szFileInfo); }
}
client.LogOff(); client.Close();
return TRUE;
}
static BOOL CheckIfWinSockInitialized()
{
static BOOL bWinSockInitialized = FALSE;
if( ! bWinSockInitialized ) {
if( ! AfxSocketInit() ) {
AfxMessageBox("Could not initialize Windows Sockets!");
return FALSE;
}
bWinSockInitialized = TRUE;
}
return bWinSockInitialized;
}
static BOOL CleanRemoteFileListItem(CString & szItem)
{
static CRegExp clsRegExp;
static BOOL bCompiled = FALSE;
// compile regular expression for Korean HP server
if( ! bCompiled && clsRegExp.RegComp("([0-9]+)岿 ([0-9]+)老 [0-9]+:[0-9]+") ) bCompiled = TRUE;
INT nFound; CString szFormat, szReplace;
if( bCompiled && (nFound = clsRegExp.RegFind(szItem)) >= 0 ) {
INT nLength = clsRegExp.GetFoundLength();
CTime time = CTime::GetCurrentTime();
szFormat.Format("%s.\\1.\\2", time.Format("%Y"));
clsRegExp.GetReplaceString(szFormat, szReplace);
szItem = szItem.Mid(0, nFound) + szReplace + szItem.Mid(nFound + nLength);
}
if( (nFound = szItem.Find(" -> ")) >= 0 ) {
szItem = szItem.Mid(0, nFound);
}
return TRUE;
}
static BOOL ParseRemoteFileListItem(CString & szMode, DWORD & dwSize, CString & szTime, CString & szLeft, LPCTSTR lpszItem)
{
TCHAR * BEG = (TCHAR *)lpszItem, * FWD = (TCHAR *)lpszItem;
// extract file mode
while( * FWD && ! isspace(* FWD) ) FWD++;
if( FWD == BEG ) return FALSE;
szMode = CString(BEG, FWD-BEG);
// skip spaces
while( * FWD && isspace(* FWD) ) FWD++;
if( * FWD == '\0' ) return FALSE;
// advance pointer
BEG = FWD;
// skip block size, file owner, file group
for(INT i = 0; i < 3; i++) {
// skip something
while( * FWD && ! isspace(* FWD) ) FWD++;
if( * FWD == '\0' ) return FALSE;
// skip spaces
while( * FWD && isspace(* FWD) ) FWD++;
if( * FWD == '\0' ) return FALSE;
}
// advance pointer
BEG = FWD;
// extrace file size
while( * FWD && ! isspace(* FWD) ) FWD++;
if( FWD == BEG ) return FALSE;
dwSize = atoi(BEG);
// skip spaces
while( * FWD && isspace(* FWD) ) FWD++;
if( * FWD == '\0' ) return FALSE;
// advance pointer
BEG = FWD;
// extract file creation time
while( * FWD && (* FWD != ' ') && (* FWD != '.') ) FWD++;
while( * FWD && ( (* FWD == ' ') || (* FWD == '.') ) ) FWD++;
while( * FWD && (* FWD != ' ') && (* FWD != '.') ) FWD++;
while( * FWD && ( (* FWD == ' ') || (* FWD == '.') ) ) FWD++;
while( * FWD && (* FWD != ' ') && (* FWD != '.') ) FWD++;
if( FWD == BEG ) return FALSE;
szTime = CString(BEG, FWD-BEG);
/* // extract file creation time
while( * FWD && ! isspace(* FWD) ) FWD++;
if( FWD == BEG ) return FALSE;
szTime = CString(BEG, FWD-BEG); */
// skip spaces
while( * FWD && isspace(* FWD) ) FWD++;
if( * FWD == '\0' ) return FALSE;
// skip spaces
while( * FWD && isspace(* FWD) ) FWD++;
if( * FWD == '\0' ) return FALSE;
// advance pointer
BEG = FWD;
// extract file name
szLeft = BEG;
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -