Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
O 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 um proxy CERN exclusivamente devem usar a função InternetOpenUrl . 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.
O WinINet permite que você execute as seguintes ações em um servidor FTP:
- Navegue entre os diretórios.
- Enumerar, criar, remover e renomear diretórios.
- Renomeie, carregue, baixe e exclua arquivos.
A navegação é fornecida pelas funções FtpGetCurrentDirectory e 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á no momento ou para alterar para um subdiretório diferente.
A enumeração de diretório é executada usando as funções FtpFindFirstFile e InternetFindNextFile . FtpFindFirstFile usa o identificador de sessão criado pelo 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 haja mais arquivos no diretório.
Use a função FtpCreateDirectory para criar novos diretórios. Essa função usa o identificador de sessão criado pelo 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. Essa 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 . Essa função remove um nome de arquivo relativo ao diretório atual ou a um nome de arquivo totalmente qualificado do servidor FTP. FtpDeleteFile requer um identificador de sessão retornado por InternetConnect.
Alças de função FTP
Para funcionar corretamente, as funções de FTP requerem certos tipos de identificadores HINTERNET . Esses identificadores devem ser criados em uma ordem específica, começando com o identificador raiz criado pelo InternetOpen. O InternetConnect pode então 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 HINTERNET , enquanto as caixas simples representam funções que usam o identificador HINTERNET criado pela função da qual dependem.
O diagrama a seguir mostra as duas funções que retornam identificadores HINTERNET e as funções que dependem deles. As caixas sombreadas representam funções que retornam identificadores HINTERNET, enquanto as caixas simples representam funções que usam o identificador HINTERNET criado pela função da qual elas dependem.
Para obter mais informações, consulte identificadores HINTERNET.
Usando as funções do WinINet para sessões de FTP
As funções a seguir são usadas durante as sessões de FTP. Essas funções não são reconhecidas pelos proxies do CERN. Os aplicativos que devem funcionar por meio de proxies do 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. Essa função requer um identificador criado por InternetConnect. |
| FtpDeleteFile | Exclui um arquivo do servidor. Essa função requer um identificador criado por InternetConnect. |
| FtpFindFirstFile | Inicia a enumeração de arquivos ou a pesquisa de arquivos no diretório atual. Essa função requer um identificador criado por InternetConnect. |
| FtpGetCurrentDirectory | Retorna o diretório atual do cliente no servidor. Essa função requer um identificador criado por InternetConnect. |
| FtpGetFile | Recupera um arquivo do servidor. Essa função requer um identificador criado por InternetConnect. |
| FtpOpenFile | Inicia o acesso a um arquivo no servidor para leitura ou gravação. Essa função requer um identificador criado por InternetConnect. |
| FtpPutFile | Grava um arquivo no servidor. Essa função requer um identificador criado por InternetConnect. |
| FtpRemoveDirectory | Exclui um diretório no servidor. Essa função requer um identificador criado por InternetConnect. |
| FtpRenameFile | Renomeia um arquivo no servidor. Essa função requer um identificador criado por InternetConnect. |
| FtpSetCurrentDirectory | Altera o diretório atual do cliente no servidor. Essa função requer um identificador criado por InternetConnect. |
| InternetWriteFile | Grava dados em um arquivo aberto no servidor. Essa função requer um identificador criado por FtpOpenFile. |
Iniciando uma sessão de FTP
O aplicativo estabelece uma sessão FTP chamando InternetConnect em um identificador criado por InternetOpen. O 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 a semântica de 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 do nome de usuário e senha podem ser definidos como NULL. Se ambos os valores forem definidos como NULL, o 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 for 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 membro dwFileAttributes da estrutura WIN32_FIND_DATA para ver se ele é igual a FILE_ATTRIBUTE_DIRECTORY.
Se o aplicativo fizer alterações no servidor FTP ou se o servidor FTP for alterado com frequência, os sinalizadores INTERNET_FLAG_NO_CACHE_WRITE e INTERNET_FLAG_RELOAD deverão ser definidos em FtpFindFirstFile. Esses sinalizadores garantem que as informações do diretório que estão sendo recuperadas do servidor FTP estejam atualizadas.
Depois que o aplicativo concluir a enumeração de diretório, o aplicativo deverá fazer uma chamada para InternetCloseHandle no identificador criado por FtpFindFirstFile. Até que esse identificador seja fechado, o aplicativo não poderá 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ção InternetConnect depois que ela estabelece uma sessão FTP. O código-fonte de exemplo para a função InternetErrorOut referenciada neste exemplo pode ser encontrado no tópico Tratamento de erros.
#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
As funções FtpGetCurrentDirectory e FtpSetCurrentDirectory lidam com a navegação de diretório.
FtpGetCurrentDirectory retorna o diretório atual do aplicativo no servidor FTP. O caminho do diretório 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", o 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 por InternetConnect. O novo nome do diretório é obtido da caixa de edição da caixa de diálogo pai cujo IDC é passado no parâmetro nDirNameId . Antes que a alteração do diretório seja feita, a função recupera o diretório atual e o armazena na mesma caixa de edição. O código-fonte da 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
O 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 precisar fazer logon em um servidor com um nome de usuário e senha específicos, os valores poderão ser usados no InternetConnect ao criar o identificador de sessão FTP.
A função FtpCreateDirectory usa um identificador de sessão FTP válido e uma cadeia de caracteres terminada em nulo 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ção InternetConnect 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ção FtpRemoveDirectory usa um identificador de sessão e uma cadeia de caracteres terminada em nulo 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ção InternetConnect 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 é obtido 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 após o estabelecimento de uma sessão FTP. O código-fonte da 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 é obtido 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 após o estabelecimento de uma sessão FTP. O código-fonte da 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ção InternetReadFile , consulte Lendo arquivos.
Se a URL do arquivo estiver disponível, o aplicativo poderá 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 tiver estabelecido um identificador de sessão FTP para o servidor com InternetConnect, o aplicativo poderá chamar FtpOpenFile com o nome de arquivo existente e com um novo nome para o arquivo armazenado localmente. Em seguida, o aplicativo pode usar InternetReadFile para baixar o arquivo. Isso permite que o aplicativo tenha um controle mais rígido sobre o download e mantenha 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 poderá usar FtpGetFile com o identificador de sessão FTP, o nome do arquivo remoto e o nome do arquivo local para recuperar o arquivo. FtpGetFile executa toda a contabilidade e sobrecarga associadas à 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 é obtido 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 é obtido da caixa de edição cujo IDC é passado no parâmetro nLocalFileNameId . O identificador hConnection foi criado pelo InternetConnect após o estabelecimento de 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
Existem 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 contenha todos os dados, deve usar FtpOpenFile para criar e abrir um arquivo no servidor ftp. Em seguida, o aplicativo pode usar InternetWriteFile para carregar as informações no arquivo.
Se o arquivo já existir localmente, o aplicativo poderá usar FtpPutFile para carregar o arquivo no 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 é obtido 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 é obtido da caixa de edição cujo IDC é passado no parâmetro nFtpFileNameId . O identificador hConnection foi criado pelo InternetConnect após o estabelecimento de 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ção FtpDeleteFile . 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 no parâmetro nFtpFileNameId . O identificador hConnection foi criado pelo InternetConnect após o estabelecimento de uma sessão FTP. Como essa função não atualiza listagens de arquivos ou exibição de diretório, 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 terminadas em nulo 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 é obtido da caixa de edição na caixa de diálogo pai cujo IDC é passado no parâmetro nOldFileNameId , e o novo nome é obtido da caixa de edição cujo IDC é passado no parâmetro nNewFileNameId . O identificador hConnection foi criado pelo InternetConnect após o estabelecimento de uma sessão FTP. Como essa função não atualiza listagens de arquivos ou exibição de diretório, 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
O WinINet não dá suporte a implementações de servidor. Além disso, ele não deve ser usado de um serviço. Para implementações ou serviços de servidor, use do Microsoft Windows HTTP Services (WinHTTP).