UNIXへのFTP時、ファイルチェックが上手く行きません。

[戻る]
sayumi 2003/02/25(火) 10:27:56
UNIXへ、VC++6.0で作成したDLLを使ってFTPしています。
既にサーバー側に同名のファイルがあれば上書きせずにエラーを返し、
ファイルが無ければファイル転送をしたいのですが、上手く行きません。
どんな状態でも常に上書きされてしまいます。

LedHutでは正常に動くのですが、本番環境であるHP-UXだと全て上書きされてしまいま
す。
色々な方法を試してみているのですが、私の頭では万策尽き果てました・・・

ちょっと省略していますが、以下のようにコーディングしています。
==================================================
pConn->SetCurrentDirectory((LPCTSTR)ServerPath);

//ファイルの存在チェック
CFtpFileFind pFile(pConn);

if (pFile.FindFile((LPCTSTR)HostFileName))
{
  pFile.FindNextFile();
  strFileName = pFile.GetFileName();
  if (strFileName == HostFileName)
  {    
    RetCode = -1;
  }else{
    if (!pConn->PutFile((LPCTSTR)LocalFileName,(LPCTSTR)HostFileName))
    {
      RetCode = GetLastError();
    }
  }
}else{
  if (!pConn->PutFile((LPCTSTR)LocalFileName,(LPCTSTR)HostFileName))
  {
    RetCode = GetLastError();
  }
}
pFile.Close();
==================================================
VC経験も無く、HP-UXも初めてでとても困っています。
どなたかご教授いただけないでしょうか?

επιστημη 2003/02/25(火) 10:43:45
>  strFileName = pFile.GetFileName();
>  if (strFileName == HostFileName)

HP-UXの場合、strFileNameの値がどうなってるか調べましたか?
このif-条件 が偽であれば、上書きしてしまいます。

また、pFile.FindFile(...) の結果が偽の場合も同様です。

まずは原因を突き止めてください。対策はそれから。

sayumi 2003/02/25(火) 13:05:28
ありがとうございました。
作業場所=現場でないので、調査に時間がかかりそうですが
それからまた書き込みます。

sayumi 2003/02/28(金) 10:33:47
分かりました!
LINUXの場合、GetFileNameした値は純粋なファイル名なのですが、
HP-UXだとファイル名の前に日付・時刻がついてしまうみたいです。
(区切りは半角スペース)

LINUXでGETしたファイル名:test.prm
HP-UXでGETしたファイル名:25日  10:02 test.prm

どうりで一致しないはずです。
現場=作業場所でないのを言い訳に、ここまでの調査を怠っていました。反省。
方法として、
1.右から文字判定して、半角スペースが出てきたらファイル名の終わりと判断
2.そこまでの文字列と比較したいファイル名を比較
3.同名のファイルがあればエラーを返し、無ければPutFile
としようと思います。
他にスマートなやり方をご存知でしたらアドバイス頂きたいです。

επιστημη 2003/02/28(金) 10:50:34
> 1.右から文字判定して、半角スペースが出てきたらファイル名の終わりと判断
> ...

いいんじゃないでしょか。

#include <iostream>
#include <string>

int main() {
  std::string filename = "25日  10:02 test.prm";
  // 最後の空白までを取り除く
  filename.erase(0,filename.rfind(' ')+1);

  std::cout << '[' << filename << ']' << std::endl;
  return 0;
}

dairygoods 2003/02/28(金) 11:05:25
>1.右から文字判定して、半角スペースが出てきたらファイル名の終わりと判断
>2.そこまでの文字列と比較したいファイル名を比較

UNIXについては詳しくありませんが、
半角スペースを含むファイル名は無いんでしょうか。

単純に比較したいファイル名と右端が一致するか調べれば良いのでは。

... 2003/02/28(金) 13:00:31
unixでは"/"以外の文字ならファイル名に使えたはず・・・

επιστημη 2003/02/28(金) 13:04:33
> 単純に比較したいファイル名と右端が一致するか調べれば良いのでは。
> unixでは"/"以外の文字ならファイル名に使えたはず・・・

なるほど。では:

#include <iostream>
#include <string>

int main() {
  std::string reference = "test.prm";
  std::string filename = "25日  10:02 test.prm";
  filename.erase(0,filename.size()-reference.size());

  std::cout << '[' << filename << ']' << std::endl;
  return 0;
}

古いスレッドには追加発言できません。