UNIXへのFTP時、ファイルチェックが上手く行きません。 – プログラミング – Home

UNIXへのFTP時、ファイルチェック...
 
通知
すべてクリア

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


sayumi
 sayumi
(@sayumi)
ゲスト
結合: 22年前
投稿: 3
Topic starter  

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も初めてでとても困っています。
どなたかご教授いただけないでしょうか?


引用解決済
トピックタグ
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 23年前
投稿: 1301
 

> strFileName = pFile.GetFileName();
> if (strFileName == HostFileName)

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

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

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


返信引用
sayumi
 sayumi
(@sayumi)
ゲスト
結合: 22年前
投稿: 3
Topic starter  

ありがとうございました。
作業場所=現場でないので、調査に時間がかかりそうですが
それからまた書き込みます。


返信引用
sayumi
 sayumi
(@sayumi)
ゲスト
結合: 22年前
投稿: 3
Topic starter  

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

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

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


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 23年前
投稿: 1301
 

> 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
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

>1.右から文字判定して、半角スペースが出てきたらファイル名の終わりと判断
>2.そこまでの文字列と比較したいファイル名を比較

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

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


返信引用
...
 ...
(@...)
ゲスト
結合: 23年前
投稿: 113
 

unixでは/以外の文字ならファイル名に使えたはず・・・


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 23年前
投稿: 1301
 

> 単純に比較したいファイル名と右端が一致するか調べれば良いのでは。
> 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;
}


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました