CInternetFileについて

[戻る]
Nezu 2010/05/07(金) 19:55:06
お願いします。

以下のように、FTP接続でサーバ上のファイルをオープンし、
データを書き込もうとしています。

しかし、Seekの部分でアサートが発生してしまいます。
Seekを通らないようにすると、WriteStringでアサートが発生します。
原因お分りになる方いましたらお願いします。

// オープン
// pFtpはCFtpConnectionのインスタンス(接続済み)
CInternetFile* pFile = pFtp->OpenFile("ファイル名", GENERIC_WRITE);
if(pFile == NULL)
{
    return FALSE;
}

//書き込み
pFile->Seek(1, CFile::end); ←ここでアサートが発生
pFile->WriteString("書き込む文字列"); ←Seekをコメントアウトした場合、ここでアサートが発生
pFile->Close();
delete pFile;

瀬戸っぷ [E-Mail] 2010/05/08(土) 01:13:41
InternetAPIは使ったことありませんが……

>CInternetFile* pFile = pFtp->OpenFile("ファイル名", GENERIC_WRITE);

バイナリモードでオーブンしています。
http://msdn.microsoft.com/ja-jp/library/1st6z7sc(VS.80).aspx
のdwFlagsにより。

>pFile->Seek(1, CFile::end); ←ここでアサートが発生

http://msdn.microsoft.com/ja-jp/library/c79tzysw(VS.80).aspx
の解説より。
>>現時点でこのメンバ関数は、CHttpFile オブジェクトに関連するデータに対してのみ、
サポートされています。
>>FTP または gopher 要求に対しては、サポートされていません。

>pFile->WriteString("書き込む文字列"); ←Seekをコメントアウトした場合、ここでア
サートが発生

http://msdn.microsoft.com/ja-jp/library/1st6z7sc(VS.80).aspx
の解説より。
>>OpenFile を呼び出してから CInternetConnection::Close を呼び出すまでの間、アプ
リケーションが呼び出せるのは CInternetFile::Read、CInternetFile::Write、
CInternetConnection::Close、または CFtpFileFind::FindFile だけです。


まぁ、FTPというプロトコルによる制限…といったところでしょうか。

Nezu 2010/05/11(火) 18:43:32
返信遅くなりました。
瀬戸っぷ様、返信有難うございます。

seek()とwritestring()を使うのをやめて
write()を使えば問題なく書き込めました。

ただ、
CInternetFile* pFile = pFtp->OpenFile("ファイル名", GENERIC_WRITE);
とすると、ファイルをオープンした際にファイルの内容がすべて破棄されてしまいました。

これは仕様でしょうか?

サーバ上のファイルにFTPで追記したい場合は、
一度ローカルにダウンロードして追記しアップロードする、という
手順が正しいのでしょうか?

パフォーマンスが落ちるので避けたいのですが...

皆さま、ご教授ください。

瀬戸っぷ [E-Mail] 2010/05/11(火) 23:03:41
>サーバ上のファイルにFTPで追記したい場合は、
>一度ローカルにダウンロードして追記しアップロードする、という
>手順が正しいのでしょうか?

FTPというプロトコルの性質上、そうなるかと。
あくまで「ファイル『転送』プロトコル」ですし。
ファイルを「編集」するのは無理かと。

http://ja.wikipedia.org/wiki/FTP%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%AE%E4%B8%80%E8%A6%A7
そのように使えるコマンドもなさそうですし。

瀬戸っぷ [E-Mail] 2010/05/11(火) 23:07:01
>ただ、
>CInternetFile* pFile = pFtp->OpenFile("ファイル名", GENERIC_WRITE);
>とすると、ファイルをオープンした際にファイルの内容がすべて破棄されてしまいました。


「これから、ファイルを書き込む」ということで破棄されて新しいファイルになるので
しょう。
SEEKできませんし。
サーバはデータコネクションで受け取ったデータをファイルに書き出すだけです。
# テキストモードの場合は改行コードを変換しながら…になりますが。

Nezu 2010/05/12(水) 10:11:23
[[解決]]
瀬戸っぷ様、何度もありがとうございます。

ダウンロード→編集→アップロード
という手順でやろうと思います。

勉強になりました、ありがとうございました。

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