• ベストアンサー

ファイルの有無を確認した際のエラーについて

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

質問者が選んだベストアンサー

  • ベストアンサー
  • AKARI0418
  • ベストアンサー率67% (112/166)
回答No.1

>If (GetAttr(strPathName) And vbDirectory) = vbDirectory Then この部分がエラーになるため起こっています。 VB6でファイルの存在をチェックするのであればDIR関数を使うのが一般的ではないでしょうか? DIR関数はファイルが存在すればファイル名を返し、存在しない場合はNULLを返します。 If Dir(strpathname) <> vbNullString Then End if で判定することができます。 ほかにもFileSystemObjectを使用しFileExistsメソッドを使用して有無を判定することができます。 FileSystemObjectを使用する場合はMicrosoft Scripting Runtimeの参照設定が必要です。

cuctus_200
質問者

お礼

回答ありがとうございます。 dir関数で出来ました。 ありがとうございます。 そこで、今後のために聞きたいのですが、 If (GetAttr(strPathName) And vbDirectory) = vbDirectory Then というような物を使用した場合、これをエラーを出させる、 又は何かしらの回避の手段というのはあるのでしょうか?

その他の回答 (6)

  • onlyrom
  • ベストアンサー率59% (228/384)
回答No.7

>パソコンに存在しないフォルダを指定した際、 >下のエラー処理(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 ’------------------------------------------ 以上。

cuctus_200
質問者

お礼

回答ありがとうございます。 エラー処理に飛ばないというのは、その前にエラーメッセージが出て 止まってしまうと言うことです。 関数名の件は、変更忘れです。 仰る通りです。

noname#140971
noname#140971
回答No.6

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)
回答No.5

すいません回避方法でしたね。 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

noname#140971
noname#140971
回答No.4

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)
回答No.3

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であることを求めます。 ビットがわからないとわかりずらい説明かもしれませんが、補足が必要な場合はまた質問をお書きください。

cuctus_200
質問者

お礼

回答ありがとうございます。 ビットと論理積はかろうじて理解しています。 詳細な説明ありがとうございます。

noname#140971
noname#140971
回答No.2

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

cuctus_200
質問者

お礼

回答ありがとうございます。 Scripting.FIleSystemObjectは少しだけ聞いたことがあるような。 これを機会に勉強してみます ありがとうございました

関連するQ&A