|
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 では同じファイル名として扱われます。
|