⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 remotefile.cpp

📁 Crimson编辑器的英文版,完成从韩文版变成英文版的移植,并且附带可执行文件和注册表文件,无需原先的安装包,是改写编辑器的最理想选择.
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		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 + -