- ベストアンサー
ファイルの有無を確認した際のエラーについて
VB6です。以下の様な関数を使っています。 用途としては、ファイルの有無を調べています。 で、関数の値として実際のパソコンに存在しないフォルダを指定した際、 下のエラー処理(AAA)に飛びません。 わかる方いらしたら、よろしくお願いします。 Public Function files(ByVal strPathName As String) As Boolean On Error GoTo AAA If (GetAttr(strPathName) And vbDirectory) = vbDirectory Then Stop Else Stop End If Exists2 = True Exit Function AAA: Stop End Function
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
>If (GetAttr(strPathName) And vbDirectory) = vbDirectory Then この部分がエラーになるため起こっています。 VB6でファイルの存在をチェックするのであればDIR関数を使うのが一般的ではないでしょうか? DIR関数はファイルが存在すればファイル名を返し、存在しない場合はNULLを返します。 If Dir(strpathname) <> vbNullString Then End if で判定することができます。 ほかにもFileSystemObjectを使用しFileExistsメソッドを使用して有無を判定することができます。 FileSystemObjectを使用する場合はMicrosoft Scripting Runtimeの参照設定が必要です。
その他の回答 (6)
- onlyrom
- ベストアンサー率59% (228/384)
>パソコンに存在しないフォルダを指定した際、 >下のエラー処理(AAA)に飛びません。 エラー処理に飛ばない、との判断はどのようにしましたか? 質問者のコードでいいと思いますがねぇ。 但し、 Exists2 = True これは拙いのでは? 関数名がfilesなんですから、 files = True では? 何れにしろ質問者のコードのStopをMsgBoxに変えて再確認をお奨めします。 '--------------------------------------- Public Function files(ByVal strPathname As String) As Boolean On Error GoTo AAA If (GetAttr(strPathname) And vbDirectory) = vbDirectory Then MsgBox strPathname & " は、フォルダー" Else MsgBox strPathname & " は、有るよ" End If files = True ●追加 'Exists2 = True ■これ違いますよね、たぶん。 Exit Function AAA: MsgBox strPathname & " は、ないよ!" End Function ’------------------------------------------ 以上。
お礼
回答ありがとうございます。 エラー処理に飛ばないというのは、その前にエラーメッセージが出て 止まってしまうと言うことです。 関数名の件は、変更忘れです。 仰る通りです。
Public Function Files(ByVal strPathName As String) As Boolean On Error GoTo Error_Files ' 処理コード Exit_Files: Files = isExists Exit Function Error_Files: isExists = False Resume Exit_Files <--- 訂正! End Function
- AKARI0418
- ベストアンサー率67% (112/166)
すいません回避方法でしたね。 ON ERROR RESUME NEXT を使用すれば処理が続行されます。 エラーが実際に起きると、Err.Numberに値がセットされています。 Err.NumberはもともとVBが持っている値ですので宣言は必要ありません。 Err.Number=53のときがファイルまたはフォルダが存在しないときです。 Err.Number=52で帰ってきた場合はパスとして無効なもの(ワイルドカード含む等)の2種類しかないようです。 例としては下記のようになります。 On Error Resume Next If (GetAttr(strPathName) And vbDirectory) = vbDirectory and Err.number = 0 Then Exists2 = True Stop Elseif err.number <> 0 then Err.number = 0 '必ずクリアしてください 'AAAの処理 else Stop End If Exit Function
Public Function Files(ByVal strPathName As String) As Boolean On Error GoTo Error_Files ' 処理コード Exit_Files: Files = isExists Exit Function Error_Files: isExists = False Resume End_function End Function 原則1、関数からの抜け道は一つにする。 原則2、ラベル名は、Exit_関数名(End_関数名)、Error_関数名(Err_関数名)で統一する。 ラベルの命名が原則を逸脱していましたので訂正し補足しておきます。 多分、エラーの原因は、かかる原則の逸脱によるものだと思いますよ。
- AKARI0418
- ベストアンサー率67% (112/166)
Getattr関数はファイルまたはディレクトリの状態を判別するために使用します。Getattr関数は対象があって初めて使用すべき関数であって、存在チェックのために使用すべきではないようです。 Getattr関数は戻り値としてFileAttribute 型のデータがかえってきます。 戻り値の各ビットの状態をチェックすることで、ファイルまたはフォルダの属性を知ることができます。 Normal vbNormal 通常。 ReadOnly vbReadOnly 読み取り専用です。 Hidden vbHidden 隠しファイル。 System vbSystem システム ファイル。 Directory vbDirectory ディレクトリまたはフォルダ。 Archive vbArchive 前回のバックアップ以降に変更されているファイル。 Alias vbAlias 他の名前が付いているファイル。 といった感じで割り当てられています。 たとえばDirectoryのビットがONの状態であれば、Getattrに渡したパスはフォルダであることをさします。 >(GetAttr(strPathName) And vbDirectory) = vbDirectory の式は戻り値とvbDirectoryの論理積をとり、結果がvbDirectoryのビットがONであることを求めます。 ビットがわからないとわかりずらい説明かもしれませんが、補足が必要な場合はまた質問をお書きください。
お礼
回答ありがとうございます。 ビットと論理積はかろうじて理解しています。 詳細な説明ありがとうございます。
Public Function Files(ByVal strPathName As String) As Boolean On Error GoTo Error_Files Dim isExists As Boolean isExists = True If (GetAttr(strPathName) And vbDirectory) = vbDirectory Then Stop Else Stop End If End_function: Files = isExists Exit Function Error_Files: Stop isExists = False Resume End_function End Function 一応、これで On Error GoTo Error_Files へと飛ぶかと思います。 もちろん、次のように簡略化してもOKです。 Public Function Files(ByVal strPathName As String, Optional filType As Integer = 0) As Boolean On Error Resume Next Files = CBool((GetAttr(strPathName) And filType) = filType) End Function [イミディエイト] ? Files("C:\Temp\111.txt") <--- 通常ファイルかどうかをチェック! True ? Files("C:\Temp", vbDirectory) <---- フォルダかどうかをチェック! True ? Files("C:\Temp\111.txt", vbDirectory) <---- フォルダかどうかをチェック! False これは、関数の戻り値を設定しない場合には自動的にFalseが戻されるのを利用しています。 蛇足ですが、Scripting.FIleSystemObject を使う手もありますよ。 [イミディエイト] ? FileExists("C:\Temp\11111.txt") False ? FileExists("C:\Temp\111.txt") True Public Function FileExists(ByVal FileName As String) As Boolean Dim fso As Object Set fso = CreateObject("Scripting.FIleSystemObject") FileExists = fso.FileExists(FileName) End Function Public Function FolderExists(ByVal FolderName As String) As Boolean Dim fso As FileSystemObject Set fso = New FileSystemObject FolderExists = fso.FolderExists(FolderName) End Function
お礼
回答ありがとうございます。 Scripting.FIleSystemObjectは少しだけ聞いたことがあるような。 これを機会に勉強してみます ありがとうございました
お礼
回答ありがとうございます。 dir関数で出来ました。 ありがとうございます。 そこで、今後のために聞きたいのですが、 If (GetAttr(strPathName) And vbDirectory) = vbDirectory Then というような物を使用した場合、これをエラーを出させる、 又は何かしらの回避の手段というのはあるのでしょうか?