数階層下の指定拡張子のフルパス(ファイル名まで)を取得したい

タグの編集
投稿者 TARO  (社会人) 投稿日時 2010/6/17 09:56:09
VB 超初心者のTAROです
入門講座第5回,5応用のとおりに入力し,C:\WINDOWS\ABC.BMP
と表示されました。
 そこでC:\AAA\BBB\CCC\ABC.BMPを置き,
実行すると \ としか表示されません。
 自分が知りたいのは,
例えば D:\AAA に実行プログラムを置き,数階層下のBMPのフルパス(ファイル名まで)を
取得したいのです。
D:\AAA\BBB\CCC\AIUEO.BMP または,D:\AAA\DDD\CCC\KAKIKUKEKO.BMP
のように,AAAフォルダの下のフォルダ名はいろいろと変わり,BMPのファイル名も変わります。
 上記目的のため,入門講座第5回,5応用 で,これでできるかと思いましたが,うまくいきませんでした。
どなたかご教授いただけないでしょうか。よろしくお願いします。
TARO

使用環境
VB2008 Express Edition .NET3.5
XP SP2 です


Public Class Form1
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim FolderName As String
        'TxtOpenFileName.Text = ""
        FolderName = Environment.GetEnvironmentVariable("C:\AAA\")
        TxtOpenFileName.Text = FolderName & "\" & Dir(FolderName & "\*.bmp")
        'Me.Close()
    End Sub
End Class
投稿者 るしぇ  (社会人) 投稿日時 2010/6/17 10:55:50
> FolderName = Environment.GetEnvironmentVariable("C:\AAA\")
とりあえず、そのメソッドのヘルプ(MSDN)を読んでください。
その命令がどんな意味を持つか理解してください。
自分がどれだけ馬鹿なコードを書いているか分かります。

[Directory.GetDirectories メソッド]
http://msdn.microsoft.com/ja-jp/library/c1sez4sc.aspx
指定したディレクトリ内のサブディレクトリの名前を取得します。
投稿者 TARO  (社会人) 投稿日時 2010/6/17 12:39:19
るしぇさん
早速の返事有り難うございます
GetEnvironmentVariable は,環境が持っているもの
WINDIR が C:\WINDOWS のことと解釈しました

[Directory.GetDirectories メソッド]
は,も少し基本を勉強したいと思います

VBを始めるにあたり,NETで見たり,初級の本も数冊買いましたが,基本が一番わかりやすかったのが,
当VB中学校でしたので,ここで質問した次第でした。
もし中学校レベルの基本書ご存じでしたら教えてください
有り難うございました。
投稿者 るきお(管理者)  (社会人) 投稿日時 2010/6/17 13:22:00
こんにちは。
私が記事を書きました。
入門講座第5回では誰でもすぐにプログラムを実行できるようにWindowsフォルダーの中にあるどれかのbmpファイルを取得するようにしています。
(この場所にはたいてい何かのbmpファイルがあるので、こう書いておけばみんながそれぞれの環境に合わせてプログラムを変更する手間を省けると思ったからです。)

ファイル名の場所を直接指定したい場合は次のようにもっとシンプルに書けます。
Private Sub Form1_Load(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles MyBase.Load
    
    txtOpenFileName.Text = "D:\AAA\BBB\CCC\AIUEO.BMP"
End Sub


これで知りたいことはわかりますでしょうか?

なお、入門講座第5回のこのサンプルの意図は、これまでに登場したメソッド・プロパティ・イベントというものが実際のプログラムの中でどのように使われるかを具体例で紹介することにあります。
bmpをjpgに変換するプログラムとしてはあまりよくないです。
・1個ずつしか変換できない。
・ファイル名をいちいち指定しなければならない。
・ファイルを選択するのではなく、ファイルのフルパスをいちいち自分で入力しなければならない。
などなど。
投稿者 るしぇ  (社会人) 投稿日時 2010/6/17 13:40:56
> WINDIR が C:\WINDOWS のことと解釈しました
OS が Xp ならその通りです。NT/2000 系だと C:\WINNT になります。
環境によって違うものが環境変数にて指定されています。

> もし中学校レベルの基本書ご存じでしたら教えてください
基本書なんて似たり寄ったりだと思ってます。
ファイルの操作・ディレクトリの操作が基本書に載っていれば、
そこからフォルダを順に調べて最下層まで検索する方法は、
自分の頭で考えることになります。
投稿者 :::  (社会人) 投稿日時 2010/6/17 14:12:17
> > WINDIR が C:\WINDOWS のことと解釈しました
> OS が Xp ならその通りです。NT/2000 系だと C:\WINNT になります。
WindowsNT/2000からアップグレードしたXPは?
投稿者 TARO  (社会人) 投稿日時 2010/6/17 16:07:50
るしぇ さん
>自分の頭で考えることに・・・
ですね

1.まず,検索しなければならない最初の場所を教える(C:\AAA)
2.その階層下にフォルダがあるか調べる(BBB)
3.あれば配列に追加代入する (C:\AAA\BBB)
4.さらにその下の階層にフォルダがあるか(CCC)
5.あれば配列に追加代入する(C:\AAA\BBB\CCC)


6.下のフォルダがないなら「*.BMP」を変数にフルパスで代入
   (AIUEO.BMP  KAKIKUKEKO.BMP)

いろいろ便利なメソッドがあるでしょうが,基本的な考え方はこんなもの
かと思います。回帰式とかあるようですが,基本の書き方がわかってからの
ことだと思っています。



るきお(管理者) さん
昔のN88ベーシック以来です。
概念がよりわかりやすいだろうとVBに挑戦しています
市販の本もいくらか見ましたが,VB中学校が一番わかりやすいと思います。
プログラムは,いろんな書き方,種類があるようで,VB中学校のように一つの
方法で進めていただいた方が,初心者には分かりやすいです。
一通り出来るようになったら,より便利な方法へと広げればいいですよね。

>これで知りたいことはわかりますでしょうか?
今回の質問では,ちょっと・・ですが
も少し,頑張ってみようと思います

今後ともよろしくお願いします。

るしぇ さん,るきお(管理者) さん 有り難うございました。
投稿者 るしぇ  (社会人) 投稿日時 2010/6/17 16:58:59
で、まぁ、こういった誰でも考えそうな基本的なプログラムは
Tips として公開されているので模範回答として自分のものと
見比べてみてください。
検索キーワード「最下層 フォルダ VB.NET」
http://jeanne.wankuma.com/tips/vb.net/directory/getfilesmostdeep.html
http://dobon.net/vb/dotnet/file/getfiles.html
http://hanatyan.sakura.ne.jp/dotnet/folder04.htm
投稿者   (社会人) 投稿日時 2010/6/18 10:02:48
参考書探すよりも、まずは、今回のように、
講座に書いてある内容を打ち込む。そして、自分なりにアレンジしてみる、という姿勢は、
何より大事だとおもいます。
ただ、今後は、「打ち込んだ内容が何を行っているか、全てきちんと理解する」ということを、
心がけるといいかと。

初めて見たメソッドや関数は、MSDNで調べ、ネットで調べ、何をしているのか理解して、
自分なりにコメントを加えていく。
そうしていくうちに、だんだん
「この処理がしたい→あそこで似たようなことやったな→参考にしよう」
あるいは、調べたときにも、やりたいことが含まれているソースの必要な部分をつぎはぎして、
自分が行いたいことを実現する、ということに繋がるよう、レベルアップできていくかと思います。
投稿者 流れ者  (社会人) 投稿日時 2010/6/18 14:32:33
蛇足かもしれませんが、私も一言。

TAROさんのVB学習への姿勢は、私もすばらしいと思います。
ある程度までは、講座などのサンプルをアレンジしていき、VB作成手順のイメージをつかめたらと思います。
次の段階としては、「こういうソフトを作りたい」と目標を決めて、一から作成してみることです。基準としては、「今もっている知識で6割ぐらいはつくれるけど、残りの4割は作れない」ぐらいが良いと思います。
目標がはっきりしていると、わかる部分/わからない部分が明確になり、わからない部分を調べる上でも、ただ漠然と調べるより、効率的に調べることができます。

なにわともあれ、がんばってください。
投稿者 葉流  (社会人) 投稿日時 2010/6/18 20:01:21
結局、下記で行くのが良いと思いますね。
フォルダ名を列挙する文字列配列を(例えば1000個分)作って、下記を実行して、
 Dim taiSyo As String = "C:\aaa"
 Dim locTb() As String = System.IO.Directory.GetDirectories(taiSyo)

その配列に locTb() の内容を移せば良いわけです。内容は単に文字列です。
その後、その配列の上から順に、文字列を上記の taiSyo に入れて、繰り返す。
配列の中身はどんどん増えて行きますが、無限には増えないので、
配列の最後まで行けば処理は終わり。
結果、当初の文字列配列に、必要なフォルダ名が蓄積されて行きます。
(日本語表現は難しいけど...)

文字列配列に蓄積されたのはフォルダ名だけですから、次に全ファイル名を
リストアップすればOK。
ただし、頭を "C:\" などにすると、配列は 10,000 を越えるでしょうからそれは注意。
また、フォルダ名称から、システムフォルダを避けるなどの工夫も、ときに必要です。
投稿者 単純化推進  (社会人) 投稿日時 2010/6/24 10:21:53
> http://jeanne.wankuma.com/tips/vb.net/directory/getfilesmostdeep.html
> http://dobon.net/vb/dotnet/file/getfiles.html
> http://hanatyan.sakura.ne.jp/dotnet/folder04.htm 

見てびっくり。上記は全て、初心者むけサンプルにはなりませんよ。
あれ(トリッキーソース)が理解できなければ、ソフト開発できないなんて
そう思ったら、誰も入門なんてできない。
ああいうものをただ真似ても、ソフト力に関して、一利無しと思いますね。
ただ、完全に理解している場合は別ですよ。それでも検証できなきゃ無意味。
投稿者 流れ者  (社会人) 投稿日時 2010/6/24 14:13:37
>見てびっくり。上記は全て、初心者むけサンプルにはなりませんよ。

!? 誰も初心者用サンプルとは言ってませんよ。単なる模範解答です。
確かに理解するのに時間はかかりますが、

> http://dobon.net/vb/dotnet/file/getfiles.html
は、ArrayList型とFor Each文の意味がわかれば、至極単純なソースに見えますが。。。