DOBON.NETプログラミング道掲示板
(現在 過去ログ1 を表示中)

[ 最新記事及び返信フォームをトピックトップへ ]

■33178 / inTopicNo.1)  パスの結合によるファイル名の取得について
  
□投稿者/ sayama 一般人(1回)-(2015/11/17(Tue) 01:37:35)
  • アイコン環境/言語:[Win10 64bit VS2010VB.Net .Net3.5] 
    分類:[.NET] 

    初めて投稿させていただきます。

    目的はある親フォルダの中にあるMISCフォルダ内のテキストファイルの中にある相対パスで記されたファイルリストをArrayListで読込、相対パスを絶対パスに変換して、同列のDCIMフォルダの中にあるファイルの存在を確認をリストに表示したく思っています。

    簡単に作成できるかと思っていたのですが、 Path.GetFileName で使用できない文字が含まれている旨のエラーが出てしまい、前に進まなくなってしまいました。
    ここが、どうしても自己解決できないのでお知恵をお借りしたく質問させていただきます。


    具体的に読み込むテキストのファイルリストは次のようなものです。

    [JOB]
    PRT PID = 001
    PRT TYP = STD
    PRT QTY = 001
    IMG FMT = EXIF2 -J
    <IMG SRC = "../DCIM/4681.JPG">
    [JOB]
    PRT PID = 002
    PRT TYP = STD
    PRT QTY = 001
    IMG FMT = EXIF2 -J
    <IMG SRC = "../DCIM/4878.JPG">




    これが含まれている親フォルダを
    @
    dim Read_Path as string = FolderBrowserDialog1.SelectedPath
    で読み込んでいます。

    そしてファイルの内容を
    A
    Dim Mj_ReadMisc = New ArrayList
    Dim str As New System.IO.StreamReader(Mj_Read_Path & "\MISC\AUTPRINT.MRK", System.Text.Encoding.UTF8)
    'ファイルの最後までループ
    Do Until str.Peek = -1
    '1行づつ読込み、配列リストに格納
    Mj_ReadMisc.Add(str.ReadLine & vbCrLf)
    Loop
    として読み込んでいます。

    次に、このArrayListを次のように回して相対パスから絶対パスを作成してファイルの存在を確認し、ファイル名を取得しようとすると、エラーが出てしまいます。
    B
    For i As Integer = 0 To Mj_ReadMisc.Count - 1
       If CStr(Mj_ReadMisc.Item(i)).Length > 4 Then '(5文字以上あれば)
    'ファイルパス
    If UCase(CStr(Mj_ReadMisc.Item(i)).IndexOf("IMG SRC")) >= 0 Then
    Dim Str As String = Mj_ReadMisc.Item(i).ToString()
    Dim st() As String = Str.Split("=")
    Dim temp As String = st(1).Replace("""", "")
    temp = temp.Replace(">", "")
    temp = temp.Replace("../", "")
    temp = Trim(temp)
    temp = Mj_Read_Path & "\" & temp


    C ここではエラーが出ない
             Dim Exis as Boolen=My.Computer.FileSystem.FileExists(temp)

    D ここでエラー
    Dim StrFile as string = System.IO.Path.GetFileName(temp)

           E
           ・・・・リストに StrFile(ファイル名) 、Exis(存在の確認)を追加

       End If
    Next

    という具合なのですが、Dを解決するため
    Dim absolutePath As String = System.IO.Path.Combine(Mj_Read_Path, temp)
    とやってみても結果は同じです。

    そこで
    'ファイル名に使用できない文字を取得
    Dim invalidChars As Char() = System.IO.Path.GetInvalidFileNameChars()
    If temp.IndexOfAny(invalidChars) >= 0 Then
    MsgBox(temp.IndexOfAny(invalidChars))
    End If

    とやってみると、いきなり1文字目で使用できないとのこと、
    そこで、確認のため
    Dim StrFile as string = System.IO.Path.GetFileName(Mj_Read_Path)
    とやってみるとエラーは表示されません。
    次に、結合前の状態で
    Dim StrFile as string = System.IO.Path.GetFileName(temp)
    とやると、4文字目(/)にエラーが出てしまいましたので、次のように
    temp = temp.Replace("/", " ") '一旦スペースで逃げる
    temp = temp.Replace(" ", "\") ’改めてパス記号を付与
    と書き換えてみたのですが結果は同じエラーとなりました。

    CのMy.Computer.FileSystem.FileExists(temp)ではエラーが出ないので、ファイルパスそのものは通っているものと思います。

    又、結合後の tempのパスをテキストビジュアライザーで確認しその文字列をコピーして
    temp = "F:\テキストビジュアライザーのパス"
    と張り付けるとエラー表示はされませんでした。

    実際のところ、ファイルの存在確認はできているようなので、substring などを駆使すればファイル名だけを抜き取る作業は完結し目的は達成されるのですが、知識が足りずどうしてもスッキリしないので、ご教授をいただければ幸いです。

    環境は以下の通りです。
    VS2010 vb開発 .Netバージョン3.5 プラットフォーム x86
    OS-Win10, 64bit
    読み込むファイルのフォーマットはUTF-8です。

    よろしくお願いいたします。



引用返信 削除キー/
■33179 / inTopicNo.2)  Re[1]: パスの結合によるファイル名の取得について
□投稿者/ まりもん 一般人(30回)-(2015/11/17(Tue) 09:58:28)
  • アイコン
    しっかり確認したわけではありませんが、
    '1行づつ読込み、配列リストに格納
    Mj_ReadMisc.Add(str.ReadLine & vbCrLf)
    
    ここで、1行読み込んだ時に改行コードを追加しているのに、そのあとにこの改行コードを
    除去していないので、エラーが出るのではないかと
    
    下記コードで試してみました。
    
            Dim src As String = "<IMG SRC = ""../DCIM/4681.JPG"">"
            '下記のようにするとエラーが出る
            'Dim src As String = "<IMG SRC = ""../DCIM/4681.JPG"">" + vbCrLf
            Dim Mj_Read_Path As String = "C:"
    
            If UCase(src.IndexOf("IMG SRC")) >= 0 Then
                Dim Str As String = src
                Dim st() As String = Str.Split("=")
                Dim temp As String = st(1).Replace("""", "")
                temp = temp.Replace(">", "")
                temp = temp.Replace("../", "")
                temp = Trim(temp)
                temp = Mj_Read_Path & "\" & temp
    
                Dim StrFile As String = System.IO.Path.GetFileName(temp)
    
            End If
    
    
    temp = Mj_Read_Path & "\" & temp
    の部分は
    temp = System.IO.Path.Combine(Mj_Read_Path, temp)
    のほうがよいのではないかと思います。
    

引用返信 削除キー/
■33180 / inTopicNo.3)  Re[2]: パスの結合によるファイル名の取得について
□投稿者/ sayama 一般人(2回)-(2015/11/17(Tue) 23:07:52)
  • アイコンまりもんさん

    ご指摘をいただきありがとうございます。

    試したところ

    > Mj_ReadMisc.Add(str.ReadLine & vbCrLf)
    > ここで、1行読み込んだ時に改行コードを追加しているのに、そのあとにこの改行コードを
    > 除去していないので、エラーが出るのではないかと

    確かにこの改行コードが引っかかってエラーとなっていたようです。
    ありがとうございます。
    (一括出力をすることが多いので、癖で & vbCrLf をつけていました)

    自分では、

      temp = Trim(temp)

    このコードで、改行コードも削除されるものと思い込んでいました。

    そこで、しつこく下記のコードを書き直して試したところ、エラーは発生しませんでした。

      ’temp = Trim(temp) 
      temp = temp.Trim()  'このように修正したところ、エラーは発生しませんでした

    ということは、自分ながらに temp.Trim() イコール Trim(temp) の振る舞いが同じと思い込んでいたところに原因があったようです。

    まりもん様 今回はご指摘をいただき、そしてご教授をいただき本当にありがとうございました。
    プログラミングの奥深さに改めて思い知らされました。
解決み!
引用返信 削除キー/



トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

Mode/  Pass/


- Child Tree -