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

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

C# と VB.NET の入門サイト

Re[3]: VB.NETでワイルドカードを使う方法


(過去ログ 149 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■87035 / inTopicNo.1)  VB.NETでワイルドカードを使う方法
  
□投稿者/ とむやーそ (1回)-(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

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





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

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

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

VB 独自の Left 関数に使用を避けるとか、配列ではなくて List<T> 型を使うということは考え
なくてもいいのですか?
引用返信 編集キー/
■87038 / inTopicNo.3)  Re[1]: VB.NETでワイルドカードを使う方法
□投稿者/ 魔界の仮面弁士 (1626回)-(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 では同じファイル名として扱われます。
引用返信 編集キー/
■87052 / inTopicNo.4)  Re[2]: VB.NETでワイルドカードを使う方法
□投稿者/ BABAP (1回)-(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を理解している人であれば、定義不明な変数があっても
書き込みの内容で質問は十分伝わります。
相手が求めることを汲み取るスキルがないのでしょうが、
それは回答者として大いに問題だと思います。
何でもレスを付ければいいというものではありません。

まぁ、弁士さんの回答で本件は解決しているようですが。
引用返信 編集キー/
■87054 / inTopicNo.5)  Re[3]: VB.NETでワイルドカードを使う方法
□投稿者/ とむやーそ (2回)-(2018/04/09(Mon) 15:58:13)
ありがとうございます。
解決しました。
 
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -