FtpFindFirstFileの情報をリフレッシュするには?


mayumi  2004-08-28 02:27:08  No: 54329

いつもお世話になっております。
FtpFindFirstFileの最新の情報にするには
どうしたら良いでしょうか?
現象として、FtpPutFileでファイルをサーバに転送し、
FtpFindFirstFileでファイル一覧を出力します。
先ほどファイル転送したファイル名が出力されません。
socket通信のプログラムからはしっかりファイル名が
出力されるので転送には問題ないようです。
アプリケーションを終了させて、
再び起動させてFtpFindFirstFileすれば
転送したファイル名が出力されます。
いったい何が悪いのでしょうか?


mayumi  2004-08-30 22:31:01  No: 54330

どなたか教授できませんでしょうか?
わかる範囲で結構です。
宜しくお願い致します。

開発環境 WindowsXP VC++6.0

以上


あいる  2004-08-31 01:06:01  No: 54331

ソースが無いんでこんな実装だろうという妄想です。

おそらく、2回目のFtpFindFirstFile はERROR_FTP_TRANSFER_IN_PROGRESS のエラーを出してるかと思います。

FtpFindFirstFile はFTPセッション1つに一回しか呼べなかったと思います。
んで、MSDNを斜め読みしてみると・・・
InternetCloseHandle を呼ばないと再度FtpFindFirstFile は呼べませんとありますね・・・
てことで、FtpFindFirstFile で得られたハンドルをInternetCloseHandle してみてください。
それでダメならソースないとなんともいえませんね・・・


mayumi  2004-08-31 01:33:20  No: 54332

あいる様
ご教授どうもありがとうございます。
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);
}


あいる  2004-08-31 02:27:37  No: 54333

単に引数の指定が足りないだけのようですね・・・

hFind_z = FtpFindFirstFile(hFtpSession_z, "/path/", &fd, INTERNET_FLAG_RELOAD, 0);

としてみてください。たぶん大丈夫だとは思います。


あいる  2004-08-31 02:51:19  No: 54334

ちなみに、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 としとく方がいいかも?
# 実験してないので、試してみてください。


mayumi  2004-08-31 03:09:26  No: 54335

あいる様

上記の設定(INTERNET_FLAG_NO_CACHE_WRITE|INTERNET_FLAG_RELOAD)
して思い通りに動きました。
ほんーーーーーーーーーっとにありがございます。
はい。実験してみます。
十分訳せてますよーw
どうもありがとうございました。(⌒o⌒)(^  )チュッ!


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加