DOBON.NET DOBON.NETプログラミング掲示板過去ログ

テキストファイルに出力したい

環境/言語:[XP VB.NET]
分類:[.NET]

はじめまして、こんにちは。

あるフォルダに存在する全てのファイル名を取得して、テキストファイルに出力したいのですが、ファイル名の取得のコードはできたのですが、その一覧をテキストに出力という部分がわかりません。

参考書のサンプルを見て、テキストファイルに文字を出力する方法は分かりましたが、応用が利かず、困っています。

どなたか、教えて頂けると在り難いです。
宜しくお願い致します。
どうも。こんにちは。

> あるフォルダに存在する全てのファイル名を取得して、テキストファイルに出力> したいのですが、ファイル名の取得のコードはできたのですが、その一覧をテキ> ストに出力という部分がわかりません。

取得できたのなら、それをループで順番に出力していけばよいだけです。
For文とかWhile文等、方法はいくつかありますので検索してみてください。

まさか、ソースを書いてくださいなんて質問じゃないですよね・・・?
■No10486に返信(たぬぽんさんの記事)
お返事ありがとうございます。

>それをループで順番に出力していけばよいだけです。
For文とかWhile文等、方法はいくつかありますので検索してみてください。

> まさか、ソースを書いてくださいなんて質問じゃないですよね・・・?

それをループで順番に出力していけばよいだけです。の考え方が分かっても、
それをコードに起こせないので、困って質問させてもらってます。
こんにちは、じゃんぬ です。

■No10485に返信(ごっちゃまさんの記事)
> あるフォルダに存在する全てのファイル名を取得して

テキストファイルに出力だって同じことですよね? (^-^;)
System.IO.Directory.GetFiles() メソッドを使っているのならば、
For Each でやるだけじゃないですか?

まあ、TextBox1 という TextBox を貼り付けて以下のコードを実行してみてください。

Private Sub Button1_Click(...) Handles Button1.Click
    ' [テキスト] を出す TextBox
    TextBox1.Multiline = True
    TextBox1.Size = New Size(256, 128)

    '/ For Each を使って列挙する
    For Each nFileName As String In System.IO.Directory.GetFiles("C:\")
        TextBox1.AppendText(nFileName & System.Environment.NewLine)
    Next nFileName
End Sub
■No10487に返信(ごっちゃまさんの記事)
> それをループで順番に出力していけばよいだけです。の考え方が分かっても、
> それをコードに起こせないので、困って質問させてもらってます。

何が・どのように分からないのでしょうか?
ファイル名を順番に取り出す方法ですか?
それとも、ループ処理の書き方が分からないのですか?

ループの構文は以下のサイトを参考にしてみてください。
http://vbnet-iku2.hp.infoseek.co.jp/lecture07.htm
http://homepage1.nifty.com/rucio/main/dotnet/shokyu/standard7.htm
■No10489に返信(じゃんぬねっとさんの記事)
じゃんぬねっとさん、こんにちは。

> テキストファイルに出力だって同じことですよね? (^-^;)
> System.IO.Directory.GetFiles() メソッドを使っているのならば、
> For Each でやるだけじゃないですか?

取得したファイルを別フォルダにコピーするという処理を以前作ってみた事が
ありまして、じゃんぬねっとさんのおっしゃる通り、その時にFor Eachでコード
を書いてみて、正常に動きましたので、応用すれば出来ると思い取り組んでいたのですが、応用する頭がなく、壁にぶちあたった次第です・・・泣

HOSTのバッチ処理にのせたいので、コンソールアプリケーションで作成しているのですが、ご提示して頂いた、下記のコードと考え方は変わらないのですか?

初心者なので、は?と思われる質問をしているかもしれませんが・・汗

> まあ、TextBox1 という TextBox を貼り付けて以下のコードを実行してみてください。
>
> Private Sub Button1_Click(...) Handles Button1.Click
> ' [テキスト] を出す TextBox
> TextBox1.Multiline = True
> TextBox1.Size = New Size(256, 128)
>
> '/ For Each を使って列挙する
> For Each nFileName As String In System.IO.Directory.GetFiles("C:\")
> TextBox1.AppendText(nFileName & System.Environment.NewLine)
> Next nFileName
> End Sub
■No10491に返信(ごっちゃまさんの記事)
> ご提示して頂いた、下記のコードと考え方は変わらないのですか?
> 初心者なので、は?と思われる質問をしているかもしれませんが・・汗

いえ。ただ、「とりあえず、試してみてから質問しようね」と言いたくはなりますね。
■No10492に返信(はいこーんさんの記事)
> ■No10491に返信(ごっちゃまさんの記事)
> いえ。ただ、「とりあえず、試してみてから質問しようね」と言いたくはなりますね。

試してるよ。
■No10490に返信(たぬぽんさんの記事)
> ■No10487に返信(ごっちゃまさんの記事)
> 何が・どのように分からないのでしょうか?
> ファイル名を順番に取り出す方法ですか?
> それとも、ループ処理の書き方が分からないのですか?

たぬぽんさん、お返事ありがとうございます。

ファイルを取得できたのに、それを出力させるという処理に、どのように関連させれば良いのかが、まずわかりませんでした。

そもそも、StreamWriter(サンプルで見つけた)を使うやり方であってるのかとかですね・・処理ごとの関連のさせ方が分からない素人です・・。
■No10493に返信(ごっちゃまさんの記事)
> 試してるよ。
では、そう書いておくべきでしょう。(当たり前ですけど)
できなかったのなら、何故できなかったのか、自分で検証してますか?

質問の丸投げはマナー違反ですよ。
http://dobon.net/vb/bbs/index.html
■No10495に返信((匿名)さんの記事)
> ■No10493に返信(ごっちゃまさんの記事)

> 質問の丸投げはマナー違反ですよ。

ん?丸投げしてないよね?

テキストボックスに表示させるのと、出力するの、考え方は同じで良いのか、質問させてもらっただけなんだけど?
■No10494に返信(ごっちゃまさんの記事)
> ファイルを取得できたのに、それを出力させるという処理に、どのように関連さ> せれば良いのかが、まずわかりませんでした。
>
> そもそも、StreamWriter(サンプルで見つけた)を使うやり方であってるのかと> かですね・・処理ごとの関連のさせ方が分からない素人です・・。
いきなりプログラムを書くから混乱するんです。
メモ帳に処理の順番を書いていけば、どんな処理が必要なのかがわかります。
ひとつずつ整理してみてはいかがでしょうか。
> いきなりプログラムを書くから混乱するんです。

一応、やってはいるんですがね・・汗
こんにちは、じゃんぬ です。

■No10498に返信(ごっちゃまさんの記事)
> 一応、やってはいるんですがね・・汗

あのぅ... 何に困っているか今ひとつ見えないんですけど... (^−^;)
■No10499に返信(じゃんぬねっとさんの記事)

> あのぅ... 何に困っているか今ひとつ見えないんですけど... (^−^;)

すいません・・汗

テキストファイルに出力させる方法が分からないです。

じゃんぬさんの、

TextBox1.Multiline = True
TextBox1.Size = New Size(256, 128)

'/ For Each を使って列挙する
For Each nFileName As String In System.IO.Directory.GetFiles("C:\")
TextBox1.AppendText(nFileName & System.Environment.NewLine)
Next nFileName
End Sub

の考え方は素人の私もギリわかります・・ギリですが。

それでですね、この辺が応用を利かせる事ができない頭なんですが、
テキストボックスに表示させたのを、テキストファイルに出力に変えれば良いのだとおもいますが、まさに、それが分かりません。
こんにちは、じゃんぬ です。

■No10500に返信(ごっちゃまさんの記事)
> テキストファイルに出力させる方法が分からないです。
> それでですね、この辺が応用を利かせる事ができない頭なんですが、
> テキストボックスに表示させたのを、テキストファイルに出力に変えれば良いのだとおもいますが、まさに、それが分かりません。

■No10485 にて、
> 参考書のサンプルを見て、テキストファイルに文字を出力する方法は分かりましたが

と、発言されていますが、この文字の変わりにファイル名を出力するだけですよね?
私のコードで言えば「nFileName」という変数の中身を出力するだけじゃないんでしょうか?


    Dim hWriter As System.IO.StreamWriter

    Try '/ 例外が発生しても正しく閉じれるように Try 〜 Finally を使用
        hWriter = New System.IO.StreamWriter("C:\春が来ましたね.txt")

        '/ For Each で列挙しつつ、ファイルへ書き込む
        For Each nFileName As String In System.IO.Directory.GetFiles("C:\")
            hWriter.WriteLine(nFileName);    
        Next nFileName

    Catch
        Console.WriteLine("例外が発生しましたね")

    Finally
        If hWriter Is Nothing = False Then
            hWriter.Close()
        End If
    End Try
今ですね、

Private Function GetTargetFiles(ByVal strDirPath As String) As String()

Dim strFilePathes As String()
Dim iCount As Integer

For Each strFilePath As String In System.IO.Directory.GetFiles(strDirPath)

If strFilePath Is Nothing = False Then
ReDim Preserve strFilePathes(iCount)
strFilePathes(iCount) = strFilePath
iCount += 1
End If

Next strFilePath

Return strFilePathes

End Function

という、前に作った物を少し変えて流用したコードでファイルを取得するところまではできたんです。

で、このコードで取得できた一覧を、テキストファイルに出力をするという処理を別に作って、渡してあげないとダメなんじゃないか?と思い込んでいたのですが。

考え方が間違っていたのでしょうか?

それとですね、サンプルでみたのは

    With objStreamWriter

.WriteLine("ああああああ")
.Close()
End With

というヤツだったので、どーすれば良いのかと悩んでいました。
こんばんは、翔です。

■No10502に返信(ごっちゃまさんの記事)
> > For Each strFilePath As String In System.IO.Directory.GetFiles(strDirPath)
> > If strFilePath Is Nothing = False Then
> ReDim Preserve strFilePathes(iCount)
この iCount は最初にどちらで設定されているのでしょうか?
確実に初期化されていませんが、値の確認とかはされてますか?

> > という、前に作った物を少し変えて流用したコードでファイルを取得するところまではできたんです。
取得できているということは strFilePath にファイル名一覧が取得できているということですね。

> > で、このコードで取得できた一覧を、テキストファイルに出力をするという処理を別に作って、渡してあげないとダメなんじゃないか?と思い込んでいたのですが。
> > 考え方が間違っていたのでしょうか?
Return する前に処理を書けば別に分ける必要はないです。
ただ、サンプルのコードの Function 名が GetTargetFiles となっていますので、どこまで処理させたいのかが気になるところ。
Function 名をそのまま使うのであれば、Return した String 配列を使って、書き出す Function なり、Procedure なり作るといいです。
関数には、その意味のままの処理を作りましょうね。混乱の元になりやすいです。

> > それとですね、サンプルでみたのは
> >     With objStreamWriter
> > .WriteLine("ああああああ")
> .Close()
> End With
> > というヤツだったので、どーすれば良いのかと悩んでいました。
objStreamWriter が何かわかっていての質問でしょうか?
分かっていると判断します。そして、そのサンプルを試されました?実行済みであれば、出力されたファイルがあるはずで、その中のデータはどうなっていますか?

Dim i as Integer
With objStreamWriter
For i = 0 To iCount
.WriteLine(strFilePathes(i))
Next
.Close()
End With

これを Return の前に書いてみる。
テストしてないので書き方間違ってたら適宜修正してくださいね。

できればサンプルではなく、やろうとしているソースを載せてもらえるともっとアドバイスしやすいです。
お疲れ様です。

テキストファイルに出力できました。

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

出力された中身の、C:\test.txtのC:\を表示しないで出力する事は可能ですか?
■No10505に返信(ごっちゃまさんの記事)
> お疲れ様です。
> > テキストファイルに出力できました。
> > ありがとうございました。
> > 出力された中身の、C:\test.txtのC:\を表示しないで出力する事は可能ですか?
Replace で空文字にするとか、どうでしょう?
とりあえず、やろうとした手段とかまで言ってくれれば気持ち的に楽になるんですが・・・

ファイル名だけ取得ってできましたっけ? > 識者各位
■No10504に返信(翔さんの記事)
こんばんは、翔さん。

回答してくれていたんですね、ありがとうございます。

> この iCount は最初にどちらで設定されているのでしょうか?
> 確実に初期化されていませんが、値の確認とかはされてますか?

Module Module1

Sub Main()

Dim strFilePathes As String()

strFilePathes = GetTargetFiles("C:\TEST\")

End Sub

というふうになってますが、この事でしょうか?

すいません、ど素人ですので、おっしゃって頂いた事をすぐに理解できませんので・・汗

> 取得できているということは strFilePath にファイル名一覧が取得できているということですね。

取得はできていると思います。今のところ・・・。

> ただ、サンプルのコードの Function 名が GetTargetFiles となっていますので、どこまで処理させたいのかが気になるところ。

宜しければ、この意味も教えてもらえますでしょうか。

> 関数には、その意味のままの処理を作りましょうね。混乱の元になりやすいです。

常に混乱はしています。

じゃんぬさんに教えて頂いたコードも使わせて頂いて、書いたコードが下記です。

Imports System.IO
Imports System.Text

Module Module1

Sub Main()

Dim strFilePathes As String()

strFilePathes = GetTargetFiles("C:\TEST\")

End Sub
Private Function GetTargetFiles(ByVal strDirPath As String) As String()

Dim strFilePathes As String()
Dim iCount As Integer
Dim objStreamWriter As StreamWriter

Try '/ 例外が発生しても正しく閉じれるように Try 〜 Finally を使用

objStreamWriter = New StreamWriter("C:\ファイル名一覧.txt")

For Each strFilePath As String In System.IO.Directory.GetFiles(strDirPath)


If strFilePath Is Nothing = False Then
ReDim Preserve strFilePathes(iCount)
strFilePathes(iCount) = strFilePath
iCount += 1
End If

objStreamWriter.WriteLine(strFilePath)

Next strFilePath

Return strFilePathes

Catch
Console.WriteLine("例外が発生しましたね")
Finally
If objStreamWriter Is Nothing = False Then

objStreamWriter.Close()

End If

End Try

End Function

End Module

処理は流れていますが、おかしなところや、いらないところがありましたら、
教えていただけると幸いです。

宜しくお願い致します。
■No10504に返信(翔さんの記事)
> > ReDim Preserve strFilePathes(iCount)
> この iCount は最初にどちらで設定されているのでしょうか?
> 確実に初期化されていませんが、値の確認とかはされてますか?

VB.NET のローカル変数は、宣言されているメソッドに制御が移った時点で既
定値に初期化されますから、未定義の値を読んでしまう心配はありません。
iCount が 0 に初期化されていることを期待したコードは、仕様上も正当なも
のです。

もちろん、コードが読みやすいように変数初期化子を記述すべき、という意見
に反対するつもりはないです。
こんにちは、じゃんぬ です。

■No10506に返信(翔さんの記事)
> ファイル名だけ取得ってできましたっけ? > 識者各位

安全に行くならば、この辺りですね。
http://jeanne.wankuma.com/tips/path/06-getfilename.html

GetFiles メソッドに拘らなければ、FileInfo から取っても良いですが、遅くなりますね。
(結局、同じことをやっているんでしょうね)
こんにちは。

少し気になった所があったので書き込みさせて頂きます。
書かれているコードの中で下記の部分ですが

Sub Main()
Dim strFilePathes As String()
strFilePathes = GetTargetFiles("C:\TEST\")
End Sub

これは「GetTargetFiles」メソッドから帰って来て何かしてるのでしょうか?

Sub Main()
GetTargetFiles("C:\TEST\")
End Sub

これだけで良いんじゃないのかなと思うのですが・・・
経験浅いしVBほとのど知らないですが「Return」で
Mainに値を返す必要性あるのかな?と思いました。
■No10515に返信(ベルグさんの記事)
> これは「GetTargetFiles」メソッドから帰って来て何かしてるのでしょうか?

あなたは、

Private Function GetTargetFiles(ByVal strDirPath As String) As String()

の意味がわからないと?
あ〜すいません「Function」の事しりません。
良ければ是非教えて下さい。

ファイル名の取得について
前にタブブラウザ作るのにお気に入りファイルの取得で自分が参考にした所があったのを思い出しました。
すでにじゃんぬさんが良い参考場所張られていますが(汗
一応リンクおいときます
http://dobon.net/vb/dotnet/file/pathclass.html
>あ〜すいません「Function」の事しりません。
>良ければ是非教えて下さい。

すいませんこの分について撤回します。
質問応えても質問する場所じゃないわ(汗
こんにちは、みなさま。

じゃんさんのサイトはちょくちょく拝見させて頂いてます(^^)

で、試しに

For Each strFilePath As String In System.IO.Directory.GetFiles(strDirPath)

For Each strFilePath As String In System.IO.Path.GetFileName(strDirPath)
に変えてみたんですが、ダメでした・・。ダメな予感はしてましたが。

For Each strFilePath As String In System.IO.Directory.GetFiles(strDirPath)
で取得した一覧を、System.IO.Path.GetFileNameで取得して、書き出すというふうにするのでしょうか?
おはようございます。

■No10520に返信(ごっちゃまさんの記事)
> For Each strFilePath As String In System.IO.Directory.GetFiles(strDirPath)
> を
> For Each strFilePath As String In System.IO.Path.GetFileName(strDirPath)
> に変えてみたんですが、ダメでした・・。ダメな予感はしてましたが。

取得する部分を変更するのではなくて、
strFilePathに対してGetFileNameでファイル名を取得してみてください。

以下のように書き出すときに取得してもできるはずです。(試していません)
objStreamWriter.WriteLine(System.IO.Path.GetFileName(strFilePath))
たぬぽんさん、こんにちは。
早速、
> 以下のように書き出すときに取得してもできるはずです。(試していません)
> objStreamWriter.WriteLine(System.IO.Path.GetFileName(strFilePath))
を試させて頂きまして、ファイル名だけ出力する事ができました。
ありがとうございます。

> 取得する部分を変更するのではなくて、
> strFilePathに対してGetFileNameでファイル名を取得してみてください。

もしかしたら、私は凄い勘違いをしているのかもしれないのですが、
初めにファイルの一覧を取得していますが、その一覧は「strFilePathes」に
入ってると思ってたんですが、「strFilePath」に入ってるのですかね?

一つずつ書き出すから、
> strFilePathに対してGetFileNameでファイル名を取得してみてください。
という事になるという事で宜しいのですよね?

素人でご迷惑をおかけしておりますが、ご回答お願い致します。

ちなみに、
strFilePathに対してGetFileNameでファイル名を取得してみてください。
は、すぐに対処できる頭がありませんので、まだ試しておりません・・汗



■No10522に返信(ごっちゃまさんの記事)
> もしかしたら、私は凄い勘違いをしているのかもしれないのですが、
> 初めにファイルの一覧を取得していますが、その一覧は「strFilePathes」に
> 入ってると思ってたんですが、「strFilePath」に入ってるのですかね?
「strFilePathes」にも入っていますが、
ファイルに書き込んでいるところは

objStreamWriter.WriteLine(strFilePath)

ですよね?
書き込むところで「strFilePath」を使用しているのでそ、
ちらで取得すればよいと思っただけです。

ところで、
For Each 〜

Next
で何をしているか言葉で説明できますか?
どうも処理の内容を理解していないような発言が多いような気がします・・・。
> どうも処理の内容を理解していないような発言が多いような気がします・・・。
「コピペして動くソースを作れ!」と言ってるのと同じですね。これは、この掲示板の規約に反してる行為なのです。(他の方にも言われてるようですが)

http://dobon.net/vb/bbs/index.html
--
読み手や回答者を無視した自分勝手な質問は決してしないようにしてください。また回答者はそのような投稿を無視してください。
--

ということで、そろそろ無視するようにするのが筋ではないのですかね?

> 試してるよ。
試しているのならば、もっと別の質問の仕方が出来るはずです。疑問にぶつかっては、質問の丸投げといった行動は、流石になくなるかと。

> ん?丸投げしてないよね?
> テキストボックスに表示させるのと、出力するの、考え方は同じで良いのか、質問させてもらっただけなんだけど?

それを、丸投げというんですがね。自分勝手だからこそ、気付かないんでしょうね。
> ところで、
> For Each 〜
>
> Next
> で何をしているか言葉で説明できますか?
> どうも処理の内容を理解していないような発言が多いような気がします・・・。

自力で作ったのではなく、教わりながらコードを書いたので、詳しく理解はできていませんが、デバッグの時に処理の流れを確認しながら勉強しているので、大まかには理解しています。
で、存在しているファイルを「strFilePathes」に入れているのだと思っていたので、
「もしかしたら、私は凄い勘違いをしているのかもしれないのですが、
初めにファイルの一覧を取得していますが、その一覧は「strFilePathes」に
入ってると思ってたんですが、「strFilePath」に入ってるのですかね?」
という質問をしたのです。
strFilePathはstrFilePathesにファイルを入れる一時保管場所的な役割なのだと思っています。
>読み手や回答者を無視した自分勝手な質問は決してしないようにしてください。
の意味がわからん。
無視したいなら、どーぞ無視して下さいな。
┐(´∀`)┌
というか、
> あるフォルダに存在する全てのファイル名を取得して、テキストファイルに出力したいのです
と質問しただけで、ココまでスレが長引くのが面白かったです。
質問丸投げで、自分で考えようとしないからだろw
脳みそが腐っていないかと心配だぞwww
■No10526に返信(ごっちゃまさんの記事)

ごっちゃまさんは、ご自分の投稿がこの掲示板のマナー違反であることを理解してください。「書き込みのマナーについて」をお読みいただければ、なぜ批判されるか理解できると思います。

書き込みのマナーについて
http://dobon.net/vb/bbs/index.html
マナー違反だ!丸投げすんな!って、いちいち書き込んでるやつ等は暇人なのか?
マナーについて見ていたのですが

回答者のマナー
マナーが守られていない投稿は相手にせず、無視してください。

色々書いてる人たちもこれでマナー違反なのかなと思う今日この頃。

後こんなレス出してる自分も含めてですが、
質問回答する掲示板が話題がずれてきてる気もする。
何もここでもめごとしないでも・・・管理人さんがちゃんと見てくれてるし
そー思いますね。
管理人さん以外のヤツが、無視しろって言う権利ないし、
>読み手や回答者を無視した自分勝手な質問は決してしないようにしてください。
とか言う権利もない。
> 管理人さん以外のヤツが、無視しろって言う権利ないし、
> >読み手や回答者を無視した自分勝手な質問は決してしないようにしてください。
> とか言う権利もない。

権利が無いとは思わないな。

半ば公共の場で、自分自身の基準に照らして、自分にも他の人にも迷惑だと思う行為がされていたら、注意するのは自然なんじゃない?

口やかましくならないようには気をつけているつもりだけど、目に余ればやっぱり注意します。見てみぬフリみたいのは嫌いだから。

大体、権利どうこう言うなら、それこそ、そういう批判をする前に「丸投げ」な質問に自分自身がバンバン回答してあげればいいんじゃないかなーと思う今日この頃。
マナーが守られていない投稿は相手にせず、無視してください。

無視してない時点でマナー違反。
2005/04/21(Thu) 04:37:17 編集(投稿者)

マナーに関していろいろなご意見があると思いますが、これ以上の議論は「お気楽掲示板」でお願いします。私はこの掲示板のマナーを厳格に適用するよりもその目的を尊重したいと思っていますので、実を伴わない揚げ足取りや水掛け論のようなことはここではご遠慮ください。

私のこのような考え方を含め、ご意見のある方は、「お気楽掲示板」までお願いいたします。

DOBON.NET | プログラミング道 | プログラミング掲示板