いつもお世話になっております。
FtpFindFirstFileの最新の情報にするには
どうしたら良いでしょうか?
現象として、FtpPutFileでファイルをサーバに転送し、
FtpFindFirstFileでファイル一覧を出力します。
先ほどファイル転送したファイル名が出力されません。
socket通信のプログラムからはしっかりファイル名が
出力されるので転送には問題ないようです。
アプリケーションを終了させて、
再び起動させてFtpFindFirstFileすれば
転送したファイル名が出力されます。
いったい何が悪いのでしょうか?
どなたか教授できませんでしょうか?
わかる範囲で結構です。
宜しくお願い致します。
開発環境 WindowsXP VC++6.0
以上
ソースが無いんでこんな実装だろうという妄想です。
おそらく、2回目のFtpFindFirstFile はERROR_FTP_TRANSFER_IN_PROGRESS のエラーを出してるかと思います。
FtpFindFirstFile はFTPセッション1つに一回しか呼べなかったと思います。
んで、MSDNを斜め読みしてみると・・・
InternetCloseHandle を呼ばないと再度FtpFindFirstFile は呼べませんとありますね・・・
てことで、FtpFindFirstFile で得られたハンドルをInternetCloseHandle してみてください。
それでダメならソースないとなんともいえませんね・・・
あいる様
ご教授どうもありがとうございます。
FTPセッション1つに1回しか呼べないと確認しており、
InternetCloseHandleを閉じてるのですが、
閉じ方がダメでしょうか?
返答お待ちしております。
宜しくお願い致します。
BOOL CheckFile(HWND hWnd)
{
LPCTSTR lpServName = "xxx.co.jp";
LPCTSTR lpServUID = "id";
LPCTSTR lpServUPW = "pass";
LPCTSTR lpPATH_OTP = "/path/";
TCHAR szTemp[MAX_PATH];
char product_now[256];
WIN32_FIND_DATA fd;
BOOL bolBreak;
TCHAR szTemp2[MAX_PATH];
HINTERNET hInternet_z;
HINTERNET hFtpSession_z;
HINTERNET hFind_z;
/* WININETの初期化 */
hInternet_z = InternetOpen(
"WININET Sample Program",
INTERNET_OPEN_TYPE_DIRECT,
NULL,
NULL,
0);
/* ftp.foo.barへ接続 */
hFtpSession_z = InternetConnect(
hInternet_z,
lpServName,
INTERNET_DEFAULT_FTP_PORT,
lpServUID,
lpServUPW,
INTERNET_SERVICE_FTP,
0,
0);
while(1) {
/* ファイルを列挙し、表示 */
hFind_z = FtpFindFirstFile(hFtpSession_z, "/path/", &fd, 0, 0);
// 指定した製品名
bolBreak = FALSE;
lstrcpy(szTemp2, "");
if(hFind_z != NULL) do {
sprintf( szTemp, "%s", fd.cFileName);
lstrcat(szTemp2, szTemp);
} while(InternetFindNextFile(hFind_z, &fd));
MessageBox(ghWnd, szTemp2, "Parameter Error", MB_OK|MB_ICONWARNING);
if (bolBreak == TRUE) {
break;
}
InternetCloseHandle(hFind_z);
InternetCloseHandle(hFtpSession_z);
InternetCloseHandle(hInternet_z);
return (TRUE);
}
InternetCloseHandle(hFind_z);
InternetCloseHandle(hFtpSession_z);
InternetCloseHandle(hInternet_z);
return (FALSE);
}
単に引数の指定が足りないだけのようですね・・・
hFind_z = FtpFindFirstFile(hFtpSession_z, "/path/", &fd, INTERNET_FLAG_RELOAD, 0);
としてみてください。たぶん大丈夫だとは思います。
ちなみに、MSDNには・・・
「If the application makes changes on the FTP server or if the FTP server changes frequently,
the INTERNET_FLAG_NO_CACHE_WRITE and INTERNET_FLAG_RELOAD flags should be set in FtpFindFirstFile.
These flags ensure that the directory information being retrieved from the FTP server is current. 」
と、あります
「FTPサーバーで変更がある場合、INTERNET_FLAG_NO_CACHE_WRITEとINTERNET_FLAG_RELOADのフラグはFtpFindFirstFileで指定されるべきです。
これらのフラグはFTPサーバーから取得される情報が現在の状態である事を保障します。」
とのこと・・・(訳ミスってたらごみん・・・(^^;)
なので、
INTERNET_FLAG_NO_CACHE_WRITE|INTERNET_FLAG_RELOAD としとく方がいいかも?
# 実験してないので、試してみてください。
あいる様
上記の設定(INTERNET_FLAG_NO_CACHE_WRITE|INTERNET_FLAG_RELOAD)
して思い通りに動きました。
ほんーーーーーーーーーっとにありがございます。
はい。実験してみます。
十分訳せてますよーw
どうもありがとうございました。(⌒o⌒)(^ )チュッ!
ツイート | ![]() |