CInternetFileについて – プログラミング – Home

通知
すべてクリア

[解決済] CInternetFileについて


Nezu
 Nezu
(@Nezu)
ゲスト
結合: 17年前
投稿: 44
Topic starter  

お願いします。

以下のように、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;


引用未解決
トピックタグ
瀬戸っぷ
 瀬戸っぷ
(@瀬戸っぷ)
ゲスト
結合: 18年前
投稿: 178
 

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
 Nezu
(@Nezu)
ゲスト
結合: 17年前
投稿: 44
Topic starter  

返信遅くなりました。
瀬戸っぷ様、返信有難うございます。

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

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

これは仕様でしょうか?

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

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

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


返信引用
瀬戸っぷ
 瀬戸っぷ
(@瀬戸っぷ)
ゲスト
結合: 18年前
投稿: 178
 

>サーバ上のファイルに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
そのように使えるコマンドもなさそうですし。


返信引用
瀬戸っぷ
 瀬戸っぷ
(@瀬戸っぷ)
ゲスト
結合: 18年前
投稿: 178
 

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

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


返信引用
Nezu
 Nezu
(@Nezu)
ゲスト
結合: 17年前
投稿: 44
Topic starter  

瀬戸っぷ様、何度もありがとうございます。

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

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

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