専門家に聞いた!繰り返す痔の原因は!? >>

こんばんは。いつもお世話になっております。

VB.NET+WinXPなのですが、
FTPサーバーにログインして、
LISTコマンドでファイル一覧を要求すると
「drwxrwxr-x 2 53 53 4096 Feb 28 2006 abc」
などというファイルやフォルダの一覧がかえって来ると思うのですが、
この中からファイル名やフォルダ名だけを取得するには
どうしたらよいでしょうか。
TABやコンマが入っていないので、文字列関数で切り取るにも
区切りがわからないと思うのです。
ローカルドライブのDir関数なら、FileAttribute.Nomalや.Directoryの指定でファイル名だけや
ディレクトリー名だけを指定して
取得することが出来るのですが、FTPサーバーの場合からの場合はどういった方法があるでしょうか。
参考程度でも構いませんので教えて頂けるとたすかります。m(__)m

このQ&Aに関連する最新のQ&A

A 回答 (2件)

#1>ファイル名やディレクトリ名にスペースが使われている場合もあって難しいかなと思うのですが、


全然問題なし♪
例えば
件のリストの1行はスペースで区切られた9のフィールドと考えられますけど、その場合
$line="-rwxrwxr-x 2 53 53 4096 Feb 28 2006 include space 1.jpg";
@field = split(/\s+/, $line, 9);#フィールド数をしていすると、最後はまとめられる

print $field[8];# 9番目のフィールドにスペースがあっても大丈夫
    • good
    • 0
この回答へのお礼

こんばんは。
ご回答ありがとうございます。
$lineは初めて見る感じなので、すぐにどういうことか理解できませんが、
詳しく調べてみたいと思います。
ありがとうございました。

お礼日時:2006/06/07 03:31

>TABやコンマが入っていないので、文字列関数で切り取るにも区切りがわからないと思うのです。


スペースが入っているみたいなので、切り分けできると思います。
split 関数を使うのが簡単です。
    • good
    • 0
この回答へのお礼

こんばんは、ご回答ありがとうございます。
GOOに投稿すると自動でつめられてしまうようで
気が付かなかったのですが、実際には
-rwxrwxr-x___2_53_______53___________4096_Feb_28__2006 1.jpg
(_アンダーバーが実際はスペースです)となっております。
ファイル名やディレクトリ名にスペースが使われている場合もあって難しいかなと思うのですが、
また何かよい方法がありましたら、教えて頂けると助かります。

お礼日時:2006/05/27 22:06

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QVB2008でFTPでのディレクトリー存在確認のやり方が分からない。

VB2008でFTP転送のブログラムを組んでいるのですが、ディレクトリーの存在確認のところで詰まっています。
ネット検索を行うと、下記記述が幾つか出てきますが、使い方、記述方法が分かりません。

if文を使い、FALSE か TRUEかで確認を行いたいと思っております。

ご存じの方がいらっしゃいましたらご教授下さいませ。
当方は初心者です。
宜しく御願い致します。

WebRequestMethods.Ftp.ListDirectory
WebRequestMethods.Ftp.ListDirectoryDetails

Aベストアンサー

一応、確認ですけど、FTPサーバー側のディレクトリ有無確認ですよね?
Directory.Exists(xxx) みたいのは無いんですねー

で、ちょっと調べてみましたが、@iITさんのところによさげなサンプルコードがありました。(大分下の方です。)
http://www.atmarkit.co.jp/fdotnet/dotnettips/763ftpdirexists/ftpdirexists.html

QFTPでリモートのファイル一覧取得

BashでFTPでリモートに接続し、リモートの対象フォルダ内のファイル一覧をローカルフォルダ内にファイルとして出力するにはどうしたらいいのでしょうか?
教えて下さい。

Aベストアンサー

bashということは、Unix系のコマンドライン操作ですね。

ftpコマンド処理を自動化するようにして、その標準出力をファイルにリダイレクトすればできると思います。
例えば、ftp.batに以下の内容を書いておきます。
---------------------------------------
open ftp.hoge.com
user USER PASSWD
cd DST_DIR
ls
---------------------------------------
※ USERはftpサーバのユーザ名です。
※ PASSWDはftpサーバのパスワードです。
※ DST_DIRはlsしたい対象ディレクトリ(のフルパス)。

このファイルを使って、-nオプション付きでftpプログラムを以下のように実行します。

ftp -n < ftp.bat > ls.txt

ls.txtには、目的のディレクトリでlsした結果が書き込まれます。

「ftpコマンド処理を自動化する」については、参考URLを見てください。Windowsの標準のftpでも同じことができますが、ちょっとお行儀が違うようです。Windowsについては、以下を参考にしてください。
http://www.atmarkit.co.jp/fwin2k/win2ktips/270ftpscript/ftpscript.html

参考URL:http://www.zdnet.co.jp/help/tips/linux/l0462.html

bashということは、Unix系のコマンドライン操作ですね。

ftpコマンド処理を自動化するようにして、その標準出力をファイルにリダイレクトすればできると思います。
例えば、ftp.batに以下の内容を書いておきます。
---------------------------------------
open ftp.hoge.com
user USER PASSWD
cd DST_DIR
ls
---------------------------------------
※ USERはftpサーバのユーザ名です。
※ PASSWDはftpサーバのパスワードです。
※ DST_DIRはlsしたい対象ディレクトリ(のフルパス)。

このファ...続きを読む

QVBでフォルダ単位のFTP

VBでフォルダ単位のFTP(GET,PUT)はできるのでしょうか?
また、そのサンプルファイルがありましたら、教えて下さい。
ファイル単位での、サンプルファイルはあったのですが、
それを、フォルダ単位に改造する知識がまだないのです。
よろしくお願い致します。

Aベストアンサー

こんにちは 田吾作7@通信苦手です。。。

二つ例を挙げておきますね。
kernel32.dllを使用した場合
http://www.mitene.or.jp/~sugisita/family/papa/vb/
上記URLのコンポーネントの中のFTPクラスにサンプルがあります。

Wininet.dllを使用した場合
http://www.int21.co.jp/pcdn/vb/onepoint/knvol0812.html

ちなみにフォルダを丸ごとのアップというのは無理だったような・・・
何かFTPソフトを使用してますよね?
ぼくもの使用してるFTPソフトは、処理状況をステータスバーで表示してあるので、処理内容が何となく想像がつきます。
ローカルディスクと同じ構造でアップロードするというボタンがあるのですが、やってる事は、ファイルを1つずつアップして、フォルダがあれば作成して、その中のファイルをアップして・・・というようなことを最も下位層のフォルダ内のファイルまでのループ(再帰法?)をしてるようです。

QFTPコマンドでディレクトリごとファイル移動できるコマンドはありますか?

タイトルどおりなのですが、FTPでファイルを転送する際に、サブフォルダを含むディレクトリごとファイル転送するコマンドはありますでしょうか。
ディレクトリの中にあるすべてのファイルを移動したいのですが、サブフォルダがたくさんあるので、わざわざディレクトリの場所へ移動してmputを繰り返すのはめんどうで仕方ありません。
よろしくお願いします。

Aベストアンサー

ご使用になるOS環境が書いてないのですが、Linux,BSD等ならncftpで、get -R dir。
Windowsならffftpを使えば良いと思います。

Qフルパスから最後のディレクトリ名を取得したい。

vb.netなのですが、例えば
c:\aaa\bbb\ccc\ddd\eee\fff.exe
というフルパスがあったとして、
eeeというディレクトリ名を取得したいのですが、
何か良い方法はないでしょうか。
それぞれのディレクトリ名の文字数や階層数は
決まっていないのですが、オススメの方法が
ありましたら、教えて頂けると助かります。

Aベストアンサー

MessageBox.Show(IO.Path.GetFileName(IO.Path.GetDirectoryName(myPath)))

IO.Path の GetDirectoryName でフォルダのフルパスを取得して、さらに IO.Path の GetFileName で最終フォルダ(またはファイル)の名前を取得。

QFTP接続中かどうかを調べる

■vb.net 2005
txtファイルを外部ホスティングサーバーに送りあげるシステムがあります。このシステムを運用テストしている中で、稀ではありますがftp接続をしたとき、エラーとはならずに、固まった状態でexeがタスクマネージャーに残ってしまう可能性があることが判りました。
その場合の対処方法として、該当exeのプロセスIDが一定時間変化がなく、かつftp接続中ではないときにexeを強制終了する仕組みを考えています。
プロセスIDを取得する方法は見つかっていますが、ftp接続中かどうかを判定する方法が判りません。
 ご教授ください。
また、上記以外の方法で、このような事象に対しての良い対処方法があればご教授頂ければ幸いです。

Aベストアンサー

すみません。.netのソースはわかりません。

即席で調べて見たのですが、補足されたソースのどこに問題があるのかはっきりわかりませんでした。

が、気づいたこととして、

○If Int_Err = 3 Then
の部分は、If Int_Err >= 3 Then のほうがいいのでは?
Int_Errはどこでリセットしているのでしょう?

○「Streamを取得」=>「ファイルを開く」=>「Streamに書き込む」のどの時点でエラーが起きているのかわからないように思います。
「Streamを取得」したあとにエラーが起きているときには、reqStrm.Close() が実行されないまま、Try に戻っているのではないですか?

○Catch wex As System.Net.WebException だけしか見えませんが、他の例外処理はないのでしょうか? これ以外のエラーが発生した場合にどうなるのでしょう?

○3回のリトライが失敗しても UpRoad = True にしていますが、その後の処理はどうしているのでしょうか?

私のFTPソフトはVB6で作りました。.netのコードについては評価できません。

まとはずれでしたら、ご容赦ください。

すみません。.netのソースはわかりません。

即席で調べて見たのですが、補足されたソースのどこに問題があるのかはっきりわかりませんでした。

が、気づいたこととして、

○If Int_Err = 3 Then
の部分は、If Int_Err >= 3 Then のほうがいいのでは?
Int_Errはどこでリセットしているのでしょう?

○「Streamを取得」=>「ファイルを開く」=>「Streamに書き込む」のどの時点でエラーが起きているのかわからないように思います。
「Streamを取得」したあとにエラーが起きているときには、reqStrm...続きを読む

Qftpのmgetコマンドの自分の格納場所の指定方法は?

先日、ftpコマンドについてこのサイトで色々教えていただき感謝しております。

複数のファイルを受信するのにmgetコマンドを教えていただいたのですが、
相手より受信した場所の格納場所の指定が上手くいきません。

先方にFTPとしてログインでき、"PROMPT"→"MGET *"と行うのですが、受信したファイルの格納場所がCドライブの直下になってしまいます。
自分のインターネットサービスマネージャーの
ルートは別のフォルダに設定してあるのですが、これは受信したデータの初期値にはならないのでしょうか?
また、調べたところ省略すると、ワーキングディレクトリに作成されるみたいにかかれていましたが、ワーキングディレクトリはどこかで指定できるのでしょうか?

たとえばC:\AAAに受信したファイルを格納したい場合はどうやって書けばよいでしょうか?

MGET * C:\AAA見たいに色々試して見ましたが、駄目でした。

Aベストアンサー

方法は2つあります。

(1)データを格納するディレクトリに移動してからftpを起動させる。

cd 格納先ディレクトリ
ftp ホスト名
mget *

(2)ftpした後格納するディレクトリを指定する方法

ftp ホスト名
lcd 格納先ディレクトリ(自分のマシン)
mget *


lcd とは、"Local Change Directory" と思っておくと忘れなくていいですよ♪

Qexcelから直接FTPフォルダを開きファイル選択したい

FTP上の二つのファイルを結合して、データを作るエクセルを作ろうとしています。

誰でも触れるようにしろと上司に言われているので、
1.FTPソフトの自動実行(ダウンロードするファイルは手動選択)
2.CSVファイルを取込んだあと、結合の自動化
まではできるようにしました。

ただFTPソフト(FFFTP)でファイルを選択せず、直接ExcelからFTPのファイルを読みにいけるようにしたいと思ってます。
(ファイル名は毎回変わります。)
またFTPはユーザ名とパスワード入力が必須になってます。

ExcelからFTP上のフォルダにアクセスし、ファイルを選択して読みにいけるようにする方法はあるでしょうか?
Excelのバージョンは2000です。

Aベストアンサー

丁度同じようなことを調べたことがありますが、解決したので参考URLを捨ててしまいました。(すみません)
『VBA FTP』で検索すると、かなりの数がヒットしますので見つかると思います。
基本的に送受信可能です。

参考までにとっかかりになりそうなURLを・・・
<VBAのみで送受信>
  http://mitsu.fam.cx/~mitsu/blog/2006/11/vbaftp.html
  http://www.happy2-island.com/access/gogo03/capter90100.shtml
<BASP21を利用する方法>
  http://officetanaka.net/excel/vba/tips/tips47.htm

QVBでのAPI

いつもお世話になっています。

今回初めて、APIを使うVBのプログラミングをしているんですが、サーバからのファイル名取得でつまずいています。
long型変数 = FtpFindFirstFile(セッション番号, ディレクトリパス, str型変数, 0, 0)
って感じで、何かしらファイルが存在するかどうかは戻り値で判定できるのですが、ファイル名自体が取得できません。(複数ファイルが存在するときは、どれか一つのファイル名が取得できれば問題ないです)
いろんなサイトを調べたのですが、「引数の文字列変数に"情報"が取得される」ようなふうに書かれており、はっきりしません。ちなみに私の作成中のPGでは、引数の文字列変数は何も格納なれない状態です。
どなたか詳しい方、教えてくれませんか?

Aベストアンサー

>「引数の文字列変数に"情報"が取得される」

FtpFindFirstFile()の第3引数はWIN32_FIND_DATA(のポインタ)だと思うのですが(^^;

http://vbvbvb.com/jp/gtips/0101/gFtpFindFirstFile.html
http://yokohama.cool.ne.jp/chokuto/urawaza/struct/WIN32_FIND_DATA.html
あたりが参考になると思います。

QCloseとDisposeの違い

みなさまこんばんわです。よろしくお願い申し上げます。

VB.NET 2008でコーディングしています。
CloseとDisposeの違いについて教えていただきたいのです。

これらのメソッドは、開いたファイルを閉じるときなどにも使いますが、今回お尋ねするのは、フォームを閉じるとき、しかも、自ら呼び出すとき(Me.Close() と、Me.Dispose() )のみに限ったこととしてお話しさせていただきます。

たとえば、ShowDialog() で呼び出したフォームは、そのフォーム内でMe.Close() しても、プロセスは残り、たとえば、タイマーコントロールのイベントに記述していますと、それは実行され続けます。

これを防ぐために、Me.Dispose() を使います。すると、きれいにプロセスは終了し、イベントは発生しない模様です。

そこで、「フォームを閉じる」意味のMe.Close() をすべてMe.Dispose() に変えてしまいました。確実にプロセスを破棄出来ると思ったからです。Webで調べると、違いは「再利用できる、できないの違い」という答えがありましたが、それはきっと、ファイルやオブジェクトのことで、フォームの場合は、再びShowまたはShowDialogで表示させることは可能でしたので、特に問題は感じていませんでした。

ところが、アプリケーション設定で、「最後のフォームを閉じるとき」にアプリケーションがシャットダウンする設定になってるのに、シャットダウンしてくれないことが起こりました。調べてみると、Me.Dispose() が原因。Me.Close() に変えるとうまくいきました。

わけわからなくなってきました。。。

ちなみに、その残ったフォームは、スタートアップフォームであり、別のフォームからShowまたはShowDialogメソッドで呼び出したものではありません。

ここで4つの仮説を立ててみました。

1. ShowDialogで呼び出したフォームは、Me.Dispose()、Showで呼び出した、あるいは、スタートアップフォームは、Me.Close() すれば破棄できる

2. ShowDialogで呼び出したフォームは、Me.Dispose()、スタートアップフォームは、Me.Close()、Showで呼び出したフォームは、どちらでも、破棄できる

3. 呼び出し方ではなく、別の要因が存在する

4. 併記する必要がある場合がある

Me.Close()
Me.Dispose()

または、

Me.Dispose()
Me.Close()



どれが正しいのでしょうか?どなたがご存じの方がいらっしゃいましたら、ご教授いただけませんでしょうか? どうぞよろしくお願い申し上げます。ありがとうございました。

みなさまこんばんわです。よろしくお願い申し上げます。

VB.NET 2008でコーディングしています。
CloseとDisposeの違いについて教えていただきたいのです。

これらのメソッドは、開いたファイルを閉じるときなどにも使いますが、今回お尋ねするのは、フォームを閉じるとき、しかも、自ら呼び出すとき(Me.Close() と、Me.Dispose() )のみに限ったこととしてお話しさせていただきます。

たとえば、ShowDialog() で呼び出したフォームは、そのフォーム内でMe.Close() しても、プロセスは残り、たとえば、...続きを読む

Aベストアンサー

Me.Close()
Me.Dispose()
は根本的に違うものです。

formについて、Close()メソッドはフォームの表示を終了させるメソッドです。

ほかのクラスも同様。すべてのDispose()メソッドについて、これはインスタンスの破棄を明示的に行うものです。

>再利用できる、できないの違い

Dispose()はインスタンスが破棄されるため、再びコンストラクタを用いて、インスタンスを生成しないいけません。

一方Close()はインスタンスが残っているので、それを利用することができます。

>1. ところが、アプリケーション設定で、「最後のフォームを閉じるとき」にアプリケーションがシャットダウンする設定になってるのに、シャットダウンしてくれないことが起こりました。調べてみると、Me.Dispose() が原因。
Me.Close() に変えるとうまくいきました。

通常はどちらでもうまくいきます。

>2. ShowDialogで呼び出したフォームは、Me.Dispose()、スタートアップフォームは、Me.Close()、Showで呼び出したフォームは、どちらでも、破棄できる

ShowDialogの場合は、メソッド内部で、ハンドルが破棄されているため、Close()メソッドの際にDispose()メソッドが呼び出されます。

>3. 呼び出し方ではなく、別の要因が存在する

そう思います。

>4. 併記する必要がある場合がある

インスタンスを明示的に破棄したほうがよい場合は多く存在します。
Disposeが使えるメンバはIDisposableをインターフェースとして持っているメンバです。
これらのメンバは、外部とのやり取りを行うものが多くあります。
たとえばSQLClientに含まれるようなメンバです。

外部とのコネクションを確実に破棄を保障してほしいなどという場合がありますよね、このようなときに使用します。

Using構文を使用するのとまったく同じ理由になります。
正確にはUsing構文を使用できるメンバには条件があります、IDisposableをインターフェースとして持っているメンバに限るというものです。

ほかにもガーベージコレクタによるファイナライズを伴うかどうかという違いがあります。
Disposeの場合はファイナライズが同時に行われるため、使用していたメモリ空間を開放することができます。

上記のような理由により、
Me.Close()
Me.Dispose()
は両方書いたほうがよいと思います。

蛇足ですが、
Me.Dispose()
Me.Close()
はエラーになります。
Me.Dispose()により、Me本体(インスタンス)は削除されてしまいます。
存在しないMeに対してCloseメソッドを要求することはできないためです。

Me.Close()
Me.Dispose()
は根本的に違うものです。

formについて、Close()メソッドはフォームの表示を終了させるメソッドです。

ほかのクラスも同様。すべてのDispose()メソッドについて、これはインスタンスの破棄を明示的に行うものです。

>再利用できる、できないの違い

Dispose()はインスタンスが破棄されるため、再びコンストラクタを用いて、インスタンスを生成しないいけません。

一方Close()はインスタンスが残っているので、それを利用することができます。

>1. ところが、アプリ...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング