ディレクトリー構成は
C---A---a.wav
|
--B---b.wav
|
--c.wav
の場合で
Cのフォルダを読み込ませて、その下の階層に検索をかけて、
テキストに
C\A\a.wav
C\B\b.wav
C\B\c.wav
のようにパスを書かせるにはどうすればいいでしょうか?
いい忘れたことがあります。
PC :WindowsXP Professional
環境:VB.NET
です。
ツリー表現でよければ
コマンドプロンプトで
C:\>tree c:\ /F > c:\Treedat.Txt
とかやればディレクトリ階層構造がファイル出力されますので、
それを読み込んで加工するとか。
説明不足でした。
m3uの再生リストを作成するために
テキストにパスを記載します。
その記載部分をコマンドプロンプトなどで手動でやるのではなく、
アプリケーションに自動でやってくれるようにしたのです。
なぜなら、まとめて音楽ファイルが140曲ぐらいありますので、
どうしようもないのでそれなら作るしかないというのが動機です。
どうがどのように記述すればそのような動作をするようになるのか教えてください。
お願いします。
一番簡単なのは
Shell "cmd.exe /c dir /B /S C:\tmp > C:\tmplist.txt"
でしょうか?
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
とこんな感じで・・・
そこで頼みがあります。
今のこのソースでは入力パスがデスクトップを通過してないと動作しない
↑は結果的にこれでいいです。(知っててわざとやっていますから・・・)
しかし、デレクトリー→デレクトリー→ファイルという並び方しか対応していません。
この対応に限らす指定したフォルダ内にあるファイルをテキストファイルに書き込むにはどうすればいいでしょうか?
ダブルクォーテーションの指定方法はこんなかんじです
Shell "cmd.exe /c dir /B /S ""C:\Documents and Settings\tmp"" > C:\tmplist.txt"
ソースの方は再帰関数を使用したほうが良いかと思います
関数(名称例:サンプル)の引数にディレクトリ名
1.ディレクトリ内を検索
2.検索結果からディレクトリ名を配列に格納
3.検索結果からファイル名を結果ファイルに追加
4.ディレクトリ格納配列数文ループ
ディレクトリ情報を関数サンプルに渡してコール
とゆう関数を用意しておけば
1.結果ファイルの初期化
2.関数サンプルに検索対象のディレクトリ名を渡す
だけでファイルが完成します
私の苦労して作ったソースはやっぱり止めといたほうがいいかも?
明らかに難しすぎます。
やっぱり
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の次に書いてあるダブルクォーテーションと重なってしまいエラーが発生します。
の対処方法を教えてください。
お願いします。
36NETさん すみません。
投票されていることに気づきませんでした。
変数にテキスト文章の一行のみを入れるというようにするにはどうすればいいでしょうか?
しかも何行目かを指定できるようにするやり方も教えてください。
あと、もう一つお願いできますか?
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などみたいな感じで
スペースがかかわってきてしまいます。
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は初心者ではなく未経験な...
ありがとうございます。
やっとShell関数が完了しました。
次に
変数にテキスト文章の一行のみを入れるというようにするにはどうすればいいでしょうか?
の方法を教えてください。
初心者なのでどうすればいいか分かりません。
お願いします。
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に一行づつデータが取得出来ると思うのですが?
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にはファイルパスが入っています。
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
解決押し忘れました。
それと同時に言い忘れも
ファイルリストを作成する時に作っている途中のデータはデスクトップ上で行ってください。
なぜなら、ソースの中のindexof関数の対象がデスクトップに指定されているからです。
ミスをしていました。
nanagasa = z.LastIndexOf("デスクトップ")
を
nanagasa = z.IndexOf("デスクトップ")
に変えてください。
後ろから調べるより前から調べたほうがいいと思います。