C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.87035 の関連記事表示

<< 0 >>
■87035  VB.NETでワイルドカードを使う方法
□投稿者/ とむやーそ -(2018/04/08(Sun) 12:35:45)

    分類:[.NET 全般] 


    例えば、

    D:\aaaa\bbbbフォルダーに入っている
    ccccで始まる全ファイルのパスを配列に格納したいとします。

    VBAだと


    Dim buf As String, f As Object
    buf = Dir(Path & "\cccc*")
    cnt = 0
    Do While buf <> ""
    filepath(cnt) = Path & "\" & buf
    cnt = cnt + 1
    buf = Dir()
    Loop

    のようにしてDir関数で取得できましたが
    これは古い方法だと思います。

    VB.NETだとどのようにして書くのが普通ですか?


    Dim fi As FileInfo
    For Each fi In dirInfo.GetFiles()

    If Left(fi.Name) = "cccc" Then

    cnt += 1
    filepath(cnt) = fi.fullName

    End If
    Next fi

    とやるのが普通でしょうか?




親記事 /過去ログ149より / 関連記事表示
削除チェック/

■87038  Re[1]: VB.NETでワイルドカードを使う方法
□投稿者/ 魔界の仮面弁士 -(2018/04/08(Sun) 13:49:52)
    2018/04/08(Sun) 15:03:16 編集(投稿者)

    No87035 (とむやーそ さん) に返信
    > D:\aaaa\bbbbフォルダーに入っている
    > ccccで始まる全ファイルのパスを配列に格納したいとします。
    bbbb の直下のみでよいのでしょうか。それとも子階層や孫階層までたどるのでしょうか。
    また、VB のバージョンは何でしょうか?

    DirectoryInfo の GetFiles メソッドは、引数として
    ワイルドカードを受け取れるようになっているはずですが、
    それでは駄目なのでしょうか?

    If 文でワイルドカード検索を行いたいという意味であれば、
     If fi.Name Like "cccc*" Then
    などという書き方もできます。VBA でもそうですよね。


    > Dim fi As FileInfo
    > For Each fi In dirInfo.GetFiles()
    それは VB.NET 2002 時代の古い書き方です。

    VB.NET 2003 以降においては、ループカウンタのスコープを狭めて
     For Each fi As FileInfo In dirInfo.GetFiles()
    と書けるようになっています。Dim fi As FileInfo という事前定義はしません。

    また、VB2008 以降では型推論が使えるようになったので、As 句を省略して
     For Each fi In dirInfo.GetFiles()
    と書けます。この fi は、このループ内でのみ利用可能な変数となります。


    > とやるのが普通でしょうか?
    一行で書けますよ。

    Dim files() As String = My.Computer.FileSystem.GetFiles("D:\aaaa\bbbb", FileIO.SearchOption.SearchAllSubDirectories, "cccc*").ToArray()


    > If Left(fi.Name) = "cccc" Then
    Left に「, 4」が足りないのでは?

    それにこれだと、Module から呼ぶときにはともかく、
    Form から呼ぶ場合、座標を表す Me.Left と競合してしまいます。

    この場合は、
     If fi.Name.StartsWith("cccc") Then
    とするのが良いでしょう。もしも Left で拾うなら、
     If Strings.Left(fi.Name, 4) = "cccc" Then
    のようにします。ちなみに Strings.Left という表現は VBA でも使えます。


    ただし、コンパイラの設定が「Option Compare Binary」になっている場合、
     ccccLemon.txt
    は拾えますが、
     cCcCpPqQ.txt
    は得られないことに注意してください。(Option Compare Text なら拾えますが)


    Option Compare Binary の時に、大文字小文字を無視して比較したいのであれば、
    fi.Name.ToLowerInvariant() に対して比較するか、
    StrComp の CompareText モードで検索するか、
    String の Equals メソッド で、StringComparison に 〜IgnoreCase を渡すなどします。
    正規表現を使うという手もあります。


    なお、全角アルファベットの場合、大文字小文字を区別するかどうかが
    OS によって異なりますので注意してください。

    たとえば "A.txt" と "a.txt" とでは、
    Windows 95 や Me では別のファイル名とみなされますが、
    Windows 10 や XP では同じファイル名として扱われます。
記事No.87035 のレス /過去ログ149より / 関連記事表示
削除チェック/

■87037  Re[1]: VB.NETでワイルドカードを使う方法
□投稿者/ WebSurfer -(2018/04/08(Sun) 13:39:31)
    No87035 (とむやーそ さん) に返信

    コードは中途半端に省略しないで、最低限定義不明な変数がないようにしていただけませんか?

    要するに .NET Framework に用意されている DirectoryInfo クラス、FileInfo クラスを使う
    という条件だけ考えればいいのですか?

    VB 独自の Left 関数に使用を避けるとか、配列ではなくて List<T> 型を使うということは考え
    なくてもいいのですか?
記事No.87035 のレス /過去ログ149より / 関連記事表示
削除チェック/

■87052  Re[2]: VB.NETでワイルドカードを使う方法
□投稿者/ BABAP -(2018/04/09(Mon) 13:57:50)
    2018/04/09(Mon) 13:58:37 編集(投稿者)

    No87037 (WebSurfer さん) に返信
    > ■No87035 (とむやーそ さん) に返信
    >
    > コードは中途半端に省略しないで、最低限定義不明な変数がないようにしていただけませんか?
    >
    > 要するに .NET Framework に用意されている DirectoryInfo クラス、FileInfo クラスを使う
    > という条件だけ考えればいいのですか?
    >
    > VB 独自の Left 関数に使用を避けるとか、配列ではなくて List<T> 型を使うということは考え
    > なくてもいいのですか?


    この書き込みはナンセンスです。
    VBAとVB.netを理解している人であれば、定義不明な変数があっても
    書き込みの内容で質問は十分伝わります。
    相手が求めることを汲み取るスキルがないのでしょうが、
    それは回答者として大いに問題だと思います。
    何でもレスを付ければいいというものではありません。

    まぁ、弁士さんの回答で本件は解決しているようですが。
記事No.87035 のレス /過去ログ149より / 関連記事表示
削除チェック/

■87054  Re[3]: VB.NETでワイルドカードを使う方法
□投稿者/ とむやーそ -(2018/04/09(Mon) 15:58:13)
    ありがとうございます。
    解決しました。
     
記事No.87035 のレス / END /過去ログ149より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -