Visual Basic 初級講座
VB.NET 2002 対応 VB.NET 2003 対応 VB2005 対応

 

Visual Basic 中学校 > 初級講座 >

第31回 ファイルシステム

今回はファイルやフォルダのコピー・削除をはじめ、フォルダの中のファイルの一覧の取得や、ファイルの日時の取得・設定などファイルシステムに関することがらを説明します。

この回の要約

・ファイルを操作するにはFileクラス、またはFileInfoクラスを使う。

・フォルダを操作するにはDirectoryクラス、まはたDirectoryInfoクラスを使う。

・ファイルをコピーするには IO.File.Copy("C:\From.txt", "C:\To.txt")

・フォルダの中のファイルの一覧を取得するにはDirectoryInfoクラスのGetFilesメソッドを使う。

・ファイルの日時や属性を設定・取得する方法。

 

1.ファイルシステムの使用

 

アプリケーションでは様々なシーンでファイルシステムへのアクセスが必要になります。たとえば、外部のファイルを読み込もうとしたときにそのファイルが存在するか確認しなければなりません。メモ帳の[ファイル]メニューで[開く]を選択して、存在しないファイル名を指定するとメモ帳はちゃんとファイルが存在しないという警告のメッセージを表示します。

他にもファイルのコピーや削除、名前変更、更新日や作成日の取得などいろいろな場面でファイルシステムが必要となります。また、ファイルだけでなくフォルダの扱いも重要です。

VBを使うとこういったファイルシステムに対する要求が驚くほど簡単に実現できます。

VBではこれらファイルシステムを扱う際に主に次のクラスを使います。

クラス 読み方 主な機能
クラス File ファイル ファイルの操作
クラス FileInfo ファイルインフォ 個々のファイルの操作
クラス Directory ディレクトリ フォルダの操作
クラス DirectoryInfo ディレクトリインフォ 個々のフォルダの操作
クラス DriveInfo ドライブインフォ VB2005以降。ドライブ情報の取得

■表1:ファイル・フォルダ操作関連の主なクラス

ファイルの操作にはFileクラスまたはFileInfoクラスを使います。フォルダの操作にはDirectoryクラスまたはDirectoryInfoクラスを使います。それぞれ名前に...Infoとついている方のクラスは「個々の」ファイルやフォルダを操作するのに適したクラスです。とくに必要がなければ名前に...Infoとついていない方のクラスを使います。

ドライブに関してはDriveInfoクラスしかありません。また、このクラスはVB2005以上でないと使用できません。

これらのクラスはすべてIO名前空間(読み方:IO = アイオー)に属していますので、今回紹介する例ではクラスの先頭に IO. とついています。プログラムの先頭で Imports System.IO と書けばこの IO. という記述はすべて省略することができます。

 

2.ファイルの基本操作

 

ファイルに関するコピー・削除などの操作はどれもとても簡単にできます。ここではいくつか例を挙げますが説明の必要はほとんどないでしょう。

まずはファイルをコピーする例です。この例ではC:\Test1.txtC:\Test2.txtにコピーします。C:\Test1.txtが存在しなかったり、C:\Test2.txtが既に存在する場合にはエラーになります。

VB.NET2002対応 VB.NET2003対応 VB2005対応


IO.File.Copy("C:\Test1.txt", "C:\Test2.txt")
 

■リスト1:ファイルのコピー

コピー先ファイルが存在しても構わず上書きしてしまいたいのであれば第3引数にTrueを指定します。この場合、コピー先に既にファイルが存在してもそのファイルを上書きしてコピーしてしまいます。

VB.NET2002対応 VB.NET2003対応 VB2005対応


IO.File.Copy("C:\Test1.txt", "C:\Test2.txt", True)
 

■リスト2:ファイルの上書きコピー

削除や移動などファイルに関する基本的な操作はこのFileクラス(読み方:File = ファイル)を通して行うことができます。どれも非常に簡単に使えるようになっているので一々例を挙げないでFileクラスのファイル操作に関する主なメンバを確認するにとどめます。

メソッド 読み方 機能
メソッド Move ムーブ ファイルを移動します。
メソッド Copy コピー ファイルをコピーします。
メソッド Delete デリート ファイルを削除します。
メソッド Exists イグジスツ ファイルが存在するか確認します。
メソッド Create クリエイト ファイルを作成します。
メソッド Replace リプレイス VB2005以降。バックアップを作成しながらファイルをコピーします。

■表2:ファイル操作に関するFileクラスの主なメソッド

 

3.ファイル情報の取得

 

ファイルを操作するだけでなくファイルの情報を取得することもできます。

たとえばファイルのサイズを取得するには次のようにします。

VB.NET2002対応 VB.NET2003対応 VB2005対応

Dim oFile As New IO.FileInfo("C:\Test.txt")
Dim FileSize As
Long

FileSize = oFile.Length

MsgBox(FileSize)

■リスト3:ファイルのサイズの取得

この場合はFileクラスではなくFileInfoクラスを使います。FileInfoクラスはNewを使ってインスタンスを作成する必要がある点に注意してください。

このほかにもFileInfoクラスを使っていろいろな情報を取得することができます。ここでは代表的な情報の取得方法だけまとめて紹介します。

VB.NET2002対応 VB.NET2003対応 VB2005対応

Dim oFile As New IO.FileInfo("C:\Test\Test.mpg")
Dim FileName As
String
Dim FullPath As String
Dim FileExt As String
Dim FolderName As String
Dim ParentFolder As IO.DirectoryInfo

FileName = oFile.Name            'Test.mpg
FolderName = oFile.DirectoryName 'C:\Test
FullPath = oFile.FullName        'C:\Test\Test.mpg
FileExt = oFile.Extension        '.mpg

ParentFolder = oFile.Directory

■リスト4:ファイルの基本情報の取得

どれもFileInfoクラスのプロパティを使うだけなのでプログラムはいたって単純です。具体的にどのような情報が取得できるかはコメントとして書いておきましたので参考にしてください。最後のDirectoryプロパティ(読み方:Directory = ディレクトリ)はこのファイルが属するフォルダを表すDirectoryInfoクラスのインスタンスを取得します。

 

4.ファイルの日付と属性

 

Fileクラスを使ってファイルの日付や属性を取得・設定することもできます。たとえばファイルの作成日を取得するにはGetCreationTimeメソッド(読み方:GetCreationTime = ゲットクリエイションタイム)を使用します。

VB.NET2002対応 VB.NET2003対応 VB2005対応

Dim CreationTime As Date

CreationTime = IO.File.GetCreationTime("C:\boot.ini")

MsgBox(CreationTime)

■リスト5:ファイルの作成日時の取得

プログラムを使って作成日を再設定してしまうこともできます。ただし、ファイルの作成日を再設定することはファイルを整理するときに混乱を招きますので通常は行わないように注意してください。

VB.NET2002対応 VB.NET2003対応 VB2005対応

'C:\Test1.txtの作成日を2025年月日にする。

IO.File.SetCreationTime("C:\Test1.txt", #12/1/2025#)

■リスト6:ファイルの作成日時のセット

同様の手法で更新日やアクセス日を設定・取得することも可能です。ファイルの日付に関するFileクラスのメンバの一覧を掲載しますので参考にしてください。

メソッド 読み方 機能
メソッド GetCreationTime ゲットクリエイションタイム 作成日時を取得します。
メソッド GetLastAccessTime ゲットラストアクセスタイム アクセス日時を取得します。
メソッド GetLastWriteTime ゲットラストライトタイム 更新日時を取得します。
メソッド SetCreationTime セットクリエイションタイム 作成日時をセットします。
メソッド SetLastAccessTime セットラストアクセスタイム アクセス日時をセットします。
メソッド SetLastWriteTime セットラストライトタイム 更新日時をセットします。

■表3:ファイル日時に関するFileクラスの主なメソッド

 

属性の設定・取得はこれよりも少し大変です。ここでいう属性とは「読み取り専用」とか「隠しファイル」などを指しています。属性の設定・取得がわかりにくい理由は複数を一括して管理しているからです。また、ファイルの属性にはどのようなものがあって、それにはどのような効果があるのかということをしっかりと理解していない場合が多いことも挙げられます。私もよく理解していないのですが属性の数は少なくとも14個はあるようですし、Windows Vistaや新しいWindowsのファイルシステムが普及すればさらに増えるでしょう。

ともあれ、まずはファイルが読み取り専用かどうか調べるプログラムを書いて見ましょう。次の例ではC:\Test1.txtが読み取り専用かどうか判断することができます。

VB.NET2002対応 VB.NET2003対応 VB2005対応

If IO.File.GetAttributes("C:\Test1.txt") And IO.FileAttributes.ReadOnly Then
   
MsgBox("読み取り専用です。")
Else
   
MsgBox("読み取り専用ではありません。")
End If

■リスト7:読み取り専用属性の判定

ここでIf文の中で = ではなく And が使われていることに注意してください。ほとんどの場合 = ではうまく判定できません。このことをテストするためにC:\Test1.txtの読み取り専用属性をはずしたりつけたりしてプログラムを何度か実行してみると良いでしょう。ご存知とは思いますが、ファイルの属性を変更するにはファイルを右クリックしてプロパティを選択し、プロパティ画面の中のチェックをはずしたりつけたりします。

= ではなく And を使用する理由はすべての属性を1つのプロパティで取得するからです。 = を使った場合は、「読み取り専用属性のみ」という意味になります。つまり、読み取り専用の隠しファイルの場合は = では判定できなくなります。一方 And を使った場合は「読み取り専用属性」が含まれているかという判断となり、他の属性がついていようがついていまいが読み取り専用属性だけについて判断することができます。このようなAndの用法は今回のテーマからはずれるために深く説明しません。おそらく初めて見た方にはこの短い説明では到底理解できないと思いますが、「属性を判断するにはAndを使う」くらいに暗記して置いてください。どうしてもこの部分の動作が知りたい場合は「ビット演算」をキーワードに調べてみてください。

GetAttributesメソッド(読み方:GetAttributes = ゲットアトリビュートス)の値はFileAttributes列挙体(読み方:FileAttributes = ファイルアトリビュートス)から指定するだけです。代表的なFileAttributes列挙体の値を表にまとめておきます。

メンバ 読み方 意味
値 Archive アーカイブ アーカイブ属性。この属性には特に効果はなく単なる目印として使用されます。
値 Compressed コンプレスド 圧縮属性。ここでいう「圧縮」とはzipやlzhのことではなく、OSの機能としての圧縮です。
値 Encrypted エンクライプテッド 暗号化属性。
値 Hidden ヒドゥン 隠しファイル属性。
値 ReadOnly リードオンリー 読み取り専用属性。
値 System システム システム属性。

■表4:主な属性。FileAttributes列挙体のメンバ。

属性を判断するだけでなく、属性を設定することもできます。たとえばあるファイルを読み取り専用にしたり、逆に読み取り専用のファイルから読み取り専用属性を解除したりできます。これにはSetAttributesメソッド(読み方:SetAttributes = セットアトリビュートス)を使うのですが、注意すべきは関係のない属性をいじらないということです。

たとえば、隠しファイル属性がついたファイルがあったとして、このファイルに「読み取り専用属性をセットしろ」と単純に命令すると、隠しファイル属性が消えてしまうのです。この場合は、このファイルに「隠しファイル属性と読み取り専用属性をセットしろ」と命令する必要があります。

そこで属性をセットする前に現在どのような属性がついているのかGetAttributesメソッドを使って調べる必要があります。

以下のコードはC:\Test1.txtに読み取り専用属性を追加します。もちろん他の属性が変更されることはありません。

VB.NET2002対応 VB.NET2003対応 VB2005対応

Dim OldAttributes As FileAttribute '現在の属性
Dim NewAttributes As FileAttribute
'新しい属性

OldAttributes = IO.File.GetAttributes("C:\Test1.txt") '現在の属性を取得
NewAttributes = OldAttributes Or FileAttribute.ReadOnly '読み取り専用属性を追加

IO.File.SetAttributes("C:\Test1.txt", NewAttributes) '新しい属性をセット

■リスト8:読み取り専用属性を追加する

さらに、次のコードではC:\Test1.txtから読み取り専用属性をはずします。こちらも他の属性が変更されることはありません。

VB.NET2002対応 VB.NET2003対応 VB2005対応

Dim OldAttributes As FileAttribute '現在の属性
Dim NewAttributes As FileAttribute
'新しい属性

OldAttributes = IO.File.GetAttributes("C:\Test1.txt") '現在の属性を取得
NewAttributes = OldAttributes And (Not FileAttribute.ReadOnly) '読み取り専用属性の解除

IO.File.SetAttributes("C:\Test1.txt", NewAttributes) '新しい属性をセット

■リスト9:読み取り専用属性を解除する

ここでも OrAnd, Notといった演算子の動作を不思議に思う方がいらっしゃると思いますが、これらについても暗記するのが良いと思います。詳しく理解したい方はやはり「ビット演算」をキーワードに検索してみてください。

 

5.フォルダの基本操作

 

フォルダの操作もファイルの操作と同じように行うことができますが、Fileクラスではなく、Directoryクラス(読み方:Directory = ディレクトリ)を使用します。以下の表はDirectoryクラスのフォルダ操作関係の主なメソッドですがFileクラスのメソッドとほとんど同じということがすぐにわかると思います。

メソッド 読み方 機能
メソッド Move ムーブ フォルダを移動します。
メソッド Delete デリート 空のフォルダを削除します。
メソッド Exists イグジスツ フォルダが存在するか確認します。
メソッド CreateDirectory クリエイトディレクトリ フォルダを作成します。

■表5:フォルダ操作に関するDirectoryクラスの主なメソッド

注意したいのはフォルダをコピーするメソッドがないことです。またフォルダを削除するDeleteメソッドはフォルダの中にファイルやフォルダが存在すると例外IOException(読み方:IOException = アイオーエクセプション)が発生して削除に失敗します。

具体例を挙げて説明します。以下の例はフォルダC:\TestFolderを削除します。

VB.NET2002対応 VB.NET2003対応 VB2005対応


IO.Directory.Delete(
"C:\TestFolder")
 

■リスト10:空フォルダの削除

このコードはC:\TestFolderが空の場合は成功しますが、中に何か入っている場合にはIOExceptionが発生して削除に失敗します。

つまり、Directoryクラスはあくまで1つのフォルダを操作するのであって、その中にあるファイルやフォルダまでは面倒を見てくれないということです。フォルダを移動するMoveメソッドは中身も一緒に移動してくれますがこれはWindowsのフォルダの管理方法によるおまけみたいな機能のようです。Windowsにとっては「フォルダの移動」という行為は単にフォルダの名前が変わるのと同じようなもののようです。

そこで、フォルダを中身ごとコピー・削除したい場合は他の方法を探すことになります。方法の1つは自分でプログラムを書いてファイルを1つずつコピー・削除する方法です。現にそういう方法を採っているプログラマの方々もいらっしゃると思います。

他の方法では.NET Frameworkの機能ではなくWindows APIの機能を使うということも考えられます。Windows APIについては中級講座で取り上げる予定ですがWindows自体に用意されている機能をVBから呼び出す手法を指しています。この方法でフォルダの中のファイルを丸ごとコピー・削除する例がサンプルに掲載してありますので必要ならば参照してください。

ファイルのコピー・削除2

VB2005以上を使っている場合にはMyクラス(読み方:My = マイ)を使用すると驚くほど簡単にこの問題を解決できます。

VB2005でフォルダを中身も一緒にまるごとコピーするには次のようにたった1行書けばよいだけです。

この例では、C:\TestFolderをまるごとコピーしてC:\TestFolder2というフォルダを作ります。

VB2005対応


My
.Computer.FileSystem.CopyDirectory("C:\TestFolder", "C:\TestFolder2")
 

■リスト11:中身ごとフォルダをコピーする

削除の例も同様に簡単で次のようになります。

VB2005対応


My
.Computer.FileSystem.DeleteDirectory("C:\TestFolder3", FileIO.DeleteDirectoryOption.DeleteAllContents)
 

■リスト12:中身ごとフォルダを削除する

マイクロソフト社はVBについてはプログラマが入力しなければならないコードの量を大幅に減少させることを目標にしているとのことですが、この部分に関してはまさにこの方向性が効を奏した形になっています。VBは人類を幸せにします。

 

6.ファイルの一覧

 

フォルダにはファイル以上にいろいろな情報があります。ファイルの細かい情報を取得するときにFileInfoクラスを使った様にフォルダの細かい情報を取得するにはDirectoryInfoクラスを使用します。

ここでは特にフォルダ内にあるファイルやフォルダの一覧を取得する方法を説明します。

一覧の取得自体はとても簡単です。DirectoryInfoクラスのGetFilesメソッド(読み方:GetFiles = ゲットファイルズ)を使用するだけです。このメソッドはフォルダに属するそれぞれのファイルについてのFileInfoクラスの配列を返します。DirectoryクラスのGetFilesメソッドでも戻り値がファイル名を表す文字列型の配列であるという点を除けば同じことができますが、ここでは私の好みにしたがってDirectoryInfoクラスを例に説明します。

たとえば、次のコードはC:\Windowsフォルダにあるファイル名の一覧をリストボックスに表示します。

VB.NET2002対応 VB.NET2003対応 VB2005対応

Dim oFolder As New IO.DirectoryInfo("C:\Windows")

ListBox1.Items.AddRange(oFolder.GetFiles)

■リスト13:ファイルの一覧を表示する

GetFilesメソッドの通常の使用方法ではフォルダの直下にあるファイルだけが対象になります。サブフォルダの中のファイルは対象となりません。

サブフォルダも含めてそのフォルダ以下にあるすべてのファイルを取得するにはGetFilesの3番目のオーバーロードを使って次のように書きます。ただし残念ながらこの使用方法はVB2005以降でのみ可能です。

VB2005対応

Dim oFolder As New IO.DirectoryInfo("C:\Windows")

ListBox1.Items.AddRange(oFolder.GetFiles("*", IO.SearchOption.AllDirectories))

■リスト14:サブフォルダも含んでファイルの一覧を表示する

この使用方法で第2引数が「すべてのフォルダ」という意味を表しています。第1引数は取得するファイルに対するちょっとした条件を「ワイルドカード」という形式を使って指定します。ワイルドカードにおいて「*」は「すべて」という意味になります。

ワイルドカードを使ったファイルの抽出機能はVB.NET2002, VB.NET2003でも使用可能です。次のように書くと拡張子がbmpのファイルをC:\Windowsフォルダから配列で取得できます。

VB.NET2002対応 VB.NET2003対応 VB2005対応

Dim oFolder As New IO.DirectoryInfo("C:\Windows")

ListBox1.Items.AddRange(oFolder.GetFiles("*.bmp"))

■リスト15:bmpファイルの一覧を表示する

 

ところでファイルを処理するときには名前だけわかれば良いわけではありません。ここでは1つ1つのファイルに対して何らかの処理を実行する場合を考えて、ファイルのサイズを取得する例を掲載しておきます。

1つ1つのファイルに対して処理を行う場合はGetFilesメソッドで取得できるFileInfoクラスの配列に対してループを行うことになります。

VB.NET2002対応 VB.NET2003対応 VB2005対応

Dim oFolder As New IO.DirectoryInfo("C:\Windows")
Dim oFile As IO.FileInfo
Dim FileSize As
String

For Each oFile In oFolder.GetFiles
    FileSize = oFile.Length \ 1024 &
" KB"
    ListBox1.Items.Add(oFile.Name & " - " & FileSize)
Next

■リスト16:ファイルを1つずつ処理する例

GetFilesクラスの戻り値はFileInfoクラスの配列ですので、前に説明したようにファイルサイズなどの情報の取得がプロパティを使って簡単にできるようになっています。

 

フォルダの中にあるフォルダの一覧を取得するにはGetDirectoriesメソッド(読み方:GetDirectories = ゲットディレクトリーズ)を使用します。このメソッドはGetFilesメソッドと使い方は同じで、戻り値はDirectoryInfoクラスの配列となります。

さらに、ファイルでもフォルダでも一緒くたに取得するGetFileSystemInfosメソッド(読み方:GetFileSystemInfos = ゲットファイルシステムインフォズ)もありますが、あまり便利ではありません。ファイルとフォルダ両方の一覧を取得したい場合はGetFilesメソッドとGetDirectoriesメソッドを1度ずつ呼び出すのが良いようです。

 

7.ファイル検索プログラム

 

ここまでで登場した機能を使って簡単なファイル検索機能をもったプログラムを作ってみます。このプログラムでは対象のフォルダから、目的のファイルを表す先頭の数文字を入力するとたちまちその条件に合致するファイルの一覧が表示されるというものです。

■画像1:ファイル検索プログラム

VB2005では完全な機能が使用できますが、VB.NET2002およびVB.NET2003で作った場合はサブフォルダにあるファイルを検索する機能はありません。もし、VB.NET2002またはVB.NET2003を使用されている方でやる気にあふれている方はサブフォルダ検索機能のプログラムに挑戦してみるのも良いでしょう。

また、対象のフォルダはユーザーが自分で選択できるのが望ましいのですが、今回は説明の便宜のためにC:\Windows固定とします。もちろんプログラム中のこの指定の部分を変更すれば好きなフォルダを対象とすることができます。ユーザーが自分で対象フォルダを選択できるようにプログラムを改造してみるのも一興です。

さて、このソフトのプログラムはかなり単純です、まずテキストボックスとリストボックスを以下の表のように配置してください。名前のほかはAnchorプロパティを変更するだけでOKです。

コントロール プロパティ
txtFileName  (テキストボックス) Anchor Top, Left, Right
lstFileNames  (リストボックス) Anchor Top, Bottom, Left, Right

■表6

そして、テキストボックスのTextChangedイベントに条件に合致するファイルの一覧を表示するようにプログラムします。TextChangedイベントはテキストボックスの内容に変化があったときに発生します。同時に対象フォルダを表すDirectoryInfoクラスのインスタンス作成もこの部分に含めて載せておきます。

VB2005対応

Dim oFolder As New IO.DirectoryInfo("C:\Windows") '対象フォルダのインスタンス作成

Private Sub txtFileName_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtFileName.TextChanged

    lstFileNames.Items.Clear()

    If txtFileName.Text.Length = 0 Then
       
'何も入力されていない場合は何もしない。
       
Return
   
End If

    Dim oFile As IO.FileInfo

    lstFileNames.BeginUpdate()

    For Each oFile In oFolder.GetFiles(txtFileName.Text & "*", IO.SearchOption.AllDirectories)
        lstFileNames.Items.Add(oFile.FullName)
   
Next

    lstFileNames.EndUpdate()

End Sub

■リスト17:ファイル検索プログラム(VB2005)

VB.NET2002およびVB.NET2003の場合はこの部分をちょっとだけ変更する必要があります。次のようになります。VB.NET2002, VB.NET2003ではサブフォルダの検索機能がないのでこのような変更が必要となります。

VB.NET2002対応 VB.NET2003対応 VB2005対応

Dim oFolder As New IO.DirectoryInfo("C:\Windows") '対象フォルダのインスタンス作成

Private Sub txtFileName_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtFileName.TextChanged

    lstFileNames.Items.Clear()

    If txtFileName.Text.Length = 0 Then
       
'何も入力されていない場合は何もしない。
       
Return
   
End If

    Dim oFile As IO.FileInfo

    lstFileNames.BeginUpdate()

    For Each oFile In oFolder.GetFiles(txtFileName.Text & "*")
        lstFileNames.Items.Add(oFile.FullName)
   
Next

    lstFileNames.EndUpdate()

End Sub

■リスト18:ファイル検索プログラム

これだけでもうファイルの一覧を表示する機能は完成です。プログラムを実行させて何か文字を入力して試してみてください。実行速度の遅いパソコンで大量のファイルを検索する場合は少しいらいらするかもしれません。

これだけでは検索する意味があまりないのでファイル名をダブルクリックするとそのファイルが起動するようにしてみましょう。これには以前にも登場したProcessクラス(読み方:Process = プロセス)のStartメソッド(読み方:Start = スタート)を使うだけです。

VB.NET2002対応 VB.NET2003対応 VB2005対応

Private Sub lstFileNames_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles lstFileNames.DoubleClick

    On Error Resume Next
   
Process.Start(lstFileNames.SelectedItem)

End Sub

■リスト19:ダブルクリックしたファイルを起動する

たったこれだけで単純とはいえWindowsにもないようなファイル検索プログラムができるのですからたいしたものです。特にVB2005のサブフォルダ検索機能は大いに役に立っています。あとは対象フォルダの選択ができれば言うことないのですが…。

 

8.存在するパスと存在しないパス

 

最後に存在するパスと存在しないパスについて説明します。

まず、パスが存在するか確認するには既に出てきたようにExistsメソッドを使用します。次の例はC:\Testという名前のファイルが存在するかを調べます。

VB.NET2002対応 VB.NET2003対応 VB2005対応


MsgBox(IO.File.Exists("C:\Test"))

 

■リスト20:ファイルが存在するか確認する

ところで、上記の例ですがC:\Testという「フォルダ」が存在する場合にはFalseを表示されます。FileクラスのExistsメソッドはあくまでも「ファイル」が存在するかを確認するメソッドなのです。

ファイルまたはフォルダが存在するか確認するにはFileクラスのExistsメソッドを呼び出した後でDirectoryクラスのExistsメソッドを使っても良いのですがVBのDir関数(読み方:Dir = ディル)を使うと一度に判断することができます。

VB.NET2002対応 VB.NET2003対応 VB2005対応

If Len(Dir("C:\Test", FileAttribute.Directory)) > 0 Then
   
MsgBox("ファイルまたはフォルダが存在します。")
Else
   
MsgBox("ファイルもフォルダも存在しません。")
End
If

■リスト21:ファイルまたはフォルダが存在するか確認する

Dir関数にはいろいろな使い方があります。ここで紹介した使い方はほんの一例です。

さて、これから新しくファイルを作成しようとしている場合、当然そのファイルはまだ存在していないことになります。たとえば、C:\Test\NewFile.txtというファイルをプログラムで作成する場合のことを考えてみてください。この場合このパスは存在しないパスということになります。

パスが存在しないとどのような不都合があるかすぐにわかるでしょうか?実は存在しないファイルに対してはFileInfoクラスのインスタンスが作成できないのです。もちろんFileクラスを使った様々な操作もできません。

存在しないパスに対して拡張子を取得したり、親フォルダを取得したりするにはPathクラス(読み方:Path = パス)を使うと便利です。Pathクラスはパスが存在していようが存在していまいが平等に扱ってくれます。その代りにPathクラスができることはパス文字列の操作に限られます。Pathクラスには主に次のようなメソッドがあります。

メソッド 読み方 機能
メソッド GetExtension ゲットエクステンション 拡張子を取得する。
メソッド GetDirectoryName ゲットディレクトリネーム フォルダ名を取得する。
メソッド GetFileName ゲットファイルネーム フォルダ名を含まないファイル名を取得する。
メソッド GetFileNameWithoutExtension ゲットファイルネームウィザウトエクステンション フォルダ名と拡張子を含まないファイル名を取得する。
メソッド HasExtension ハズエクステンション 拡張子が含まれているか調べる。
メソッド ChangeExtension チェンジエクステンション 拡張子を変更する。

■表7:Pathクラスの主なメソッド

使用例はまとめて掲載しておきます。

VB.NET2002対応 VB.NET2003対応 VB2005対応

Dim FileName As String = "C:\Test\NewFile.txt"
Dim Extension As String
Dim FolderName As String
Dim Name As String
Dim BodyName As String

Extension = IO.Path.GetExtension(FileName)               '.txt
FolderName = IO.Path.GetDirectoryName(FileName)          'C:\Test
Name = IO.Path.GetFileName(FileName)                     'NewFile.txt
BodyName = IO.Path.GetFileNameWithoutExtension(FileName) 'NewFile
FileName = IO.Path.ChangeExtension(FileName, "bmp")      'C:\Test\NewFile.bmp

If IO.Path.HasExtension(FileName) Then '(True)
   
MsgBox("拡張子あり")
Else
   
MsgBox("拡張子なし")
End
If

■リスト22:パスの基本操作

このPathクラスはファイルが存在にかかわらず動作してくれるので知っておくと何かと便利です。