Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
WinINet permite que os aplicativos naveguem e manipulem diretórios e arquivos em um servidor ftp. Como os proxies CERN não suportam FTP, os aplicativos que usam exclusivamente um proxy CERN devem usar a funçãoInternetOpenUrl. Para obter mais informações sobre como usar InternetOpenUrl , consulte Acessando URLs diretamente.
Para iniciar uma sessão FTP, use InternetConnect para criar o identificador de sessão.
WinINet permite que você execute as seguintes ações em um servidor FTP:
- Navegue entre diretórios.
- Enumere, crie, remova e renomeie diretórios.
- Renomeie, carregue, baixe e exclua arquivos.
A navegação é fornecida pelo FtpGetCurrentDirectory e funções de FtpSetCurrentDirectory. Essas funções utilizam o identificador de sessão criado por uma chamada anterior para InternetConnect para determinar em qual diretório o aplicativo está atualmente ou para alterar para um subdiretório diferente.
A enumeração de diretório é executada usando o FtpFindFirstFile e funções de InternetFindNextFile. FtpFindFirstFile usa o identificador de sessão criado por InternetConnect para localizar o primeiro arquivo que corresponde aos critérios de pesquisa fornecidos e retorna um identificador para continuar a enumeração de diretório. InternetFindNextFile usa o identificador retornado por FtpFindFirstFile para retornar o próximo arquivo que corresponde aos critérios de pesquisa originais. O aplicativo deve continuar a chamar InternetFindNextFile até que não restem mais arquivos no diretório.
Use a funçãoFtpCreateDirectory para criar novos diretórios. Esta função usa o identificador de sessão criado por InternetConnect e cria o diretório especificado pela cadeia de caracteres passada para a função. A cadeia de caracteres pode conter um nome de diretório relativo ao diretório atual ou um caminho de diretório totalmente qualificado.
Para renomear arquivos ou diretórios, o aplicativo pode chamar FtpRenameFile. Esta função substitui o nome original pelo novo nome passado para a função. O nome do arquivo ou diretório pode ser relativo ao diretório atual ou um nome totalmente qualificado.
Para carregar ou colocar arquivos em um servidor FTP, o aplicativo pode usar FtpPutFile ou FtpOpenFile (junto com InternetWriteFile). FtpPutFile pode ser usado se o arquivo já existir localmente, enquanto FtpOpenFile e InternetWriteFile podem ser usados se os dados precisarem ser gravados em um arquivo no servidor FTP.
Para baixar ou obter arquivos, o aplicativo pode usar FtpGetFile ou FtpOpenFile (com InternetReadFile). FtpGetFile é usado para recuperar um arquivo de um servidor FTP e armazená-lo localmente, enquanto FtpOpenFile e InternetReadFile podem ser usados para controlar para onde as informações baixadas estão indo (por exemplo, o aplicativo pode exibir as informações em uma caixa de edição).
Exclua arquivos em um servidor FTP usando a função FtpDeleteFile. Esta função remove um nome de arquivo que é relativo ao diretório atual ou a um nome de arquivo totalmente qualificado do servidor FTP. FtpDeleteFile requer um identificador de sessão retornado pelo InternetConnect.
Identificadores de função FTP
Para funcionar corretamente, as funções FTP requerem certos tipos de identificadores de HINTERNET. Esses identificadores devem ser criados em uma ordem específica, começando com o identificador raiz criado por InternetOpen. InternetConnect pode criar um identificador de sessão FTP.
O diagrama a seguir mostra as funções que dependem do identificador de sessão FTP retornado pelo InternetConnect. As caixas sombreadas representam funções que retornam identificadores de HINTERNET, enquanto as caixas simples representam funções que usam o identificador HINTERNET criado pela função da qual dependem.
InternetConnect
O diagrama a seguir mostra as duas funções que retornam identificadores de HINTERNET e as funções que dependem delas. As caixas sombreadas representam funções que retornam identificadores de HINTERNET, enquanto as caixas simples representam funções que usam o identificador de HINTERNET criado pela função da qual dependem.
Para obter mais informações, consulte HINTERNET Handles.
Usando as funções WinINet para sessões FTP
As seguintes funções são usadas durante sessões FTP. Estas funções não são reconhecidas pelos proxies do CERN. Os aplicativos que devem funcionar através de proxies CERN devem usar InternetOpenUrl e acessar os recursos diretamente. Para obter mais informações sobre o acesso direto a recursos, consulte Acessando URLs diretamente.
| Função | Descrição |
|---|---|
| FtpCreateDirectory | Cria um novo diretório no servidor. Esta função requer um identificador criado por InternetConnect. |
| FtpDeleteFile | Exclui um arquivo do servidor. Esta função requer um identificador criado por InternetConnect. |
| FtpFindFirstFile | Inicia a enumeração de arquivos ou a pesquisa de arquivos no diretório atual. Esta função requer um identificador criado por InternetConnect. |
| FtpGetCurrentDirectory | Retorna o diretório atual do cliente no servidor. Esta função requer um identificador criado por InternetConnect. |
| FtpGetFile | Recupera um arquivo do servidor. Esta função requer um identificador criado por InternetConnect. |
| FtpOpenFile | Inicia o acesso a um arquivo no servidor para leitura ou gravação. Esta função requer um identificador criado por InternetConnect. |
| FtpPutFile | Grava um arquivo no servidor. Esta função requer um identificador criado por InternetConnect. |
| FtpRemoveDirectory | Exclui um diretório no servidor. Esta função requer um identificador criado por InternetConnect. |
| FtpRenameFile | Renomeia um arquivo no servidor. Esta função requer um identificador criado por InternetConnect. |
| FtpSetCurrentDirectory | Altera o diretório atual do cliente no servidor. Esta função requer um identificador criado por InternetConnect. |
| InternetWriteFile | Grava dados em um arquivo aberto no servidor. Esta função requer um identificador criado por FtpOpenFile. |
Iniciando uma sessão FTP
O aplicativo estabelece uma sessão FTP chamando InternetConnect em um identificador criado pelo InternetOpen. InternetConnect precisa do nome do servidor, número da porta, nome de usuário, senha e tipo de serviço (que deve ser definido como INTERNET_SERVICE_FTP). Para semântica FTP passiva, o aplicativo também deve definir o sinalizador INTERNET_FLAG_PASSIVE.
Os valores INTERNET_DEFAULT_FTP_PORT e INTERNET_INVALID_PORT_NUMBER podem ser usados para o número da porta. INTERNET_DEFAULT_FTP_PORT usa a porta FTP padrão, mas o tipo de serviço ainda deve ser definido. INTERNET_INVALID_PORT_NUMBER usa o valor padrão para o tipo de serviço indicado.
Os valores para o nome de usuário e senha podem ser definidos como NULL. Se ambos os valores estiverem definidos como NULL , InternetConnect usará "anônimo" para o nome de usuário e o endereço de email do usuário para a senha. Se apenas a senha estiver definida como NULL , o nome de usuário passado para InternetConnect será usado para o nome de usuário e uma cadeia de caracteres vazia será usada para a senha. Se nenhum dos valores for NULL , o nome de usuário e a senha fornecidos ao InternetConnect serão usados.
Enumerando diretórios
A enumeração de um diretório em um servidor FTP requer a criação de um identificador por FtpFindFirstFile. Esse identificador é uma ramificação do identificador de sessão criado pelo InternetConnect. FtpFindFirstFile localiza o primeiro arquivo ou diretório no servidor e o retorna em uma estrutura WIN32_FIND_DATA. Use InternetFindNextFile até que ele retorne ERROR_NO_MORE_FILES. Esse método localiza todos os arquivos e diretórios subsequentes no servidor. Para obter mais informações sobre InternetFindNextFile, consulte Localizando o próximo arquivo.
Para determinar se o arquivo recuperado por FtpFindFirstFile ou InternetFindNextFile é um diretório, verifique o dwFileAttributes membro da estrutura WIN32_FIND_DATA para ver se é igual a FILE_ATTRIBUTE_DIRECTORY.
Se o aplicativo fizer alterações no servidor FTP ou se o servidor FTP mudar com freqüência, os sinalizadores INTERNET_FLAG_NO_CACHE_WRITE e INTERNET_FLAG_RELOAD devem ser definidos em FtpFindFirstFile. Esses sinalizadores garantem que as informações de diretório que estão sendo recuperadas do servidor FTP sejam atuais.
Depois que o aplicativo conclui a enumeração de diretório, o aplicativo deve fazer uma chamada para InternetCloseHandle no identificador criado por FtpFindFirstFile. Até que esse identificador seja fechado, o aplicativo não pode chamar FtpFindFirstFile novamente no identificador de sessão criado pelo InternetConnect. Se uma chamada para FtpFindFirstFile for feita no mesmo identificador de sessão antes que a chamada anterior para a mesma função seja fechada, a função falhará, retornando ERROR_FTP_TRANSFER_IN_PROGRESS.
O exemplo a seguir enumera o conteúdo de um diretório FTP em um controle de caixa de listagem. O parâmetro hConnection é um identificador retornado pela funçãoInternetConnect depois de estabelecer uma sessão FTP. O código-fonte de exemplo para a função InternetErrorOut mencionada neste exemplo pode ser encontrado no tópico Handling Errors.
#include <windows.h>
#include <strsafe.h>
#include <wininet.h>
#pragma comment(lib, "wininet.lib")
#pragma comment(lib, "user32.lib")
#define FTP_FUNCTIONS_BUFFER_SIZE MAX_PATH+8
BOOL WINAPI DisplayFtpDir(
HWND hDlg,
HINTERNET hConnection,
DWORD dwFindFlags,
int nListBoxId )
{
WIN32_FIND_DATA dirInfo;
HINTERNET hFind;
DWORD dwError;
BOOL retVal = FALSE;
TCHAR szMsgBuffer[FTP_FUNCTIONS_BUFFER_SIZE];
TCHAR szFName[FTP_FUNCTIONS_BUFFER_SIZE];
SendDlgItemMessage( hDlg, nListBoxId, LB_RESETCONTENT, 0, 0 );
hFind = FtpFindFirstFile( hConnection, TEXT( "*.*" ),
&dirInfo, dwFindFlags, 0 );
if ( hFind == NULL )
{
dwError = GetLastError( );
if( dwError == ERROR_NO_MORE_FILES )
{
StringCchCopy( szMsgBuffer, FTP_FUNCTIONS_BUFFER_SIZE,
TEXT( "No files found at FTP location specified." ) );
retVal = TRUE;
goto DisplayDirError_1;
}
StringCchCopy( szMsgBuffer, FTP_FUNCTIONS_BUFFER_SIZE,
TEXT( "FtpFindFirstFile failed." ) );
goto DisplayDirError_1;
}
do
{
if( FAILED( StringCchCopy( szFName, FTP_FUNCTIONS_BUFFER_SIZE,
dirInfo.cFileName ) ) ||
( ( dirInfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) &&
( FAILED( StringCchCat( szFName, FTP_FUNCTIONS_BUFFER_SIZE,
TEXT( " <DIR> " ) ) ) ) ) )
{
StringCchCopy( szMsgBuffer, FTP_FUNCTIONS_BUFFER_SIZE,
TEXT( "Failed to copy a file or directory name." ) );
retVal = FALSE;
goto DisplayDirError_2;
}
SendDlgItemMessage( hDlg, nListBoxId, LB_ADDSTRING,
0, (LPARAM) szFName );
} while( InternetFindNextFile( hFind, (LPVOID) &dirInfo ) );
if( ( dwError = GetLastError( ) ) == ERROR_NO_MORE_FILES )
{
InternetCloseHandle(hFind);
return( TRUE );
}
StringCchCopy( szMsgBuffer, FTP_FUNCTIONS_BUFFER_SIZE,
TEXT( "FtpFindNextFile failed." ) );
DisplayDirError_2:
InternetCloseHandle( hFind );
DisplayDirError_1:
MessageBox( hDlg,
(LPCTSTR) szMsgBuffer,
TEXT( "DisplayFtpDir( ) Problem" ),
MB_OK | MB_ICONERROR );
return( retVal );
}
Navegando em diretórios
O FtpGetCurrentDirectory e funções de FtpSetCurrentDirectory manipulam a navegação de diretório.
FtpGetCurrentDirectory retorna o diretório atual do aplicativo no servidor FTP. O caminho do diretório raiz no servidor FTP está incluído.
FtpSetCurrentDirectory altera o diretório de trabalho no servidor. As informações de diretório passadas para FtpSetCurrentDirectory podem ser um nome de caminho parcial ou totalmente qualificado em relação ao diretório atual. Por exemplo, se o aplicativo estiver atualmente no diretório "public/info" e o caminho for "ftp/example", FtpSetCurrentDirectory alterará o diretório atual para "public/info/ftp/example".
O exemplo a seguir usa o identificador de sessão FTP hConnection, que é retornado pelo InternetConnect. O novo nome do diretório é retirado da caixa de edição da caixa de diálogo pai cujo IDC é passado no parâmetro nDirNameId. Antes da alteração de diretório ser feita, a função recupera o diretório atual e o armazena na mesma caixa de edição. O código-fonte para a função DisplayFtpDir chamada no final está listado acima.
BOOL WINAPI ChangeFtpDir( HWND hDlg,
HINTERNET hConnection,
int nDirNameId,
int nListBoxId )
{
DWORD dwSize;
TCHAR szNewDirName[FTP_FUNCTIONS_BUFFER_SIZE];
TCHAR szOldDirName[FTP_FUNCTIONS_BUFFER_SIZE];
TCHAR* szFailedFunctionName;
dwSize = FTP_FUNCTIONS_BUFFER_SIZE;
if( !GetDlgItemText( hDlg, nDirNameId, szNewDirName, dwSize ) )
{
szFailedFunctionName = TEXT( "GetDlgItemText" );
goto ChangeFtpDirError;
}
if ( !FtpGetCurrentDirectory( hConnection, szOldDirName, &dwSize ))
{
szFailedFunctionName = TEXT( "FtpGetCurrentDirectory" );
goto ChangeFtpDirError;
}
if( !SetDlgItemText( hDlg, nDirNameId, szOldDirName ) )
{
szFailedFunctionName = TEXT( "SetDlgItemText" );
goto ChangeFtpDirError;
}
if( !FtpSetCurrentDirectory( hConnection, szNewDirName ) )
{
szFailedFunctionName = TEXT( "FtpSetCurrentDirectory" );
goto ChangeFtpDirError;
}
return( DisplayFtpDir( hDlg, hConnection, 0, nListBoxId ) );
ChangeFtpDirError:
InternetErrorOut( hDlg, GetLastError( ), szFailedFunctionName );
DisplayFtpDir( hDlg, hConnection, INTERNET_FLAG_RELOAD, nListBoxId);
return( FALSE );
}
Manipulando diretórios em um servidor FTP
WinINet fornece a capacidade de criar e remover diretórios em um servidor FTP para o qual o aplicativo tem os privilégios necessários. Se o aplicativo deve fazer logon em um servidor com um nome de usuário e senha específicos, os valores podem ser usados em InternetConnect ao criar o identificador de sessão FTP.
A funçãoFtpCreateDirectory usa um identificador de sessão FTP válido e uma cadeia de caracteres nula-terminated que contém um caminho totalmente qualificado ou um nome relativo ao diretório atual e cria um diretório no servidor FTP.
O exemplo a seguir mostra duas chamadas separadas para FtpCreateDirectory. Em ambos os exemplos, hFtpSession é o identificador de sessão criado pela funçãoInternetConnect e o diretório raiz é o diretório atual.
/* Creates the directory "test" in the current (root) directory. */
FtpCreateDirectory( hFtpSession, "test" );
/* Creates the directory "example" in the test directory. */
FtpCreateDirectory( hFtpSession, "\\test\\example" );
A funçãoFtpRemoveDirectory usa um identificador de sessão e uma cadeia de caracteres null-terminated que contém um caminho totalmente qualificado ou um nome relativo ao diretório atual e remove esse diretório do servidor FTP.
O exemplo a seguir mostra duas chamadas de exemplo para FtpRemoveDirectory. Em ambas as chamadas, hFtpSession é o identificador de sessão criado pela funçãoInternetConnect e o diretório raiz é o diretório atual. Há um diretório chamado "test" no diretório raiz e um diretório chamado "example" no diretório "test".
/* Removes the "example" directory (plus any files/directories it contains) from the "test" directory. */
FtpRemoveDirectory(hFtpSession,"\\test\\example");
/* Removes the "test" directory (plus any files/directories it contains) from the root directory. */
FtpRemoveDirectory(hFtpSession, "test");
FtpRemoveDirectory(hFtpSession,TEXT("\\test\\example"));
/* Removes the "example" directory and any files or
directories contained in it from the "test" directory. */
FtpRemoveDirectory(hFtpSession, TEXT("test"));
/* Removes the "test" directory and any files or
directories contained in it from the root directory. */
O exemplo a seguir cria um novo diretório no servidor FTP. O novo nome do diretório é retirado da caixa de edição da caixa de diálogo pai cujo IDC é passado no parâmetro nDirNameId. O identificador hConnection foi criado pelo InternetConnect depois de estabelecer uma sessão FTP. O código-fonte para a função DisplayFtpDir chamada no final está listado acima.
BOOL WINAPI CreateFtpDir( HWND hDlg, HINTERNET hConnection,
int nDirNameId, int nListBoxId )
{
TCHAR szNewDirName[FTP_FUNCTIONS_BUFFER_SIZE];
if( !GetDlgItemText( hDlg, nDirNameId,
szNewDirName,
FTP_FUNCTIONS_BUFFER_SIZE ) )
{
MessageBox( hDlg,
TEXT( "Error: Directory Name Must Be Specified" ),
TEXT( "Create FTP Directory" ),
MB_OK | MB_ICONERROR );
return( FALSE );
}
if( !FtpCreateDirectory( hConnection, szNewDirName ) )
{
InternetErrorOut( hDlg, GetLastError( ),
TEXT( "FtpCreateDirectory" ) );
return( FALSE );
}
return( DisplayFtpDir( hDlg, hConnection,
INTERNET_FLAG_RELOAD,
nListBoxId ) );
}
O exemplo a seguir exclui um diretório do servidor FTP. O nome do diretório a ser excluído é retirado da caixa de edição na caixa de diálogo pai cujo IDC é passado para o parâmetro nDirNameId. O identificador hConnection foi criado pelo InternetConnect depois de estabelecer uma sessão FTP. O código-fonte para a função DisplayFtpDir chamada no final está listado acima.
BOOL WINAPI RemoveFtpDir( HWND hDlg, HINTERNET hConnection,
int nDirNameId, int nListBoxId )
{
TCHAR szDelDirName[FTP_FUNCTIONS_BUFFER_SIZE];
if( !GetDlgItemText( hDlg, nDirNameId, szDelDirName,
FTP_FUNCTIONS_BUFFER_SIZE ) )
{
MessageBox( hDlg,
TEXT( "Error: Directory Name Must Be Specified" ),
TEXT( "Remove FTP Directory" ),
MB_OK | MB_ICONERROR );
return( FALSE );
}
if( !FtpRemoveDirectory( hConnection, szDelDirName ) )
{
InternetErrorOut( hDlg, GetLastError( ),
TEXT( "FtpRemoveDirectory" ) );
return( FALSE );
}
return( DisplayFtpDir( hDlg, hConnection,
INTERNET_FLAG_RELOAD, nListBoxId ) );
}
Obtendo arquivos em um servidor FTP
Existem três métodos para recuperar arquivos de um servidor FTP:
- Use InternetOpenUrl e InternetReadFile.
- Use FtpOpenFile e InternetReadFile.
- Use FtpGetFile.
Para obter mais informações sobre como usar a funçãoInternetReadFile, consulte Reading Files.
Se a URL do arquivo estiver disponível, o aplicativo pode chamar InternetOpenUrl para se conectar a essa URL e, em seguida, usar InternetReadFile para controlar o download do arquivo. Isso permite que o aplicativo tenha um controle mais rígido sobre o download e é ideal para situações em que nenhuma outra operação precisa ser feita no servidor FTP. Para obter mais informações sobre como acessar recursos diretamente, consulte Acessando URLs diretamente.
Se o aplicativo estabeleceu um identificador de sessão FTP para o servidor com InternetConnect, o aplicativo pode chamar FtpOpenFile com o nome de arquivo existente e com um novo nome para o arquivo armazenado localmente. O aplicativo pode usar InternetReadFile para baixar o arquivo. Isso permite que o aplicativo tenha um controle mais rígido sobre o download e mantém a conexão com o servidor FTP, para que mais comandos possam ser executados.
Se o aplicativo não precisar de controle rígido sobre o download, o aplicativo pode usar FtpGetFile com o identificador de sessão FTP, nome de arquivo remoto e nome de arquivo local para recuperar o arquivo. FtpGetFile executa toda a contabilidade e sobrecarga associada à leitura de um arquivo de um servidor FTP e armazená-lo localmente.
O exemplo a seguir recupera um arquivo de um servidor FTP e o salva localmente. O nome do arquivo no servidor FTP é retirado da caixa de edição na caixa de diálogo pai cujo IDC é passado no parâmetro nFtpFileNameId e o nome local sob o qual o arquivo é salvo é retirado da caixa de edição cujo IDC é passado no parâmetro nLocalFileNameId. O identificador hConnection foi criado pelo InternetConnect depois de estabelecer uma sessão FTP.
BOOL WINAPI GetFtpFile( HWND hDlg, HINTERNET hConnection,
int nFtpFileNameId, int nLocalFileNameId )
{
TCHAR szFtpFileName[FTP_FUNCTIONS_BUFFER_SIZE];
TCHAR szLocalFileName[FTP_FUNCTIONS_BUFFER_SIZE];
DWORD dwTransferType;
TCHAR szBoxTitle[] = TEXT( "Download FTP File" );
TCHAR szAsciiQuery[] =
TEXT("Do you want to download as ASCII text?(Default is binary)");
TCHAR szAsciiDone[] =
TEXT( "ASCII Transfer completed successfully..." );
TCHAR szBinaryDone[] =
TEXT( "Binary Transfer completed successfully..." );
if( !GetDlgItemText( hDlg, nFtpFileNameId, szFtpFileName,
FTP_FUNCTIONS_BUFFER_SIZE ) ||
!GetDlgItemText( hDlg, nLocalFileNameId, szLocalFileName,
FTP_FUNCTIONS_BUFFER_SIZE ) )
{
MessageBox( hDlg,
TEXT( "Target File or Destination File Missing" ),
szBoxTitle,
MB_OK | MB_ICONERROR );
return( FALSE );
}
dwTransferType = ( MessageBox( hDlg,
szAsciiQuery,
szBoxTitle,
MB_YESNO ) == IDYES ) ?
FTP_TRANSFER_TYPE_ASCII : FTP_TRANSFER_TYPE_BINARY;
dwTransferType |= INTERNET_FLAG_RELOAD;
if( !FtpGetFile( hConnection, szFtpFileName, szLocalFileName, FALSE,
FILE_ATTRIBUTE_NORMAL, dwTransferType, 0 ) )
{
InternetErrorOut( hDlg, GetLastError( ), TEXT( "FtpGetFile" ) );
return( FALSE );
}
MessageBox( hDlg,( dwTransferType ==
(FTP_TRANSFER_TYPE_ASCII | INTERNET_FLAG_RELOAD)) ?
szAsciiDone : szBinaryDone, szBoxTitle, MB_OK );
return( TRUE );
}
Colocando arquivos em um servidor FTP
Há dois métodos para colocar um arquivo em um servidor FTP:
- Use FtpOpenFile com InternetWriteFile.
- Use FtpPutFile.
Um aplicativo que deve enviar dados para um servidor FTP, mas não tem um arquivo local que contém todos os dados, deve usar FtpOpenFile para criar e abrir um arquivo no servidor ftp. O aplicativo pode usar InternetWriteFile para carregar as informações para o arquivo.
Se o arquivo já existe localmente, o aplicativo pode usar FtpPutFile para carregar o arquivo para o servidor FTP. FtpPutFile executa toda a sobrecarga que acompanha o upload de um arquivo local para um servidor FTP remoto.
O exemplo a seguir copia um arquivo local para o servidor FTP. O nome local do arquivo é retirado da caixa de edição na caixa de diálogo pai cujo IDC é passado no parâmetro nLocalFileNameId e o nome sob o qual o arquivo é salvo no servidor FTP é retirado da caixa de edição cujo IDC é passado no parâmetro nFtpFileNameId. O identificador hConnection foi criado pelo InternetConnect depois de estabelecer uma sessão FTP.
BOOL WINAPI PutFtpFile( HWND hDlg, HINTERNET hConnection,
int nFtpFileNameId, int nLocalFileNameId )
{
TCHAR szFtpFileName[FTP_FUNCTIONS_BUFFER_SIZE];
TCHAR szLocalFileName[FTP_FUNCTIONS_BUFFER_SIZE];
DWORD dwTransferType;
TCHAR szBoxTitle[] = TEXT( "Upload FTP File" );
TCHAR szASCIIQuery[] =
TEXT("Do you want to upload as ASCII text? (Default is binary)");
TCHAR szAsciiDone[] =
TEXT( "ASCII Transfer completed successfully..." );
TCHAR szBinaryDone[] =
TEXT( "Binary Transfer completed successfully..." );
if( !GetDlgItemText( hDlg, nFtpFileNameId, szFtpFileName,
FTP_FUNCTIONS_BUFFER_SIZE ) ||
!GetDlgItemText( hDlg, nLocalFileNameId, szLocalFileName,
FTP_FUNCTIONS_BUFFER_SIZE ) )
{
MessageBox( hDlg,
TEXT("Target File or Destination File Missing"),
szBoxTitle,
MB_OK | MB_ICONERROR );
return( FALSE );
}
dwTransferType =
( MessageBox( hDlg,
szASCIIQuery,
szBoxTitle,
MB_YESNO ) == IDYES ) ?
FTP_TRANSFER_TYPE_ASCII : FTP_TRANSFER_TYPE_BINARY;
if( !FtpPutFile( hConnection,
szLocalFileName,
szFtpFileName,
dwTransferType,
0 ) )
{
InternetErrorOut( hDlg, GetLastError( ), TEXT( "FtpGetFile" ) );
return( FALSE );
}
MessageBox( hDlg,
( dwTransferType == FTP_TRANSFER_TYPE_ASCII ) ?
szAsciiDone : szBinaryDone, szBoxTitle, MB_OK );
return( TRUE ); // Remember to refresh directory listing
}
Excluindo arquivos de um servidor FTP
Para excluir um arquivo de um servidor FTP, use a funçãoFtpDeleteFile. O aplicativo de chamada deve ter os privilégios necessários para excluir um arquivo do servidor FTP.
O exemplo a seguir exclui um arquivo do servidor FTP. O nome do arquivo a ser excluído é retirado da caixa de edição na caixa de diálogo pai cujo IDC é passado para o parâmetro nFtpFileNameId. O identificador hConnection foi criado pelo InternetConnect depois de estabelecer uma sessão FTP. Como essa função não atualiza listagens de arquivos ou exibição de diretórios, o processo de chamada deve fazê-lo após a exclusão bem-sucedida.
BOOL WINAPI DeleteFtpFile( HWND hDlg, HINTERNET hConnection,
int nFtpFileNameId )
{
TCHAR szFtpFileName[FTP_FUNCTIONS_BUFFER_SIZE];
TCHAR szBoxTitle[] = TEXT( "Delete FTP File" );
if( !GetDlgItemText( hDlg, nFtpFileNameId, szFtpFileName,
FTP_FUNCTIONS_BUFFER_SIZE ) )
{
MessageBox( hDlg, TEXT( "File Name Must Be Specified!" ),
szBoxTitle, MB_OK | MB_ICONERROR );
return( FALSE );
}
if( !FtpDeleteFile( hConnection, szFtpFileName ) )
{
InternetErrorOut( hDlg,
GetLastError( ),
TEXT( "FtpDeleteFile" ) );
return( FALSE );
}
MessageBox( hDlg,
TEXT( "File has been deleted" ),
szBoxTitle,
MB_OK );
return( TRUE ); // Remember to refresh directory listing
}
Renomeando arquivos e diretórios em um servidor FTP
Arquivos e diretórios em um servidor FTP podem ser renomeados usando a função FtpRenameFile. FtpRenameFile aceita duas cadeias de caracteres null-terminated que contêm nomes parcial ou totalmente qualificados em relação ao diretório atual. A função altera o nome do arquivo designado pela primeira cadeia de caracteres para o nome designado pela segunda cadeia de caracteres.
O exemplo a seguir renomeia um arquivo ou diretório no servidor FTP. O nome atual do arquivo ou diretório é retirado da caixa de edição na caixa de diálogo pai cujo IDC é passado no parâmetro nOldFileNameId e o novo nome é retirado da caixa de edição cujo IDC é passado no parâmetro nNewFileNameId. O identificador hConnection foi criado pelo InternetConnect depois de estabelecer uma sessão FTP. Como essa função não atualiza listagens de arquivos ou exibição de diretórios, o processo de chamada deve fazê-lo após a renomeação bem-sucedida.
BOOL WINAPI RenameFtpFile( HWND hDlg, HINTERNET hConnection,
int nOldFileNameId, int nNewFileNameId )
{
TCHAR szOldFileName[FTP_FUNCTIONS_BUFFER_SIZE];
TCHAR szNewFileName[FTP_FUNCTIONS_BUFFER_SIZE];
TCHAR szBoxTitle[] = TEXT( "Rename FTP File" );
if( !GetDlgItemText( hDlg, nOldFileNameId, szOldFileName,
FTP_FUNCTIONS_BUFFER_SIZE ) ||
!GetDlgItemText( hDlg, nNewFileNameId, szNewFileName,
FTP_FUNCTIONS_BUFFER_SIZE ) )
{
MessageBox( hDlg,
TEXT( "Both the current and new file names must be supplied" ),
szBoxTitle,
MB_OK | MB_ICONERROR );
return( FALSE );
}
if( !FtpRenameFile( hConnection, szOldFileName, szNewFileName ) )
{
MessageBox( hDlg,
TEXT( "FtpRenameFile failed" ),
szBoxTitle,
MB_OK | MB_ICONERROR );
return( FALSE );
}
return( TRUE ); // Remember to refresh directory listing
}
Observação
WinINet não suporta implementações de servidor. Além disso, não deve ser usado a partir de um serviço. Para implementações ou serviços de servidor, use Microsoft Windows HTTP Services (WinHTTP).