• ベストアンサー

VB2005 でパス名が誤っていないかチェックする方法について

VB2005 の初心者です。 iniファイルで指定したフォルダ(パス)を読み込んで処理をしたいのですが、指定したパスが誤っている場合は、どのようにチェックすれば良いのでしょうか。 下記サンプルのとおり、System.IO.Path.GetInvalidPathChars() でチェックする方法があるようですが、ヘルプには「ファイル名やディレクトリ名としては無効なすべての文字が含まれるかどうかは、保証されません。」とあるようです。 実際、"Cd:\<>Work\Test.txt" というパスにすると、チェックはスルーしてしまいました。 Dim filepath As String = "C:\<>Work\Test.txt" Dim invalidPathChars As Char() = System.IO.Path.GetInvalidPathChars() For Each invalidChar As Char In invalidPathChars If filepath.IndexOf(invalidChar) > -1 Then Console.WriteLine("使用できない文字 " & invalidChar.ToString() & " が含まれています。") End If Next 誤ったパスを完全にチェックする方法はあるのでしょうか。 何かヒントになることでも良いので、皆様の知恵をお借りできれば幸いです。 よろしくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • kouji_124
  • ベストアンサー率46% (283/605)
回答No.5

#2です >無い場合、IO.Directory.CreateDirectory で作成しようとすると、"Cd:\Projects" というフォルダは作成できないのでエラーとなってしまうのです。 「CreateDirectory」の戻り値が「DirectoryNotFoundException」で有ればパスが間違えていると判断できると思いますが。。。 http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/cpref/html/frlrfSystemIODirectoryClassCreateDirectoryTopic.asp 余り深く考えず、「CreateDirectory」がエラーで失敗すると言う事はパスに何らかの問題があると考えられますから、そこで判断するだけでも十分かと思います。

noname#51596
質問者

お礼

再度の回答、本当にありがとうございます! CreateDirectory の戻り値が返ってくるとは、調査不足でした。 ただ、実験してみると、戻り値は NotSupportedException でしたが、これでエラーが拾えることが確認できました。 初歩的な質問でしたが、本当にありがとうございました!

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (4)

  • HIROs-NET
  • ベストアンサー率78% (15/19)
回答No.4

ファイルの有無を確認し、なければ作成するとのことですが、ファイルの有無の確認はどのメソッドを使用していますか? File.Existメソッドを使用しえいる場合は、存在しないパスが指定されてもエラーで落ちることはないはずですが? よろしかったら、その辺の詳細を教えていただけますか?

noname#51596
質問者

補足

回答ありがとうございます! おそらく、質問内容のソースは HIROs-NET 様のページを参考にさせていただいたものです。 質問の説明が誤っており、大変申し訳ありません。 System.IO.Directory.Exists でフォルダの有無を確認して、無い場合、IO.Directory.CreateDirectory で作成しようとすると、"Cd:\Projects" というフォルダは作成できないのでエラーとなってしまうのです。 フォルダの有無の確認と、パス自体があり得るパスかどうかの確認は別物ですよね?? 完全なパスのチェックはできるのでしょうか??

全文を見る
すると、全ての回答が全文表示されます。
  • NYOI
  • ベストアンサー率58% (56/96)
回答No.3

ファイルの存在確認 System.IO.File.Exists(filePath) ディレクトリの存在確認 System.IO.Directory.Exists(dirPath) 上記でfalseが返って来た場合はパス自体が間違っているとみなして、パスから再設定させてはいかがですか? パスの再設定にはFolderBrouwserDialogなどを利用して、確実に存在するパスを指定させれば大丈夫かと。

noname#51596
質問者

お礼

回答、ありがとうございます! FolderBrouwserDialog というのがあるのですね。 早速調べてみます。 貴重な情報ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • kouji_124
  • ベストアンサー率46% (283/605)
回答No.2

質問者様のお考えだと、たとえパスに問題が無くても指定されたiniファイルの存在までは判らないですよね。 もっと単純に「ファイルが存在する=パスに不正な文字が無い」と考えて見ては如何でしょう。 ファイルの有無を確認するのであれば、Fileクラスの「Exists メソッド」を使えば出来ます。 Dim filepath As String = "C:\<>Work\Test.txt" If File.Exists(filepath) Then   Console.WriteLine("ファイルが見つかりました。") else   Console.WriteLine("ファイルが見つかりません。") End If こんな感じで如何でしょう。。。

noname#51596
質問者

お礼

回答ありがとうございます! ANo.1 の補足にも記載させていただいたとおり、初回はフォルダが無いため作成し、2回目以降は指定したフォルダで処理(ログをはく)をししたいのです。しかし、 "Cd:\Projects" というフォルダを作成しようとするとエラーとなります。 やはり、フォルダが存在しないなら、エラーとするしかないのでしょうか。

全文を見る
すると、全ての回答が全文表示されます。
  • unamana19
  • ベストアンサー率62% (56/89)
回答No.1

ファイルの有無を確認するのではダメなのでしょうか? If Not My.Computer.FileSystem.FileExists("ファイルパス") Then ''ファイルが存在しない End If など

noname#51596
質問者

補足

早速の回答、ありがとうございます。 質問内容の説明不足で申し訳ありません。 ファイルの有無を確認して、無ければ作成するのですが、その際、パスが誤っているとエラーで落ちてしまうため、最初にパスをチェックしたいのです。 不可能であれば、ファイルの有無の確認をして、無ければエラーとするしかないのかな・・・と思っていますが。 やはり、完全にパスをチェックする方法はないのでしょうか?

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • .NETで文字列のエンコードの仕方+ファイル操作

    .NETで文字列のエンコードの仕方が知りたいです。 あと、ファイル操作についてわかりやすいホームページを探しています。 '指定したファイルに文字列を追加します Dim filename as String = "test.txt" Dim data as string = "美味ソ溝" System.IO.File.AppendAllText(filename, data, System.Text.Encoding.GetEncoding("euc-jp")) 'これと同じことを以下のStreamWriterでしたいのですが、文字のエンコードの方法がわかりません。どのようにすればうまくいきますか。 Dim filename as String = "test.txt" Dim data as string = "美味ソ溝" Dim fs As System.IO.FileStream = System.IO.File.OpenWrite(filename) Dim sw As System.IO.StreamWriter = New System.IO.StreamWriter(fs) sw.BaseStream.Seek(0, System.IO.SeekOrigin.End) '書き込む前にエンコード?? sw.WriteLine(data) sw.Flush() sw.Close() fs.Close()

  • VB.NET テキストファイルにデータを書き込み

    テキストファイル("c:\test.txt")に「かきくけこ」と全角5文字で1行のデータがあるとします。 このテキストファイルに「あいうえお」を先頭に追加で書き込みたいのですが、どうすればいいのでしょうか? あくまで「かきくけこ」を変数化せずファイルに直接、書き込む方法がある場合、教えてください。 'テキストファイルを開いたときの内容 あいうえお かきくけこ ちなみにですが、テキストファイル("c:\test.txt")に「かきくけこ」と全角5文字で1行のデータがあるとして、 末尾に「さしすせそ」を追加で書込みする方法は下記の通りでした。 'ファイルを書き込み用に開く、指定したファイルがない場合は作成する dim fsFile As System.IO.FileStream = _ System.IO.File.OpenWrite("c:\test.txt") 'StreamWriterオブジェクトを作成し、テキストデータが書き込めるようにする Dim sw As System.IO.StreamWriter = _ New System.IO.StreamWriter(fsFile) 'ファイルの末尾に移動する sw.BaseStream.Seek(0, System.IO.SeekOrigin.End) 'データを書き込む sw.WriteLine("さしすせそ") 'ファイルを更新する sw.Flush() 'ファイルを閉じる sw.Close() fsFile.Close() 'テキストファイルを開いたときの内容 かきくけこ さしすせそ

  • VBのテキスト書き込み読み出し

    VB初心者です。 VBのテキスト書き込み読み出しについて質問させていただきます。 ~使用オブジェクト~ textbox1 textbox2 button1 button2 現在下記の通りtextbox1とtextbox2に書いた文字(length 10まで)をbutton1 clickで C:\test.txtに書き出し、 button2 clickでtextbox1 と textbox2に戻すプログラムを書いてみました。 読み込みのところが現在は2個ですが、実用的には膨大な数にしたいと思っています。 単純に沢山書けばいいのでしょうが現実的ではないのでスッキリと書く書き方はないでしょうか? さらに、例としてtextbox1にAさんの名前textbox2にAさんの年齢をいれたとします。 その際、Bさん以降を登録したいのですがその場合テキストへの書き込みを次行に書き込み 次行を読み込むにはどのように書けばよろしいでしょうか? ご教授お願い致します。 Public Class Form1 '##################################################### '"C:\test.txt"へ書き込み '##################################################### Private Sub Button1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button1.Click Dim write_data As New System.IO.StreamWriter("C:\test.txt", False, _ System.Text.Encoding.Default) Dim str As String Dim str1 As String str = String.Format("{0, -10}", TextBox1.Text) str1 = String.Format("{0, -10}", TextBox2.Text) write_data.Write(str & str1) write_data.Close() End Sub '##################################################### '"C:\test.txt"の読み込み '##################################################### Private Sub Button2_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button2.Click Dim Reader As New IO.StreamReader("C:\test.txt", System.Text.Encoding.GetEncoding("Shift-JIS")) While Reader.Peek() > -1 '10文字取得 Dim c(9) As Char Dim d(9) As Char Reader.ReadBlock(c, 0, c.Length) Reader.ReadBlock(d, 0, d.Length) TextBox1.Text = c TextBox2.Text = d End While Reader.Close() End Sub End Class

  • [VB2008]ファイル存在確認について

    質問です。VB2008を使ってる者ですが、以下のソースが分りません。 例で言います。 最初に以下のファイル存在を確認します。 C:\TEST\test1.txt C:\TEST\test2.txt C:\TEST\test3.txt 全て存在する ここまでは良いのですが、この後 例えば C:\TEST\test1.txt C:\TEST\test2.txt C:\TEST\test3.txt C:\TEST\test4.txt ←これ(これ) ファイルの存在確認で同じフォルダ("TEST")に 存在確認の必要としない不要ファイル("これ")を検出して 削除したいのですが、方法が分りません。 "これ"の不要ファイルの名前は、必ずしも"test4"では無い 存在チェック以外の不要ファイルを削除したいのです。 Dim checkFile As String = "C:\Work\Test.txt" If System.IO.File.Exists(checkFile) Then Console.WriteLine("ファイルが存在します") Else Console.WriteLine("ファイルが存在しせん") End If 上記の後、必要の無いファイルを検出して削除するには どうすれば良いでしょうか? 凄く困ってるので、教えて下さい

  • フルパスからファイル名取得の方法

    指定したフォルダのフルパスを「bmpFiles」に入れているのですが、表示する時はファイル名のみの表示にしたくて「Path.GetFileName」を使用してファイル名を取得しようとしたのですが、「型'stringの1次元配列'の値を'string'に変換できません」というエラーが出てしまいます。 VBを始めたばかりでよく分からないのでアドバイスをお願いします。 Dim imageDir As String = fbd.SelectedPath ' 指定フォルダまでのディレクトリ Dim bmpFiles As String() = _ System.IO.Directory.GetFiles(imageDir, "*.bmp") 'フルパス Dim bmpFileName As String = _ Path.GetFileName(bmpFiles)  ←bmpFilesで上記エラー

  • VB2008 txtファイル保存

    こんにちは、Vb2008を勉強しています。 デスクトップに保存している、TXTファイルに、 フォームで入力したデータを追加保存したいと思い、ネットで調べたり…で 入力しましたが、txtファイルを開いてみると文字化けしてしまします。 Dim writer As System.IO.FileStream = _ System.IO.File.OpenWrite("C:\Users\Desktop\顧客管理.txt") 'SystemWriterオブジェクトを作成し、テキストデータが書き込めるようにする Dim sw As System.IO.StreamWriter = New System.IO.StreamWriter(writer) 'ファイルの末尾に移動する sw.BaseStream.Seek(0, System.IO.SeekOrigin.End) 'データを書き込む sw.WriteLine(TextBox1.Text & "," & TextBox2.Text & "," & TextBox3.Text) 'ファイルを更新する sw.Flush() 'ファイルを閉じる sw.Close() writer.Close() 上記の方法で文字化けだったので、またまた、調べて入力しましたが 今度は、改行されず…単純な、データの追加のようになってしまっています。 私は、新しい行に追加できるようにしたいです。 下のコードは文字コードの指定をしたので、保存はできますが、 改行されません。 Dim FileName As String = "C:\Users\Desktop\確認.txt" Dim Writer As IO.StreamWriter Dim Encode As System.Text.Encoding '文字コードにShiftJISを指定。 Encode = System.Text.Encoding.GetEncoding("Shift-JIS") '既に存在するテキストに追加する場合は第2引数をTrueにする。 Writer = New IO.StreamWriter(FileName, True, Encode) Writer.Write(TextBox1.Text & "," & TextBox2.Text) Writer.Close() どなたか、教えていただけませんでしょうか?

  • vbのsavefiledialogについて

    vbで、テキストボックスに、文字を入力し、ボタン2をクリックすると、ユーザーが指定したところに、指定した名前で、txt形式、html形式、doc形式(このうち、txtと、htmlは必須。)で保存するプログラムを作りたいと思っております。 サイトを見てみますが、なかなかよいものが見つかりません。どなたか教えてください。 書きかけのプログラムと、フォーム図を載せておきます。 また、変更した方がよければ、そちらもおしえてください。 Public Class Form1 Dim texta As String Dim a Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Button1.Text = "リセット" Button2.Text = "保存" texta = TextBox1.Text End Sub Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged texta = TextBox1.Text End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click TextBox1.Text = "" End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click a = DialogResult SaveFileDialog1.OverwritePrompt = True SaveFileDialog1.FileName = "" SaveFileDialog1.Filter = "テキストファイル(*.txt)|*.txt|すべてのファイル(*.*)|*.*" a = SaveFileDialog1.ShowDialog If a = Windows.Forms.DialogResult.OK Then Label1.Text = IO.Path.GetDirectoryName(SaveFileDialog1.FileName) Label2.Text = IO.Path.GetFileName(SaveFileDialog1.FileName) Else Label1.Text = "キャンセルされました。" Label2.Text = "" End If End Sub End Class

  • 絶対パスからのファイル名の切り離し

    VC++6.0でCのコードを書いています。 絶対パスからのファイル名の切り出し方に関して質問です。 FILEPATH="C:\TEST\test.txt" というファイルがあるとして "C:\TEST"と"test.txt"の部分を切り離したいと思っています。 フォルダ位置は可変("C:\TEST\TEST"が来ることもある。) このときに FILEPATHの先頭アドレスから最後まで \マークがいくつ来ているか判断して 最後の\マーク以降とそれ以前を strcpyなどでコピーすればできると思うのですが、 この際、 1.\マークの数を数える 2.最後の\マークの手前までパス名をコピー 3.最後の\マーク以降をファイル名としてコピー という作業が必要になると思いますが もっと簡単に行う方法があればお教えいただければと思っています。 (標準関数を使用して・・・など) よろしくお願いします。

  • 特殊文字「\」の変換の方法

    VC++2005のMFCにてプログラムを作成しています。 CFileDialogにてテキストファイルを読み込み、 読込んだファイルパスの「\」を「\\」になるように変換したいのですが、 実装の方法が分かりません。 ===================================== 例)C:\test\hoge.txt ⇒ C:\\test\\hoge.txt と変換する。 ===================================== 下記にファイルパスをCstring型で読み込み、 char型に変換するまでのプログラムを記載します。 理想としては、char型配列の中に、 「C:\\test\\hoge.txt」のような変換後のファイルパスを 入れたいのです。 解決方法をご存知の方おられましたら、ご教示お願いできませんでしょうか。 【プログラム】 /* ファイルオープンダイアログを表示 */ CFileDialog ReadDlg( TRUE, NULL, "*.txt", OFN_HIDEREADONLY | OFN_FILEMUSTEXIST, "txtファイル(*.txt)", this ); CString filepath; if( ReadDlg.DoModal() == IDOK ) { filepath = ReadDlg.GetPathName(); // ファイルのフルパス名を取得 } CFile cfile; CFileException ex; if( !cfile.Open( filepath, CFile::modeRead , &ex ) ) { AfxMessageBox( "ファイルを開くのに失敗しました" ); // エラーメッセージを表示 return; } char st[255] = ""; strcpy( st, filepath );

  • VB 配列

    今,VBでテキストファイルを読込み配列に入れるという作業を書いたのですが,うまくいきません. 初回例外が発生してしまいます.配列は文字列の配列になります. どなたかご教示のほどよろしくお願いいたします. 'ファイルの読込み Dim path1 As String = "C:\Users\aleph_H.S\Desktop\気象台データインポートツール\気象台データインポートツール\" Dim path2 As String = "気象台データリスト.txt" Dim Mypath As String = path1 + path2 ' StreamReader の新しいインスタンスを生成する Dim cReader As New System.IO.StreamReader(Mypath, System.Text.Encoding.Default) ' 読み込んだ結果をすべて格納するための変数を宣言する Dim stResult As String = String.Empty Dim matrix(,) As String Dim ic As Long = 0 Dim icc As Long = 0 ReDim Preserve matrix(80, 3) ' 読み込みできる文字がなくなるまで繰り返す While (cReader.Peek() >= 0) ' ファイルを 1 行ずつ読み込む Dim stBuffer As String = cReader.ReadLine() ' 読み込んだものを追加で格納する stResult &= stBuffer & System.Environment.NewLine ic = ic + 1 'カンマ区切りで分割して配列に格納する Dim stArrayData As String() = stResult.Split(","c) For Each sstData In stArrayData icc = icc + 1 '文字列をInteger型に変換 matrix(ic - 1, icc - 1) = sstData Next End While cReader.Close()