テキストにパスを書くには?

解決


マグ  2004-06-23 12:43:31  No: 114155  IP: [192.*.*.*]

ディレクトリー構成は

C---A---a.wav
  |
  --B---b.wav
      |
      --c.wav

の場合で
Cのフォルダを読み込ませて、その下の階層に検索をかけて、
テキストに
C\A\a.wav
C\B\b.wav
C\B\c.wav
のようにパスを書かせるにはどうすればいいでしょうか?

編集 削除
マグ  2004-06-23 12:54:58  No: 114156  IP: [192.*.*.*]

いい忘れたことがあります。

PC  :WindowsXP Professional
環境:VB.NET

です。

編集 削除
Say  2004-06-23 13:25:13  No: 114157  IP: [192.*.*.*]

ツリー表現でよければ
コマンドプロンプトで

C:\>tree c:\ /F > c:\Treedat.Txt

とかやればディレクトリ階層構造がファイル出力されますので、
それを読み込んで加工するとか。

編集 削除
マグ  2004-06-23 14:04:18  No: 114158  IP: [192.*.*.*]

説明不足でした。

m3uの再生リストを作成するために
テキストにパスを記載します。
その記載部分をコマンドプロンプトなどで手動でやるのではなく、
アプリケーションに自動でやってくれるようにしたのです。
なぜなら、まとめて音楽ファイルが140曲ぐらいありますので、
どうしようもないのでそれなら作るしかないというのが動機です。
どうがどのように記述すればそのような動作をするようになるのか教えてください。
お願いします。

編集 削除
36NET  2004-06-23 16:59:38  No: 114159  IP: [192.*.*.*]

一番簡単なのは
Shell "cmd.exe /c dir /B /S C:\tmp > C:\tmplist.txt"
でしょうか?

編集 削除
マグ  2004-06-24 08:58:54  No: 114160  IP: [192.*.*.*]

Shell "cmd.exe /c dir /B /S C:\tmp > C:\tmplist.txt"
の関数でC:\tmpの入力欄にC:\Documents and Settings\tmpと変えたら
tmplisu.txtが空白になっていました。
やっぱりだめかと思い
コマンドプロンプトの規則上パスに空白が入った場合ダブルクォーテーションで囲むというのがありましたから、試して見た所

Shell "cmd.exe /c dir /B /S C:\"Documents and Settings"\tmp > C:\tmplist.txt"としたらプログラムで使う所のShellの次に書いてあるダブルクォーテーションと重なってしまいエラーが発生します。
どうすればいいか教えてください。
お願いします。


あと、私の苦労して作ったソースでとりあえず完成しました。(条件がきび過ぎますけど・・・)

<名前空間にこれを記載してください。>

Imports System.IO

[FolderBrowserDialog1とSaveFileDialog1を追加してください。]

Private path() As String
    Private kakunin As String
    Private foruda() As String
    Private sasa As String
    Dim i As Integer
    Dim s As Integer
    Dim nagasa As Integer
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        'FolderBrowserDialog1を表示
        With FolderBrowserDialog1
            .SelectedPath = ""
            .ShowDialog()
            'ダイレクトリーの確認  ある場合はTrueを返す。
            kakunin = System.IO.Directory.Exists(.SelectedPath)
            If kakunin = "True" Then
                'ダイレクトリーの名前を配列に格納
                foruda = System.IO.Directory.GetDirectories(.SelectedPath)
            Else
                'Falseだった場合の対処法
                MessageBox.Show("最下層フォルダが存在しません。", "メッセージ")
            End If
            For i = 0 To UBound(foruda)
                '上の配列で格納した値を使いフォルダー一つ一つに入っているファイルを確認
                sasa = System.IO.File.Exists(foruda(i))
                If sasa = "False" Then
                    '配列pathにファイルを格納
                    path = System.IO.Directory.GetFiles(foruda(i))
                    For s = 0 To UBound(path)
                        '格納したファイルパスをテキストに表示して、改行する。
                        '作業場所  パス編集はここで
                        nagasa = path(s).IndexOf("デスクトップ")
                        path(s) = path(s).Substring(nagasa + 7)
                        TextBox1.Text = TextBox1.Text + path(s) + vbCrLf
                    Next
                End If
            Next
        End With
        With SaveFileDialog1
            .FileName = ""
            .Filter = "m3uの再生リスト|*.m3u"
            .ShowDialog()
            Dim hozon As System.IO.StreamWriter = _
        System.IO.File.CreateText(.FileName)
            hozon.WriteLine(TextBox1.Text)
            hozon.Close()
        End With
    End Sub

とこんな感じで・・・
そこで頼みがあります。
今のこのソースでは入力パスがデスクトップを通過してないと動作しない
↑は結果的にこれでいいです。(知っててわざとやっていますから・・・)

しかし、デレクトリー→デレクトリー→ファイルという並び方しか対応していません。
この対応に限らす指定したフォルダ内にあるファイルをテキストファイルに書き込むにはどうすればいいでしょうか?

編集 削除
36NET  2004-06-24 09:27:33  No: 114161  IP: [192.*.*.*]

ダブルクォーテーションの指定方法はこんなかんじです

Shell "cmd.exe /c dir /B /S ""C:\Documents and Settings\tmp"" > C:\tmplist.txt"

ソースの方は再帰関数を使用したほうが良いかと思います
関数(名称例:サンプル)の引数にディレクトリ名
1.ディレクトリ内を検索
2.検索結果からディレクトリ名を配列に格納
3.検索結果からファイル名を結果ファイルに追加
4.ディレクトリ格納配列数文ループ
    ディレクトリ情報を関数サンプルに渡してコール

とゆう関数を用意しておけば
1.結果ファイルの初期化
2.関数サンプルに検索対象のディレクトリ名を渡す

だけでファイルが完成します

編集 削除
マグ  2004-06-24 09:28:16  No: 114162  IP: [192.*.*.*]

私の苦労して作ったソースはやっぱり止めといたほうがいいかも?

明らかに難しすぎます。

やっぱり
36NETさんが教えてくれたShell "cmd.exe /c dir /B /S C:\tmp > C:\tmplist.txt"を使い保存したテキストを読み込んで編集することにしました。
そこで、indexOf&substringのコンボで編集したいと思いますが・・・
いきなり問題発生

テキスト表示したときに一緒に表示されるフォルダのパスを消したいんですけれど
そのパスが一行にわたって記載されているのですが、一行にパスをファイルかフォルダかどちらかを確認させて、フォルダなら削除
そして、ファイルなら先ほど書いたindexOfとsubstringで相対パスに変更させて保存させたいと思います。

んでもって聞きたいことがあって、書き込みさせてもらいました。

変数にテキスト文章の一行のみを入れるというようにするにはどうすればいいでしょうか?

前の記事で書いた
Shell "cmd.exe /c dir /B /S C:\tmp > C:\tmplist.txt"
の関数でC:\tmpの入力欄にC:\Documents and Settings\tmpと変えたら
tmplisu.txtが空白になっていました。
やっぱりだめかと思い
コマンドプロンプトの規則上パスに空白が入った場合ダブルクォーテーションで囲むというのがありましたから、試して見た所

Shell "cmd.exe /c dir /B /S C:\"Documents and Settings"\tmp > C:\tmplist.txt"としたらプログラムで使う所のShellの次に書いてあるダブルクォーテーションと重なってしまいエラーが発生します。
の対処方法を教えてください。
お願いします。

編集 削除
マグ  2004-06-24 09:33:01  No: 114163  IP: [192.*.*.*]

36NETさん  すみません。
投票されていることに気づきませんでした。

変数にテキスト文章の一行のみを入れるというようにするにはどうすればいいでしょうか?
しかも何行目かを指定できるようにするやり方も教えてください。

編集 削除
マグ  2004-06-24 09:48:23  No: 114164  IP: [192.*.*.*]

あと、もう一つお願いできますか?

With FolderBrowserDialog1
            .SelectedPath = ""
            .ShowDialog()
        End With
        With SaveFileDialog1
            .FileName = ""
            .Filter = "テキスト|*.txt"
            .ShowDialog()
            Shell("cmd.exe /c dir /B /S """ + FolderBrowserDialog1.SelectedPath + """ > " + SaveFileDialog1.FileName + "")
        End With

でShell関数を使って指定したファイルを指定した場所に保存をかけるプログラムを作ったんですけれど・・・
保存してくれません。
もちろんここのパスは先ほど書いたDocuments and Settingsなどみたいな感じで
スペースがかかわってきてしまいます。

編集 削除
36NET  2004-06-24 10:15:39  No: 114165  IP: [192.*.*.*]

SaveFileDialog1.FileNameにもスペースがある場合は
Shell("cmd.exe /c dir /B /S """ + FolderBrowserDialog1.SelectedPath + """ > " + SaveFileDialog1.FileName + "")
ではなく
Shell("cmd.exe /c dir /B /S """ + FolderBrowserDialog1.SelectedPath + """ > """ + SaveFileDialog1.FileName + """")

それでも駄目な場合は一度
dir /B /S """ + FolderBrowserDialog1.SelectedPath + """ > """ + SaveFileDialog1.FileName + """"
の部分を
dir /B /S "FolderBrowserDialog1.SelectedPathの値" > "SaveFileDialog1.FileNameの値"
とコマンドプロンプトで実行してみて下さい。
エラーメッセージか何かが出力されていると思います

ファイルの入出力はここら辺を参考にしていただければ
http://www.atmarkit.co.jp/fdotnet/vb6tonet/vb6tonet07/vb6tonet07_01.html
Whileでカウントを取れば行数もわかりますね

もともとLinuxとCが畑なもんでVB6をかじってる程度でVB.netは初心者ではなく未経験な...

編集 削除
マグ  2004-06-24 10:53:52  No: 114166  IP: [192.*.*.*]

ありがとうございます。
やっとShell関数が完了しました。

次に
変数にテキスト文章の一行のみを入れるというようにするにはどうすればいいでしょうか?
の方法を教えてください。
初心者なのでどうすればいいか分かりません。
お願いします。

編集 削除
36NET  2004-06-24 11:27:08  No: 114167  IP: [192.*.*.*]

Dim fileno As Integer
Dim s As String

fileno = FreeFile()

FileOpen(fileno, "c:\test.txt", OpenMode.Input)
While Not EOF(fileno)
  s = LineInput(fileno)
End While
FileClose(fileno)

これで変数sに一行づつデータが取得出来ると思うのですが?

編集 削除
マグ  2004-06-24 12:05:06  No: 114168  IP: [192.*.*.*]

Imports System.IO
Dim z As String
    Dim h As String
Dim fileno As Integer
            Dim s As String

            fileno = FreeFile()

            FileOpen(fileno, .FileName, OpenMode.Input)
            While Not EOF(fileno)
                s = LineInput(fileno)
                '処理をさせる
                Dim nagasa As Integer
                nagasa = s.LastIndexOf(".")
                If nagasa > -1 Then
                    'z = s.Substring(0)
                    z = s
                    Dim nanagasa As Integer
                    nanagasa = z.LastIndexOf("デスクトップ")
                    h = h + z.Substring(nanagasa + 7) + vbCrLf
                    Dim kiroku As System.IO.StreamWriter = _
        System.IO.File.CreateText(.FileName)
                    kiroku.WriteLine(h)
                    kiroku.Close()
                    MessageBox.Show("保存完了しました。", "メッセージ")
                End If
            End While
            FileClose(fileno)

これで処理をさせているのですけどエラーが発生してしまいます。
あと、.FileNameにはファイルパスが入っています。

編集 削除
マグ  2004-06-24 12:26:10  No: 114169  IP: [192.*.*.*]

36NETさん
答えてくださってどうもありがとうございました。

たくさん答えてくれたから、申し訳ないので
お礼です。

私が作ったm3uファイルリストを作る装置です。

TextBoxを一つとButtonを二つForm上に貼り付けてください。

<名前空間にこれを記載してください。>
Imports System.IO

<これをコピー&ペーストしてください。>

Private path As String
    Dim z As String
    Dim h As String
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        With FolderBrowserDialog1
            .SelectedPath = ""
            .ShowDialog()
        End With
        With SaveFileDialog1
            .FileName = ""
            .Filter = "テキスト|*.txt"
            .ShowDialog()
            path = .FileName
            Shell("cmd.exe /c dir /B /S """ + FolderBrowserDialog1.SelectedPath + """ > """ + SaveFileDialog1.FileName + """")
            MessageBox.Show("テキスト出力処理完了です。" + vbCrLf + "では、次の作業に進んでください。" + vbCrLf + "テキストファイルを読み込むをクリックしてください。", "メッセージ")
        End With
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        With OpenFileDialog1 'ダイアログの設定です。
            .CheckFileExists = True
            .RestoreDirectory = True
            .ReadOnlyChecked = True
            .ShowReadOnly = True
            .Filter = _
            "すべてのファイル(*.*)|*.*|テキストファイル(*.txt)|*.txt"
            .FilterIndex = 2
            If .ShowDialog = DialogResult.OK Then
                If System.IO.Path.GetExtension(.FileName) = ".txt" Then
                    Dim sr As New System.IO.StreamReader(.FileName, _
                                                    System.Text.Encoding.Default)
                    TextBox1.Text = sr.ReadToEnd '出力するテキストです。(必要ならば変えてください。)
                    sr.Close()
                Else
                    MessageBox.Show("テキストファイルを指定してください", "エラー")
                    Exit Sub
                End If
            End If
            Dim fileno As Integer
            Dim s As String

            fileno = FreeFile()

            FileOpen(fileno, .FileName, OpenMode.Input)
            While Not EOF(fileno)
                s = LineInput(fileno)
                '処理をさせる
                Dim nagasa As Integer
                nagasa = s.LastIndexOf(".")
                If nagasa > -1 Then
                    'z = s.Substring(0)
                    z = s
                    Dim nanagasa As Integer
                    nanagasa = z.LastIndexOf("デスクトップ")
                    h = h + z.Substring(nanagasa + 7) + vbCrLf
                End If
            End While
            FileClose(fileno)
        End With
        With SaveFileDialog1
            .RestoreDirectory = True
            .OverwritePrompt = True
            .Filter = _
            "m3uファイルリスト|*.m3u"
            .FilterIndex = 2
            If .ShowDialog = DialogResult.OK Then
                Dim sw As New System.IO.StreamWriter(.FileName, False, _
                                                System.Text.Encoding.Default)
                sw.Write(h)
                sw.Close()
                MessageBox.Show("保存完了しました。", "メッセージ")
            End If
        End With
    End Sub

編集 削除
マグ  2004-06-24 12:28:12  No: 114170  IP: [192.*.*.*]

解決押し忘れました。

それと同時に言い忘れも

ファイルリストを作成する時に作っている途中のデータはデスクトップ上で行ってください。
なぜなら、ソースの中のindexof関数の対象がデスクトップに指定されているからです。

編集 削除
マグ  2004-06-24 13:58:16  No: 114171  IP: [192.*.*.*]

ミスをしていました。

nanagasa = z.LastIndexOf("デスクトップ")

nanagasa = z.IndexOf("デスクトップ")
に変えてください。

後ろから調べるより前から調べたほうがいいと思います。

編集 削除