Sessões FTP

O WinINet permite que os aplicativos naveguem e manipulem diretórios e arquivos em um servidor ftp. Como os proxies cern não dão suporte a 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 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á atualmente 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 especificados 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 a um nome totalmente qualificado.

Para carregar ou colocar arquivos em um servidor FTP, o aplicativo pode usar FtpPutFile ou FtpOpenFile (juntamente com InternetWriteFile). FtpPutFile poderá ser usado se o arquivo já existir localmente, enquanto FtpOpenFile e InternetWriteFile poderão 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.

Identificadores de função FTP

Para funcionar corretamente, as funções FTP exigem determinados 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 criar um identificador de sessão FTP.

O diagrama a seguir mostra as funções que dependem do identificador de sessão FTP retornado por 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.

Funções ftp dependentes do identificador de sessão ftp retornado pela internetconnect

O diagrama a seguir mostra as duas funções que retornam identificadores HINTERNET e as funções que dependem delas. 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.

Funções ftp que retornam identificadores hinternet

Para obter mais informações, consulte Identificadores HINTERNET.

Usando as funções WinINet para sessões FTP

As funções a seguir são usadas durante sessões FTP. Essas funções não são reconhecidas por proxies CERN. Os aplicativos que devem funcionar por meio de proxies CERN devem usar InternetOpenUrl e acessar os recursos diretamente. Para obter mais informações sobre 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 pelo InternetConnect.
FtpDeleteFile Exclui um arquivo do servidor. Essa função requer um identificador criado pelo InternetConnect.
Ftpfindfirstfile Inicia a enumeração de arquivo ou a pesquisa de arquivos no diretório atual. Essa função requer um identificador criado pelo InternetConnect.
FtpGetCurrentDirectory Retorna o diretório atual do cliente no servidor. Essa função requer um identificador criado pelo InternetConnect.
FtpGetFile Recupera um arquivo do servidor. Essa função requer um identificador criado pelo InternetConnect.
FtpOpenFile Inicia o acesso a um arquivo no servidor para leitura ou gravação. Essa função requer um identificador criado pelo InternetConnect.
FtpPutFile Grava um arquivo no servidor. Essa função requer um identificador criado pelo InternetConnect.
FtpRemoveDirectory Exclui um diretório no servidor. Essa função requer um identificador criado pelo InternetConnect.
FtpRenameFile Renomeia um arquivo no servidor. Essa função requer um identificador criado pelo InternetConnect.
FtpSetCurrentDirectory Altera o diretório atual do cliente no servidor. Essa função requer um identificador criado pelo InternetConnect.
InternetWriteFile Grava dados em um arquivo aberto no servidor. Essa 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. O InternetConnect precisa do nome do servidor, do número da porta, do nome de usuário, da senha e do tipo de serviço (que deve ser definido como INTERNET_SERVICE_FTP). Para 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 para o nome de usuário e a 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 é um branch 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, marcar 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 de diretório que estão sendo recuperadas do servidor FTP sejam atuais.

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 de estabelecer 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 );
}

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", 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 da alteração do diretório ser feita, a função recupera o diretório atual e o armazena na mesma caixa de edição. O código souce para a função DisplayFtpDir chamada no final é 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 "teste" no diretório raiz e um diretório chamado "exemplo" 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 depois de estabelecer uma sessão FTP. O código-fonte da função DisplayFtpDir chamada no final é 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 da função DisplayFtpDir chamada no final é 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

Há três métodos para recuperar arquivos de um servidor FTP:

Para obter mais informações sobre como usar a função InternetReadFile , consulte Arquivos de Leitura.

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 diretamente os recursos, 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. O FtpGetFile executa toda a contabilidade e sobrecarga associadas à leitura de um arquivo de um servidor FTP e ao 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 no 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:

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 carregamento de um arquivo local em 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 é 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çã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 é obtido da caixa de edição na caixa de diálogo pai cujo IDC é passado int 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ório, o processo de chamada deve fazer isso 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 é 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ório, o processo de chamada deve fazer isso 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 Os Serviços HTTP do Microsoft Windows (WinHTTP).