📄 upddemo.c
字号:
return TRUE ;
case WM_COMMAND:
switch (LOWORD (wParam))
{
case IDCANCEL: // button for user to abort download
params.bContinue = FALSE ;
return TRUE ;
case IDOK: // button to make dialog box go away
EndDialog (hwnd, 0) ;
return TRUE ;
}
}
return FALSE ;
}
/*----------------------------------------------------------------------
FtpThread: Reads files from FTP server and copies them to local disk
----------------------------------------------------------------------*/
void FtpThread (PVOID parg)
{
BOOL bSuccess ;
HINTERNET hIntSession, hFtpSession, hFind ;
HWND hwndStatus, hwndButton ;
PARAMS * pparams ;
TCHAR szBuffer [64];
WIN32_FIND_DATA finddata ;
pparams = parg ;
hwndStatus = GetDlgItem (pparams->hwnd, IDC_STATUS) ;
hwndButton = GetDlgItem (pparams->hwnd, IDCANCEL) ;
// Open an internet session
hIntSession = InternetOpen (szAppName, INTERNET_OPEN_TYPE_PRECONFIG,
NULL, NULL, INTERNET_FLAG_ASYNC) ;
if (hIntSession == NULL)
{
wsprintf (szBuffer, TEXT ("InternetOpen error %i"), GetLastError ()) ;
ButtonSwitch (hwndStatus, hwndButton, szBuffer) ;
_endthread () ;
}
SetWindowText (hwndStatus, TEXT ("Internet session opened...")) ;
// Check if user has pressed Cancel
if (!pparams->bContinue)
{
InternetCloseHandle (hIntSession) ;
ButtonSwitch (hwndStatus, hwndButton, NULL) ;
_endthread () ;
}
// Open an FTP session.
hFtpSession = InternetConnect (hIntSession, FTPSERVER,
INTERNET_DEFAULT_FTP_PORT,
NULL, NULL, INTERNET_SERVICE_FTP, 0, 0) ;
if (hFtpSession == NULL)
{
InternetCloseHandle (hIntSession) ;
wsprintf (szBuffer, TEXT ("InternetConnect error %i"),
GetLastError ()) ;
ButtonSwitch (hwndStatus, hwndButton, szBuffer) ;
_endthread () ;
}
SetWindowText (hwndStatus, TEXT ("FTP Session opened...")) ;
// Check if user has pressed Cancel
if (!pparams->bContinue)
{
InternetCloseHandle (hFtpSession) ;
InternetCloseHandle (hIntSession) ;
ButtonSwitch (hwndStatus, hwndButton, NULL) ;
_endthread () ;
}
// Set the directory
bSuccess = FtpSetCurrentDirectory (hFtpSession, DIRECTORY) ;
if (!bSuccess)
{
InternetCloseHandle (hFtpSession) ;
InternetCloseHandle (hIntSession) ;
wsprintf (szBuffer, TEXT ("Cannot set directory to %s"),
DIRECTORY) ;
ButtonSwitch (hwndStatus, hwndButton, szBuffer) ;
_endthread () ;
}
SetWindowText (hwndStatus, TEXT ("Directory found...")) ;
// Check if user has pressed Cancel
if (!pparams->bContinue)
{
InternetCloseHandle (hFtpSession) ;
InternetCloseHandle (hIntSession) ;
ButtonSwitch (hwndStatus, hwndButton, NULL) ;
_endthread () ;
}
// Get the first file fitting the template
hFind = FtpFindFirstFile (hFtpSession, TEMPLATE,
&finddata, 0, 0) ;
if (hFind == NULL)
{
InternetCloseHandle (hFtpSession) ;
InternetCloseHandle (hIntSession) ;
ButtonSwitch (hwndStatus, hwndButton, TEXT ("Cannot find files")) ;
_endthread () ;
}
do
{
// Check if user has pressed Cancel
if (!pparams->bContinue)
{
InternetCloseHandle (hFind) ;
InternetCloseHandle (hFtpSession) ;
InternetCloseHandle (hIntSession) ;
ButtonSwitch (hwndStatus, hwndButton, NULL) ;
_endthread () ;
}
// Copy file from internet to local hard disk, but fail
// if the file already exists locally
wsprintf (szBuffer, TEXT ("Reading file %s..."), finddata.cFileName) ;
SetWindowText (hwndStatus, szBuffer) ;
FtpGetFile (hFtpSession,
finddata.cFileName, finddata.cFileName, TRUE,
FILE_ATTRIBUTE_NORMAL, FTP_TRANSFER_TYPE_BINARY, 0) ;
}
while (InternetFindNextFile (hFind, &finddata)) ;
InternetCloseHandle (hFind) ;
InternetCloseHandle (hFtpSession) ;
InternetCloseHandle (hIntSession) ;
ButtonSwitch (hwndStatus, hwndButton, TEXT ("Internet Download Complete"));
}
/*-----------------------------------------------------------------------
ButtonSwitch: Displays final status message and changes Cancel to OK
-----------------------------------------------------------------------*/
VOID ButtonSwitch (HWND hwndStatus, HWND hwndButton, TCHAR * szText)
{
if (szText)
SetWindowText (hwndStatus, szText) ;
else
SetWindowText (hwndStatus, TEXT ("Internet Session Cancelled")) ;
SetWindowText (hwndButton, TEXT ("OK")) ;
SetWindowLong (hwndButton, GWL_ID, IDOK) ;
}
/*-----------------------------------------------------------------------
GetFileList: Reads files from disk and saves their names and contents
-----------------------------------------------------------------------*/
FILELIST * GetFileList (void)
{
DWORD dwRead ;
FILELIST * plist ;
HANDLE hFile, hFind ;
int iSize, iNum ;
WIN32_FIND_DATA finddata ;
hFind = FindFirstFile (TEMPLATE, &finddata) ;
if (hFind == INVALID_HANDLE_VALUE)
return NULL ;
plist = NULL ;
iNum = 0 ;
do
{
// Open the file and get the size
hFile = CreateFile (finddata.cFileName, GENERIC_READ, FILE_SHARE_READ,
NULL, OPEN_EXISTING, 0, NULL) ;
if (hFile == INVALID_HANDLE_VALUE)
continue ;
iSize = GetFileSize (hFile, NULL) ;
if (iSize == (DWORD) -1)
{
CloseHandle (hFile) ;
continue ;
}
// Realloc the FILELIST structure for a new entry
plist = realloc (plist, sizeof (FILELIST) + iNum * sizeof (FILEINFO));
// Allocate space and save the filename
plist->info[iNum].szFilename = malloc (lstrlen (finddata.cFileName) +
sizeof (TCHAR)) ;
lstrcpy (plist->info[iNum].szFilename, finddata.cFileName) ;
// Allocate space and save the contents
plist->info[iNum].szContents = malloc (iSize + 1) ;
ReadFile (hFile, plist->info[iNum].szContents, iSize, &dwRead, NULL);
plist->info[iNum].szContents[iSize] = 0 ;
CloseHandle (hFile) ;
iNum ++ ;
}
while (FindNextFile (hFind, &finddata)) ;
FindClose (hFind) ;
// Sort the files by filename
qsort (plist->info, iNum, sizeof (FILEINFO), Compare) ;
plist->iNum = iNum ;
return plist ;
}
/*----------------------------
Compare function for qsort
----------------------------*/
int Compare (const FILEINFO * pinfo1, const FILEINFO * pinfo2)
{
return lstrcmp (pinfo2->szFilename, pinfo1->szFilename) ;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -