FTP Oturumları
WinINet, uygulamaların ftp sunucusundaki dizinlerde ve dosyalarda gezinmesine ve dosyaları işlemesine olanak tanır. CERN proxy'leri FTP'yi desteklemediğinden, özel olarak CERN ara sunucusu kullanan uygulamaların InternetOpenUrlişlevini kullanması gerekir. InternetOpenUrlkullanma hakkında daha fazla bilgi için bkz. URL'lere Doğrudan Erişme.
FTP oturumu başlatmak için InternetConnect kullanarak oturum tutamacını oluşturun.
WinINet, ftp sunucusunda aşağıdaki eylemleri gerçekleştirmenizi sağlar:
- Dizinler arasında gezinme.
- Dizinleri listeleme, oluşturma, kaldırma ve yeniden adlandırma.
- Dosyaları yeniden adlandırın, karşıya yükleyin, indirin ve silin.
Gezinti, FtpGetCurrentDirectoryve FtpSetCurrentDirectoryişlevleritarafından sağlanır. Bu işlevler, uygulamanın şu anda hangi dizinde olduğunu belirlemek veya farklı bir alt dizine geçmek için internetconnectönceki bir çağrı tarafından oluşturulan oturum tutamacını kullanır.
Dizin numaralandırması, FtpFindFirstFile ve InternetFindNextFile işlevleri kullanılarak gerçekleştirilir. FtpFindFirstFile, verilen arama ölçütlerine uyan ilk dosyayı bulmak ve dizin numaralandırmasına devam etmek için bir tanıtıcı döndürmek için InternetConnect tarafından oluşturulan oturum tutamacını kullanır. InternetFindNextFile, FtpFindFirstFile tarafından döndürülen tanıtıcıyı kullanarak özgün arama ölçütlerine uyan bir sonraki dosyayı döndürür. Uygulama, dizinde başka dosya kalmayıncaya kadar InternetFindNextFileçağırmaya devam etmelidir.
Yeni dizinler oluşturmak için FtpCreateDirectoryişlevinikullanın. Bu işlev, internetconnecttarafından oluşturulan oturum tutamacını kullanır ve işleve geçirilen dize tarafından belirtilen dizini oluşturur. Dize, geçerli dizine göre bir dizin adı veya tam dizin yolu içerebilir.
Uygulama, dosyaları veya dizinleri yeniden adlandırmak için ftpRenameFileçağırabilir. Bu işlev, özgün adı işleve geçirilen yeni adla değiştirir. Dosya veya dizinin adı geçerli dizine göre veya tam ad olabilir.
Bir FTP sunucusuna dosya yüklemek veya yerleştirmek için, uygulama FtpPutFileveya FtpOpenFilekullanabilir (InternetWriteFileile birlikte). FtpPutFile, dosya zaten yerel olarak mevcutsa kullanılabilir; ftp sunucusundaki bir dosyaya veri yazılması gerekiyorsa FtpOpenFileve InternetWriteFilekullanılabilir.
Uygulama, dosyaları indirmek veya almak için FtpGetFileveya FtpOpenFile(InternetReadFile)kullanabilir. FtpGetFile, ftp sunucusundan dosya almak ve yerel olarak depolamak için kullanılırken, ftpOpenFileve InternetReadFileindirilen bilgilerin nereye gittiğini denetlemek için kullanılabilir (örneğin, uygulama bilgileri düzenleme kutusunda görüntüleyebilir).
FtpDeleteFileişlevinikullanarak FTP sunucusundaki dosyaları silin. Bu işlev, FTP sunucusundan geçerli dizine veya tam dosya adına göre bir dosya adını kaldırır. FtpDeleteFile, InternetConnecttarafından döndürülen bir oturum tanıtıcısı gerektirir.
FTP İşlevi Tanıtıcıları
FTP işlevlerinin düzgün çalışması için belirli türde HINTERNET tanıtıcıları gerekir. Bu tanıtıcılar, InternetOpentarafından oluşturulan kök tanıtıcıdan başlayarak belirli bir sırada oluşturulmalıdır. InternetConnect bir FTP oturum tanıtıcısı oluşturabilir.
Aşağıdaki diyagramda, InternetConnecttarafından döndürülen FTP oturum tanıtıcısına bağımlı işlevler gösterilmektedir. Gölgeli kutular HINTERNET tanıtıcıları döndüren işlevleri temsil ederken, düz kutular bağımlı oldukları işlev tarafından oluşturulan HINTERNET tutamacını kullanan işlevleri temsil eder.
internetconnect
Aşağıdaki diyagramda, HINTERNET tanıtıcılarını döndüren iki işlev ve bunlara bağımlı işlevler gösterilmektedir. Gölgeli kutular HINTERNET tanıtıcıları döndüren işlevleri temsil ederken, düz kutular bağımlı oldukları işlev tarafından oluşturulan HINTERNET tutamacını kullanan işlevleri temsil eder.
Daha fazla bilgi için bkz. HINTERNET Tanıtıcıları.
FTP Oturumları için WinINet İşlevlerini Kullanma
FTP oturumları sırasında aşağıdaki işlevler kullanılır. Bu işlevler CERN proxy'leri tarafından tanınmaz. CERN proxy'leri aracılığıyla çalışması gereken uygulamalar InternetOpenUrl kullanmalı ve kaynaklara doğrudan erişmelidir. Doğrudan kaynak erişimi hakkında daha fazla bilgi için bkz. URL'lere Doğrudan Erişme.
Fonksiyon | Açıklama |
---|---|
FtpCreateDirectory | Sunucuda yeni bir dizin oluşturur. Bu işlev, InternetConnecttarafından oluşturulmuş bir tanıtıcı gerektirir. |
FtpDeleteFile | Sunucudan bir dosya siler. Bu işlev, InternetConnecttarafından oluşturulmuş bir tanıtıcı gerektirir. |
FtpFindFirstFile | Geçerli dizinde dosya numaralandırmasını veya dosya aramasını başlatır. Bu işlev, InternetConnecttarafından oluşturulmuş bir tanıtıcı gerektirir. |
FtpGetCurrentDirectory | İstemcinin sunucudaki geçerli dizinini döndürür. Bu işlev, InternetConnecttarafından oluşturulmuş bir tanıtıcı gerektirir. |
FtpGetFile | Sunucudan bir dosya alır. Bu işlev, InternetConnecttarafından oluşturulmuş bir tanıtıcı gerektirir. |
FtpOpenFile | Okuma veya yazma için sunucudaki bir dosyaya erişim başlatır. Bu işlev, InternetConnecttarafından oluşturulmuş bir tanıtıcı gerektirir. |
FtpPutFile | Sunucuya bir dosya yazar. Bu işlev, InternetConnecttarafından oluşturulmuş bir tanıtıcı gerektirir. |
FtpRemoveDirectory | Sunucudaki bir dizini siler. Bu işlev, InternetConnecttarafından oluşturulmuş bir tanıtıcı gerektirir. |
FtpRenameFile | Sunucudaki bir dosyayı yeniden adlandırır. Bu işlev, InternetConnecttarafından oluşturulmuş bir tanıtıcı gerektirir. |
FtpSetCurrentDirectory | İstemcinin sunucudaki geçerli dizinini değiştirir. Bu işlev, InternetConnecttarafından oluşturulmuş bir tanıtıcı gerektirir. |
InternetWriteFile | Verileri sunucudaki açık bir dosyaya yazar. Bu işlev, ftpopenfiletarafından oluşturulmuş bir tanıtıcı gerektirir. |
FTP Oturumu Başlatma
Uygulama, InternetOpentarafından oluşturulan bir tanıtıcıda InternetConnect çağırarak bir FTP oturumu oluşturur. InternetConnect sunucu adı, bağlantı noktası numarası, kullanıcı adı, parola ve hizmet türüne (INTERNET_SERVICE_FTP olarak ayarlanmalıdır) gerekir. Pasif FTP semantiği için uygulamanın INTERNET_FLAG_PASSIVE bayrağını da ayarlaması gerekir.
bağlantı noktası numarası için INTERNET_DEFAULT_FTP_PORT ve INTERNET_INVALID_PORT_NUMBER değerleri kullanılabilir. INTERNET_DEFAULT_FTP_PORT varsayılan FTP bağlantı noktasını kullanır, ancak hizmet türü yine de ayarlanmalıdır. INTERNET_INVALID_PORT_NUMBER belirtilen hizmet türü için varsayılan değeri kullanır.
Kullanıcı adı ve parola değerleri null olarak ayarlanabilir. her iki değer de NULLolarak ayarlanırsa, internetconnectkullanıcı adı için "anonim" ve parola için kullanıcının e-posta adresini kullanır. Yalnızca parola NULL olarak ayarlanırsa, kullanıcı adı için internetbağlangeçirilen kullanıcı adı kullanılır ve parola için boş bir dize kullanılır. Hiçbir değer NULL değilse, internetconnectverilen kullanıcı adı ve parola kullanılır.
Dizinleri Numaralandırma
FTP sunucusundaki bir dizinin sabit listesi, ftpFindFirstFiletarafından bir tanıtıcı oluşturulmasını gerektirir. Bu tanıtıcı, InternetConnecttarafından oluşturulan oturum tanıtıcısının bir dalıdır. FtpFindFirstFilesunucudaki ilk dosyayı veya dizini bulur ve WIN32_FIND_DATA bir yapıda döndürür. ERROR_NO_MORE_FILESdöndürene kadar InternetFindNextFilekullanın. Bu yöntem, sunucudaki sonraki tüm dosyaları ve dizinleri bulur. InternetFindNextFilehakkında daha fazla bilgi için bkz. Sonraki Dosyayı Bulma.
FtpFindFirstFile veya InternetFindNextFile tarafından alınan dosyanın bir dizin olup olmadığını belirlemek için WIN32_FIND_DATA yapısının dwFileAttributes üyesini denetleyerek FILE_ATTRIBUTE_DIRECTORY eşit olup olmadığını denetleyin.
Uygulama FTP sunucusunda değişiklik yaparsa veya FTP sunucusu sık sık değişirse, INTERNET_FLAG_NO_CACHE_WRITE ve INTERNET_FLAG_RELOAD bayrakları FtpFindFirstFileiçinde ayarlanmalıdır. Bu bayraklar, FTP sunucusundan alınan dizin bilgilerinin güncel olmasını sağlar.
Uygulama dizin numaralandırmasını tamamladıktan sonra, uygulamanın FtpFindFirstFiletarafından oluşturulan tanıtıcıda InternetCloseHandleçağrısı yapması gerekir. Bu tanıtıcı kapatılana kadar uygulama, InternetConnecttarafından oluşturulan oturum tanıtıcısında ftpFindFirstFileyeniden çağıramaz. FtpFindFirstFileçağrısı aynı işleve önceki çağrı kapatılana kadar aynı oturum tanıtıcısında yapılırsa, işlev başarısız olur ve ERROR_FTP_TRANSFER_IN_PROGRESSdöndürür.
Aşağıdaki örnek, BIR FTP dizininin içeriğini liste kutusu denetimine numaralandırır. hConnection parametresi, ftp oturumu oluşturduktan sonra InternetConnect işlevi tarafından döndürülen bir tanıtıcıdır. Bu örnekte başvurulan InternetErrorOut işlevinin örnek kaynak kodu İşleme Hatalarıkonusunda bulunabilir.
#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 );
}
Dizinlerde Gezinme
ftpGetCurrentDirectoryve FtpSetCurrentDirectory işlevleridizin gezintisini işler.
FtpGetCurrentDirectory, FTP sunucusundaki uygulamanın geçerli dizinini döndürür. FTP sunucusundaki kök dizinden dizin yolu eklenir.
FtpSetCurrentDirectorysunucudaki çalışma dizinini değiştirir. FtpSetCurrentDirectorygeçirilen dizin bilgileri, geçerli dizine göre kısmen veya tam yol adı olabilir. Örneğin, uygulama şu anda "public/info" dizinindeyse ve yol "ftp/example" ise, FtpSetCurrentDirectorygeçerli dizini "public/info/ftp/example" olarak değiştirir.
Aşağıdaki örnek, InternetConnecttarafından döndürülen FTP oturum tanıtıcısı hConnection'ı kullanır. Yeni dizin adı, IDC'sinin nDirNameId parametresinde geçirildiği üst iletişim kutusunun düzenleme kutusundan alınır. Dizin değişikliği yapılmadan önce işlev geçerli dizini alır ve aynı düzenleme kutusunda depolar. Sonunda çağrılan DisplayFtpDir işlevinin souce kodu yukarıda listelenmiştir.
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 );
}
FTP Sunucusunda Dizinleri Düzenleme
WinINet, uygulamanın gerekli ayrıcalıklara sahip olduğu bir FTP sunucusunda dizin oluşturma ve kaldırma özelliği sağlar. Uygulamanın belirli bir kullanıcı adı ve parolası olan bir sunucuda oturum açması gerekiyorsa, değerler FTP oturum tutamacını oluştururken InternetConnectkullanılabilir.
FtpCreateDirectory işlevi geçerli bir FTP oturum tutamacını ve geçerli dizine göre tam yol veya ad içeren ve FTP sunucusunda bir dizin oluşturan nullsonlandırılan dizeyi alır.
Aşağıdaki örnekte ftpcreatedirectoryiki ayrı çağrı gösterilmektedir. Her iki örnekte de hFtpSession, InternetConnect işlevi tarafından oluşturulan oturum tanıtıcısıdır ve kök dizin geçerli dizindir.
/* Creates the directory "test" in the current (root) directory. */
FtpCreateDirectory( hFtpSession, "test" );
/* Creates the directory "example" in the test directory. */
FtpCreateDirectory( hFtpSession, "\\test\\example" );
FtpRemoveDirectoryişlevi, bir oturum tutamacını ve tam yol veya geçerli dizine göre bir ad içeren nullsonlandırılan bir dize alır ve bu dizini FTP sunucusundan kaldırır.
Aşağıdaki örnekte ftpRemoveDirectoryiçin iki örnek çağrı gösterilmektedir. Her iki çağrıda da hFtpSession, InternetConnect işlevi tarafından oluşturulan oturum tanıtıcısıdır ve kök dizin geçerli dizindir. Kök dizinde "test" adlı bir dizin ve "test" dizininde "example" adlı bir dizin vardır.
/* 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. */
Aşağıdaki örnek FTP sunucusunda yeni bir dizin oluşturur. Yeni dizin adı, IDC'sinin nDirNameId parametresinde geçirildiği üst iletişim kutusunun düzenleme kutusundan alınır. hConnection tanıtıcısı, FTP oturumu oluşturulduktan sonra internetconnecttarafından oluşturulmuştur. Sonunda çağrılan DisplayFtpDir işlevinin kaynak kodu yukarıda listelenmiştir.
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 ) );
}
Aşağıdaki örnek FTP sunucusundan bir dizini siler. Silinecek dizinin adı, IDC'sinin nDirNameId parametresine geçirildiği üst iletişim kutusundaki düzenleme kutusundan alınır. hConnection tanıtıcısı, FTP oturumu oluşturulduktan sonra internetconnecttarafından oluşturulmuştur. Sonunda çağrılan DisplayFtpDir işlevinin kaynak kodu yukarıda listelenmiştir.
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 ) );
}
FTP Sunucusuna Dosya Alma
FTP sunucusundan dosya almak için üç yöntem vardır:
- InternetOpenUrlkullanın ve InternetReadFile.
- FtpOpenFileve internetreadfilekullanın.
- FtpGetFilekullanın.
InternetReadFile işlevini kullanma hakkında daha fazla bilgi için bkz. Dosyaları Okuma.
Dosyanın URL'si varsa, uygulama bu URL'ye bağlanmak için internetopenUrlçağırabilir, ardından dosyanın indirilmesini denetlemek için internetreadfilekullanabilir. Bu, uygulamanın indirme üzerinde daha sıkı bir denetime sahip olmasını sağlar ve FTP sunucusunda başka işlem yapılması gerekmeyen durumlar için idealdir. Kaynaklara doğrudan erişme hakkında daha fazla bilgi için bkz. url'lere doğrudan erişme .
Uygulama, InternetConnectile sunucuya bir FTP oturum tanıtıcısı oluşturduysa, uygulama mevcut dosya adıyla ve yerel olarak depolanan dosya için yeni bir adla ftpOpenFileçağırabilir. Uygulama daha sonra dosyayı indirmek için internetreadfilekullanabilir. Bu, uygulamanın indirme üzerinde daha sıkı denetime sahip olmasını sağlar ve FTP sunucusuyla bağlantıyı korur, böylece daha fazla komut yürütülebilir.
Uygulamanın indirme üzerinde sıkı denetime ihtiyacı yoksa, uygulamayı almak için FTP oturum tanıtıcısı, uzak dosya adı ve yerel dosya adı ile ftpGetFilekullanabilir. FtpGetFile, FTP sunucusundan bir dosyayı okuma ve yerel olarak depolama ile ilişkili tüm muhasebeyi ve ek yükü gerçekleştirir.
Aşağıdaki örnek bir FTP sunucusundan dosya alır ve yerel olarak kaydeder. FTP sunucusundaki dosyanın adı, IDC'sinin nFtpFileNameId parametresinde geçirildiği üst iletişim kutusundaki düzenleme kutusundan alınır ve dosyanın kaydedildiği yerel ad, nLocalFileNameId parametresinde IDC geçirilen düzenleme kutusundan alınır. hConnection tanıtıcısı, FTP oturumu oluşturulduktan sonra internetconnecttarafından oluşturulmuştur.
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 );
}
Dosyaları FTP Sunucusuna Yerleştirme
Ftp sunucusuna dosya yerleştirmenin iki yöntemi vardır:
- InternetWriteFileile FtpOpenFilekullanın.
- ftpputfilekullanın.
Ftp sunucusuna veri göndermesi gereken, ancak tüm verileri içeren yerel bir dosyası olmayan bir uygulama, ftp sunucusunda dosya oluşturmak ve açmak için ftpOpenFilekullanmalıdır. Uygulama daha sonra InternetWriteFile kullanarak bilgileri dosyaya yükleyebilir.
Dosya yerel olarak zaten varsa, uygulama ftp sunucusuna yüklemek için FtpPutFilekullanabilir. FtpPutFile, uzak FTP sunucusuna yerel dosya yüklemeyle ilgili tüm ek yükü gerçekleştirir.
Aşağıdaki örnek, yerel bir dosyayı FTP sunucusuna kopyalar. Dosyanın yerel adı, IDC nLocalFileNameId parametresinde geçirilen üst iletişim kutusundaki düzenleme kutusundan alınır ve dosyanın FTP sunucusuna kaydedildiği ad, nFtpFileNameId parametresinde IDC geçirilen düzenleme kutusundan alınır. hConnection tanıtıcısı, FTP oturumu oluşturulduktan sonra internetconnecttarafından oluşturulmuştur.
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
}
FTP Sunucusundan Dosya Silme
FTP sunucusundan dosya silmek için ftpDeleteFileişlevini kullanın. Çağıran uygulamanın FTP sunucusundan bir dosyayı silmek için gerekli ayrıcalıklara sahip olması gerekir.
Aşağıdaki örnek FTP sunucusundan bir dosyayı siler. Silinecek dosyanın adı, IDC'sinin nFtpFileNameId parametresinde geçirildiği üst iletişim kutusundaki düzenleme kutusundan alınır. hConnection tanıtıcısı, FTP oturumu oluşturulduktan sonra internetconnecttarafından oluşturulmuştur. Bu işlev dosya listelerini veya dizin görüntülemeyi yenilemediğinden, arama işlemi başarılı silme işleminde bunu yapmalıdır.
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
}
FTP Sunucusunda Dosyaları ve Dizinleri Yeniden Adlandırma
FTP sunucusundaki dosyalar ve dizinler, ftpRenameFileişlevi kullanılarak yeniden adlandırılabilir. ftpRenameFile, geçerli dizine göre kısmen veya tam adlar içeren iki nullsonlandırılan dizeyi kabul eder. İşlev, ilk dize tarafından belirlenen dosyanın adını ikinci dize tarafından belirlenen adla değiştirir.
Aşağıdaki örnek FTP sunucusundaki bir dosyayı veya dizini yeniden adlandırır. Dosyanın veya dizinin geçerli adı, IDC'sinin nOldFileNameId parametresinde geçirildiği üst iletişim kutusundaki düzenleme kutusundan alınır ve yeni ad, IDC'sinin nNewFileNameId parametresinde geçirildiği düzenleme kutusundan alınır. hConnection tanıtıcısı, FTP oturumu oluşturulduktan sonra internetconnecttarafından oluşturulmuştur. Bu işlev dosya listelerini veya dizin görüntülemeyi yenilemediğinden, arama işlemi başarılı bir yeniden adlandırma sonrasında bunu yapmalıdır.
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
}
Not
WinINet, sunucu uygulamalarını desteklemez. Ayrıca, bir hizmetten kullanılmamalıdır. Sunucu uygulamaları veya hizmetleri için Microsoft Windows HTTP Services (WinHTTP)kullanın.