喫茶XRAYトップページ

[▲前のスレッド]

[4234] サンプルプログラム 773_Indy_FTPGetPutについて返信 削除
2011/1/18 (火) 21:46:30 たたみや
こんばんは、Delphi2010で格闘しております。

たてぐやさんの座右の銘は、響きますな〜。
ここに書き込もうと思ったら、直前の書き込み。
肝にめいじます。

話変わりまして、マスターのところのサンプルプログラムを
バリバリ活用させていただいております。
ありがとうございます。

windows7(32bit) + Delphi2010(32bit) + 付属のindyにて
いろいろ試していました。
サンプルプログラム 773_Indy_FTPGetPut
の01のなかで

>>    FileSize := IdFTP1.Size(SourceFile);
>>    //ファイルのサイズが取得できたら実行
>>    //他の確認方法があるかも知れない


この部分がうまくいかず-1が帰ってきます。
そこでベタですが、

 //目的のファイルがあるディレクトリに移動
   IdFTP1.ChangeDir(FTP_Root_Dir+target_dir);
   IdFTP1.List;
   if Assigned(IdFTP1.DirectoryListing) then
    begin
     for i:=0 to IdFTP1.DirectoryListing.Count-1 do
      begin
       AFTPItem := IdFTP1.DirectoryListing.Items[i];
       if (AFTPItem.FileName)=fname then
        begin
         FTP_FileSize := AFTPItem.Size;
         break;
        end;
       end;
     end;

などとしてサーバ上のファイルサイズを調べています。

ここでついでに、お聞きしたいことがあるのですが、
サーバのデフォルト言語はUTF-8にしてあり、希にある日本語のファイルを
取得してリストボックスなどに入れると文字化けしてしまいます。

JPFileName := utf-8toJP(AFTPItem.FileName);
       ^^^^^^^^^
みたいな何か魔法はないでしょうか?
よろしくお願いします。

[4235] Re:サンプルプログラム 773_Indy_FTPGetPutについて返信 削除
2011/1/18 (火) 23:11:20 Mr.XRAY
▼ たたみやさん.どうも.

> JPFileName := utf-8toJP(AFTPItem.FileName);
>        ^^^^^^^^^
> みたいな何か魔法はないでしょうか?


これって,何かあったような,いえ,
>この部分がうまくいかず-1が帰ってきます。
これに関連してなんですが.
Indyって,少しバージョンが変わると文字コードページ関係の処理に
変化があるようですね.


[4236] Re2:サンプルプログラム 773_Indy_FTPGetPutについて返信 削除
2011/1/18 (火) 23:23:44 Mr.XRAY
http://mrxray.on.coocan.jp/bbs/DelphiBBS/mrxray_delphifan_coffe.cgi?tree=s3733#3733
 ↑
これ参考になりせんか.
こりゃ,いよいよDelphi 2010での確認,修正が必要になってきたようですね.
とりあえず... (^^;)

後,ここですか...
http://mrxray.on.coocan.jp/bbs/DelphiBBS/mrxray_delphifan_coffe.cgi?tree=s2930#2930


[4237] Re3:サンプルプログラム 773_Indy_FTPGetPutについて返信 削除
2011/1/19 (水) 00:11:14 たたみや
▼ Mr.XRAYさん

> http://mrxray.on.coocan.jp/bbs/DelphiBBS/mrxray_delphifan_coffe.cgi?tree=s3733#3733
>  ↑
> これ参考になりせんか.


はい、しかしながらバージョン依存で結果が変わるとしたら、
ここはベタでも手堅く行った方が無難かと・・・


> 後,ここですか...
> http://mrxray.on.coocan.jp/bbs/DelphiBBS/mrxray_delphifan_coffe.cgi?tree=s2930#2930


はっはっはっ〜♪
そういえば去年も同じことで、はまってましたね(^^;;)
しか〜し、今年はちゃんと

  IdFTP1.TransferType := ftBinary;

を入れて試しましたが、だめでした。

ファイル名の文字化けですが、RawByteStringやUtf8Decodeとか
試してみましたが、今ひとつ。
実際、サーバに置くファイルに関して日本語を使うことは、
まずないので問題ないのですが、何か引っかかるというか。。。

[4238] Re4:サンプルプログラム 773_Indy_FTPGetPutについて返信 削除
2011/1/19 (水) 00:20:21 DEKO
こんにちは、マスター。

> FTP で日本語

http://edn.embarcadero.com/article/images/40857/a4.pdf
コレの P48 辺りの事でしょうか?
外していたらゴメンナサイ m(_ _)m

[4240] Re5:サンプルプログラム 773_Indy_FTPGetPutについて返信 削除
2011/1/19 (水) 00:21:47 DEKO
あう。
「たたみやさん、こんにちは」が抜けておりました。

# マコトに申し訳ございません m(_ _)m

[4241] Re5:サンプルプログラム 773_Indy_FTPGetPutについて返信 削除
2011/1/19 (水) 00:26:57 Mr.XRAY
▼ DEKOさん,いやいやどうも.

> http://edn.embarcadero.com/article/images/40857/a4.pdf

これで興味を持ったのは for in do でございます.
知りませんでした.

> コレの P48 辺りの事でしょうか?

これですねぇ.
DEKOさんから,こういレスがあったということは.更にプレッシャーが
あっ,急に目が覚めてきた....
あっ,そうだ急ぎの仕事が(逃げ!! )


[4239] Re4:サンプルプログラム 773_Indy_FTPGetPutについて返信 削除
2011/1/19 (水) 00:20:21 Mr.XRAY
▼ たたみやさん

> を入れて試しましたが、だめでした。

むむっ.となると,更にいよいよ.
あっ,急に眠くなってきた Zzzzz.


[4242] サイズも取得できます返信 削除
2011/1/19 (水) 11:50:28 Mr.XRAY
▼ たたみやさん.どうも

> >>    FileSize := IdFTP1.Size(SourceFile);
> >>    //ファイルのサイズが取得できたら実行
> >>    //他の確認方法があるかも知れない
>
> この部分がうまくいかず-1が帰ってきます。


DEKOさんの資料のP58のコードでソースとデストの文字コードページを
変換すれば,サイズが取得できることを確認しました.
で,ファイルリストの方は,これから確認します.
MECSUtilsは,リンクのページのDEKOさんのサイトの説明にリンクが
あります.

サンプルプログラム集の方は,サンプルが多いので,修正版のUPは,
しばらくお待ちください.
あっ,それと,P58のコードにすれば,日本語でないファイル名も
修正したままのコードで使えます.念のため.


[4243] Re:サイズも取得できます返信 削除
2011/1/19 (水) 12:08:05 Mr.XRAY
失礼しました.
DEKOさんありがとうございます.
資料は目を通していたつもりなのですが,イザという時に出てきませんでした.
と,言うか,日本語のファイル名など,眼中になかったというのが本音です.


[4244] Re2:サイズも取得できます返信 削除
2011/1/19 (水) 12:57:33 DEKO
> と,言うか,日本語のファイル名など,眼中になかったというのが本音です.
デスヨネー (w

でも、普通のローカル PC でのファイルコピーのような操作を
FTP に求めるヒトって多いんですよね。

# そしてまた文字コードの説明から始まる...orz

[4247] Re3:サイズも取得できます返信 削除
2011/1/20 (木) 00:56:17 たたみや
▼ DEKOさん こんばんは

DEKOさんのサイトも、よく拝見させて頂いております。
大変勉強になります。ありがとうございます。

件の「ファイル名の文字化け」ですが、実害は無いので
後に回してしらんぷりしておきます(^^;;)

まだ試してはいませんが、ここらあたりでしょうか。
http://www.watercolor-city.net/ct_delphi/delphi_tiburon/doc_thirdparty/tp_indy_getwithtencoding.htm
http://www.ipentec.com/document/document.aspx?page=delphi2009-indy

ありがとうございました。

[4248] ファイルリストの日本語ファイル名の処理返信 削除
2011/1/20 (木) 13:10:59 Mr.XRAY
▼ たたみやさん,こんにちは.

ファイルリストの方も,文字化け対策コードを追加して確認しました.
ただし,

http://mrxray.on.coocan.jp/Delphi/plSamples/774_Indy_FTPDirFileList.htm#02

でテストしています.ファイルリストで,日本語のフォルダ名があった場合に
それを展開する時も同様な処理が必要となります.
もちろん,ディレクトリ名に日本語があった場合など...
いろいろ思考(試行?)をめぐらせています.

どういう形でサンプルプログラム集の見直しをするかも悩んでいます.
MECSUtilsの機能の一部しか利用しないので,直接コードにしてしまうと,
先のコード,

>  //目的のファイルがあるディレクトリに移動
>    IdFTP1.ChangeDir(FTP_Root_Dir+target_dir);
>    IdFTP1.List;
>    if Assigned(IdFTP1.DirectoryListing) then
>     begin
>      for i:=0 to IdFTP1.DirectoryListing.Count-1 do
>       begin
>        AFTPItem := IdFTP1.DirectoryListing.Items[i];
>        if (AFTPItem.FileName)=fname then
>         begin
>          FTP_FileSize := AFTPItem.Size;
>          break;
>         end;
>        end;
>      end;


このコードで,問題となるのはAFTPItem.FileNameです.
var
  FileName : String;
とでも定義して,以下の関数,関数内関数でもいいと思います.を作成します.

  function ChangeCodePage_forDisp(S : String) : String;
  var
    i  : Integer;
    U8 : UTF8String;
  begin
    SetLength(U8, Length(S));
    for i := 1 to Length(S)  do begin
      U8[i] := AnsiChar(S[i]);
    end;
    Result := UnicodeString(U8);
  end;

そして,この関数を使用して,

    FileName := ChangeCodePage_forDisp(FileName);

としてFileNameのコードを変換します.

掲示板ご覧の他の方へ.
このコードは,Delphi 2009以降,ホストのファイル名の日本語文字が
UTF-8の場合のものですので注意.
Shift-JISの場合は,

type
  SJISString = type AnsiString(932);   // Shift-JIS(CP932)

と宣言して,
U8 : UTF8Stringの代わりに使用します.
Delphi 2007以前では,Shift-JISの場合,この処理は必要ありません.


[4249] Re:ファイルリストの日本語ファイル名の処理返信 削除
2011/1/20 (木) 13:50:02 たたみや
▼ Mr.XRAYさん こんにちは

> ファイルリストの方も,文字化け対策コードを追加して確認しました.

いろいろとありがとうございました。
ばっちり日本語が表示されました。
お手数おかけしました。m(__)m

> でテストしています.ファイルリストで,日本語のフォルダ名があった場合に
> それを展開する時も同様な処理が必要となります.
> もちろん,ディレクトリ名に日本語があった場合など...
> いろいろ思考(試行?)をめぐらせています.


個人的な考えですが、linuxサーバに(?他もあるけど)Webデータを置く場合
日本語のファイル名を使うのは、それ自体が間違いだと思いますので、
マスターのサンプルコードにまで反映させなくてもよいと思います。
ただ貴重な「文字変換のサンプル」ですので、別途サンプルとして
どこかに残して頂ければうれしいです。

今回の私の場合ですが、VirtualBox + Vine5.2の環境で、phpがらみの
ホームページ作成実験をしていました。
ものぐさなもので、実際使わない画像ファイルも全部転送したら
日本語名が文字化けしたのでした。

また
type
  EUC_String = type AnsiString(20932);//  EUC-JP
  SJIS_String = type AnsiString(932); // Shift-JIS
var
  EU : EUC_String;
  SJ : SJIS_String;

とすれば、EUC-jpなんかも行けますよね。
本当にありがとうございました。


[4250] Re2:ファイルリストの日本語ファイル名の処理返信 削除
2011/1/20 (木) 14:11:54 Mr.XRAY
▼ たたみやさん こんにちは

> マスターのサンプルコードにまで反映させなくてもよいと思います。
> ただ貴重な「文字変換のサンプル」ですので、別途サンプルとして
> どこかに残して頂ければうれしいです。


これを読んで,少し救われました.
何かヒントぐらいは書いておきたいと思います.
DEKOさんの資料へのリンクだけだったりして... (笑)

> とすれば、EUC-jpなんかも行けますよね。

一応StringCodepage(AFTPItem.FileName)を使うと,自動判別して,処理を
分岐することもできます(確認済み).


[4251] Re2:ファイルリストの日本語ファイル名の処理返信 削除
2011/1/20 (木) 14:23:08 Mr.XRAY
▼ たたみやさん こんにちは

> 今回の私の場合ですが、VirtualBox + Vine5.2の環境で、phpがらみの
> ホームページ作成実験をしていました。


そうですよね.phpに,私も移行したいな〜,と思っているのですが,
文字コードも,今はShift-JISなんですが,UTF-8にでもしたいです.
時代に取り残されないように.


[▼次のスレッド]
INCM/CMT
Cyclamen v3.82