アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

A 回答 (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の参照設定が必要です。
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/01/06 14:34

>パソコンに存在しないフォルダを指定した際、


>下のエラー処理(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
’------------------------------------------

以上。
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/01/06 15:53

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
    • good
    • 0

すいません回避方法でしたね。


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
    • good
    • 0

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_関数名)で統一する。

ラベルの命名が原則を逸脱していましたので訂正し補足しておきます。
多分、エラーの原因は、かかる原則の逸脱によるものだと思いますよ。
    • good
    • 0

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であることを求めます。

ビットがわからないとわかりずらい説明かもしれませんが、補足が必要な場合はまた質問をお書きください。
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/01/06 15:51

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
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/01/06 15:45

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!