VBScript FileSystem class

PHPのファイル処理を実行するclass


Class File_System

    Private fso
    Private ts

    '
    'Initialize Class
    ' 
    '@access private
    '
    Private Sub Class_Initialize()
        Set fso = Server.CreateObject("Scripting.FileSystemObject")
    End Sub

    '
    'Terminate Class
    ' 
    '@access private
    '
    Private Sub Class_Terminate()
        Set fso = Nothing
    End Sub

    '=======================================================================
    ' パス中のファイル名の部分を返す
    '=======================================================================
    '【引数】
    '  path      = string   パス。
    '  suffix    = string   ファイル名が、 suffix  で終了する場合、 この部分もカットされます。
    '【戻り値】
    '  指定した path  のベース名を返します。
    '【処理】
    '  ・この関数は、ファイルへのパスを有する文字列を引数とし、 ファイルのベース名を返します。
    '=======================================================================
    Function basename(path, suffix)

        Dim b
        b = preg_replace("/^.*[\/\\]/g",",path,null,null)

        If len(suffix) > 0 Then
            If Right(b,len(suffix)) = suffix Then
                b = Left(b,len(b) - len(suffix))
            End If
        End If

        basename = b

    End Function

    '=======================================================================
    ' ファイルをコピーする
    '=======================================================================
    '【引数】
    '  source  = string   コピー元ファイルへのパス。
    '  dest    = string   コピー先のパス。
    '【戻り値】
    '  成功した場合に TRUE を、失敗した場合に FALSE を返します。
    '【処理】
    '  ・ ファイル source  を dest  にコピーします。
    '  ・ ファイルを移動したいならは、rename() 関数を使用してください。 
    '=======================================================================
    Public Function copy(source,dest)
        fso.CopyFile source,dest
    End Function

    '=======================================================================
    ' オープンされたファイルポインタをクローズする
    '=======================================================================
    '【引数】
    '  
    '【戻り値】
    '  
    '【処理】
    '  ファイルをクローズします。
    '=======================================================================
    Public function fclose
        ts.close
        Set ts = Nothing
    end function

    '=======================================================================
    ' ファイルポインタがファイル終端に達しているかどうか調べる
    '=======================================================================
    '【引数】
    '  
    '【戻り値】
    '  ファイルポインタが EOF に達しているかまたはエラー (ソケットタイムアウトを含みます) の場合に TRUE 、 その他の場合に FALSE を返します。
    '【処理】
    '  ファイルポインタがファイル終端に達しているかどうかを調べます。
    '=======================================================================
    Public function feof
        feof = ts.AtEndofStream
    end function

    '=======================================================================
    ' ファイルポインタから1文字取り出す
    '=======================================================================
    '【引数】
    '  
    '【戻り値】
    '  ファイルポインタから 1 文字読み出し、 その文字からなる文字列を返します。EOF の場合に FALSE を返します。
    '【処理】
    '  指定したファイルポインタから 1 文字読み出します。
    '=======================================================================
    Public function fgetc
        If ts.AtEndofStream Then
            fgetc = false
        Else
            fgetc = ts.Read(1)
        End If
    end function

    '=======================================================================
    ' ファイルポインタから行を取得し、CSVフィールドを処理する
    '=======================================================================
    '【引数】
    '  
    '【戻り値】
    '  読み込んだフィールドの内容を含む数値添字配列を返します。
    '【処理】
    '  fgets() に動作は似ていますが、 fgetcsv() は行を CSV  フォーマットのフィールドとして読込み処理を行い、 読み込んだフィールドを含む配列を返すという違いがあります。
    '=======================================================================
    Public Function fgetcsv(delim)

        Dim tmp,d
        If len(delim) > 0 Then d = delim Else d = ","
        tmp = ts.ReadLine
        fgetcsv = fgetcsv_helper(tmp,d)

    End Function

    '************************************
    Public Function fgetcsv_helper(str,d)

        Dim matchAll,key
        Dim data,field,record : field = 0 : record = 0
        ReDim data(0)

        If preg_match_all(_
        "/" & d & "|" & vbCr & "?" & vbLf & "|[^" & d & "" & vbCrLf & "][^" & d & " & vbCrLf & "]*|"(?:[^"]|"")*"/",_
        str, matchAll,PREG_PATTERN_ORDER,") Then
            For Each key In matchAll(0)
                Select Case key
                Case d
                    field = field + 1
                Case vbCrLf
                    [] data , "
                    record = record +1
                Case Else
                    If left(key,1) = "" Then
                        key = Replace(substr(key,2,-1),"","")
                    End if
                    [] data(record), key
                End Select
            Next
        End If

        fgetcsv_helper = data

    End Function

    '=======================================================================
    ' ファイルポインタから 1 行取得する
    '=======================================================================
    '【引数】
    '  
    '【戻り値】
    '  ファイルポインタから 1 行取得する
    '【処理】
    '  ファイルポインタから 1 行取得します。
    '=======================================================================
    Public function fgets
        fgets = ts.ReadLine
    end function

    '=======================================================================
    ' ファイルポインタから 1 行取り出し、HTML タグを取り除く
    '=======================================================================
    '【引数】
    '  
    '【戻り値】
    '  HTML や PHP コードを取り除いた文字列を返します。
    '【処理】
    '  fgets() と同じですが、 fgetss() は読み込んだテキストから HTML および PHP のタグを取り除こうとすることが異なります。
    '=======================================================================
    Public function fgetss
        fgets = strip_tags(ts.ReadLine)
    end function

    '=======================================================================
    ' ファイルまたはディレクトリが存在するかどうか調べる
    '=======================================================================
    '【引数】
    '  path      = string   ファイルあるいはディレクトリへのパス。
    '【戻り値】
    '  ファイルあるいはディレクトリが存在するかどうかを調べます。
    '【処理】
    '  ファイルあるいはディレクトリが存在するかどうかを調べます。
    '=======================================================================
    Public Function file_exists(ByVal filename)

        file_exists = false
        filename = fileMapPath(filename)
        If fso.FileExists(filename) Then file_exists = true
        If fso.FolderExists(filename) Then file_exists = true

    End Function

    '=======================================================================
    'ファイルの内容を全て文字列に読み込む
    '=======================================================================
    '【引数】
    '  filename  = string データを読み込みたいファイルの名前。
    '【戻り値】
    '  読み込んだデータを返します。失敗した場合は FALSE を返します。
    '【処理】
    '  ファイルの内容を文字列に読み込む
    '=======================================================================
    Public function file_get_contents(filename)

        Dim ts
        Dim contents

        if left(filename,7) <> "http://" and file_exists( filename ) then
            Set TS = fso.OpenTextFile( fileMapPath(filename),1)

            '空のファイルの場合、エラーになってしまう
            If TS.AtEndOfStream <> True Then
               contents = TS.ReadAll
            End If

            file_get_contents = contents
            Exit Function
        end if

        if left(filename,7) <> "http://" then
            file_get_contents = false
            Exit Function
        end if

        Dim objWinHttp
        'Set objWinHttp = Server.CreateObject("WinHttp.WinHttpRequest.5.1")
        'Set objWinHttp = Server.CreateObject("MSXML2.XMLHTTP")
        Set objWinHttp = Server.CreateObject("MSXML2.ServerXMLHTTP")

        objWinHttp.Open "GET", filename, false
        objWinHttp.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
        objWinHttp.Send
        'Response.Write objWinHttp.Status & " " & objWinHttp.StatusText

        file_get_contents = objWinHttp.ResponseText

        Set objWinHttp = Nothing

        '有効にしたエラー処理を無効にする

    end function

    '=======================================================================
    ' ファイルの最終アクセス時刻を取得する
    '=======================================================================
    '【引数】
    '  filename = string   ファイルへのパス。
    '【戻り値】
    '  ファイルの最終アクセス時刻を返し、エラーの場合は FALSE を返します。
    '【処理】
    '  指定したファイルの最終アクセス時刻を取得します。
    '=======================================================================
    Public Function fileatime(filename)

        Dim f
        filename = fileMapPath(filename)
        set f = fso.GetFile(filename)
        fileatime = f.DateLastAccessed

    End Function

    '=======================================================================
    ' ファイルの更新時刻を取得する
    '=======================================================================
    '【引数】
    '  filename = string   ファイルへのパス。
    '【戻り値】
    '  ファイルの最終更新時刻を返し、エラーの場合は FALSE  を返します。
    '【処理】
    '  この関数は、ファイルのブロックデータが書き込まれた時間を返します。 これは、ファイルの内容が変更された際の時間です。
    '=======================================================================
    Public Function filemtime(filename)

        Dim f
        filename = fileMapPath(filename)
        set f = fso.GetFile(filename)
        filemtime = f.DateLastModified

    End Function

    '*************************************
    Private Function fileMapPath(filename)

        Dim tmp
        tmp = Left(filename,3)
        tmp = Lcase(tmp)
        If tmp <> "d:\ and tmp <> "c:\" and left(filename,7) <> "http://" then
                fileMapPath = Server.MapPath(filename)
        Else
            fileMapPath = filename
        End If

    End Function

    '=======================================================================
    ' ファイルのサイズを取得する
    '=======================================================================
    '【引数】
    '  filename = string   ファイルへのパス。
    '【戻り値】
    '  ファイルのサイズを返し、エラーの場合は FALSE を返します (また E_WARNING レベルのエラーを発生させます) 。
    '【処理】
    '  指定したファイルのサイズを取得します。
    '=======================================================================
    Public Function filesize(filename)

        Dim f
        filename = fileMapPath(filename)
        set f = fso.GetFile(filename)
        filesize = f.Size

    End Function

    '=======================================================================
    ' ファイルタイプを取得する
    '=======================================================================
    '【引数】
    '  filename = string   ファイルへのパス。
    '【戻り値】
    '  ファイルのタイプを返します。
    '【処理】
    '  指定したファイルのタイプを返します。
    '=======================================================================
    Public Function filetype(filename)

        Dim f
        filename = fileMapPath(filename)
        set f = fso.GetFile(filename)
        filetype = f.Type

    End Function

    '=======================================================================
    ' ファイルまたは URL をオープンする
    '=======================================================================
    '【引数】
    '  filename  =  string データを読み込みたいファイルの名前。
    '  mode      =  string ストリームに要するアクセス形式を指定します
    '【戻り値】
    '  成功した場合にファイルポインタリソースを返します。
    '【処理】
    '  fopen() は、filename  で指定されたリソースをストリームに結び付けます。
    '=======================================================================
    Public function fopen(filename, mode)

        Dim filePath
        filePath = fileMapPath(filename)

        If left(filePath,len("http://")) = "http://" Then
            fopen = file_get_contents(filePath)
            Exit Function
        End If

        Select Case mode
        Case "r"
            '読み込みのみでオープンします。
            Set ts = fso.OpenTextFile(filePath,1,false)
        Case "w"
            '書き込みでオープンします。
            Set ts = fso.OpenTextFile(filePath,2,true)
        Case "a"
            '追記でオープンします。
            Set ts = fso.OpenTextFile(filePath,8,true)
        Case "x"
            '書き込みでオープンします。ファイルが存在した場合はfalseを返します。
            If is_file(filePath) Then
                fopen = false
            Else
                Set ts = fso.OpenTextFile(filePath,2,true)
            End If
        Case Else
            'empty
            ts = false
        End Select

    end function

    '=======================================================================
    ' 行を CSV 形式にフォーマットし、ファイルポインタに書き込む
    '=======================================================================
    '【引数】
    '  fields  =  string    値の配列。
    '  delimiter  =  string オプションの delimiter  はフィールド区切り文字 (一文字だけ) を指定します。デフォルトはカンマ (,) です。
    '  enclosure  =  string オプションの enclosure  はフィールドを囲む文字 (一文字だけ) を指定します。デフォルトは二重引用符 (") です。
    '【戻り値】
    '  書き込んだ文字列の長さを返します。失敗した場合は FALSE を返します。
    '【処理】
    '  fputcsv() は、行(fields  配列として渡されたもの)を CSV としてフォーマットし、それを ファイルに書き込みます (いちばん最後に改行を追加します)。
    '=======================================================================
    Public function fputcsv(fields,delimiter,enclosure)

        fputcsv = false
        If len(delimiter) = 0 Then delimiter = ","
        If len(enclosure) = 0 Then enclosure = ""

        Dim key,replaced
        For key = 0 to uBound(fields)
            replaced = false
            If inStr(fields(key),delimiter) or inStr(fields(key),enclosure) or inStr(fields(key),vbCrLf) Then
                fields(key) = Replace(fields(key),enclosure,enclosure & enclosure)
                fields(key) = enclosure & fields(key) & enclosure
            End If
        Next

        Dim str : str = join(fields,delimiter)
        ts.WriteLine str
        fputcsv = len(str)
    end function

    '=======================================================================
    ' fwrite() のエイリアス
    '=======================================================================
    '【引数】
    '  str  =  string 書き込む文字列。
    '【説明】
    '  この関数は次の関数のエイリアスです。 fwrite().
    '=======================================================================
    Public function fputs(str)
        fputs = fwrite(str)
    end function

    '=======================================================================
    ' バイナリセーフなファイル書き込み処理
    '=======================================================================
    '【引数】
    '  str     =  string   書き込む文字列。
    '【戻り値】
    '  
    '【処理】
    '  string の内容を ファイル・ストリームに書き込みます。
    '=======================================================================
    Public function fwrite(str)
        ts.WriteLine str
    end function

    '=======================================================================
    ' ファイルがディレクトリかどうかを調べる
    '=======================================================================
    '【引数】
    '  filename = string    ファイルへのパス。filename  が相対パスの場合は、現在の作業ディレクトリからの相対パスとして処理します。
    '【戻り値】
    '  ファイルがが存在して、かつそれがディレクトリであれば TRUE、それ以外の場合は FALSE を返します。
    '【処理】
    '  指定したファイルがディレクトリかどうかを調べます。
    '=======================================================================
    Public Function is_dir(filename)

        Dim fn
        is_dir = false
        fn = fileMapPath(filename)

        If fso.FolderExists(fn) Then is_dir = true

    End Function

    '=======================================================================
    ' 通常ファイルかどうかを調べる
    '=======================================================================
    '【引数】
    '  filename = string    ファイルへのパス。
    '【戻り値】
    '  ファイルが存在し、かつそれが通常のファイルである場合に TRUE、 それ以外の場合に FALSE を返します。
    '【処理】
    '  指定したファイルが通常のファイルかどうかを調べます。
    '=======================================================================
    Public Function is_file(ByVal filename)

        is_file = false
        filename = fileMapPath(filename)
        If fso.FileExists(filename) Then is_file = true

    End Function

    '=======================================================================
    ' ディレクトリを作る
    '=======================================================================
    '【引数】
    '  pathname = string    ディレクトリのパス。
    '【戻り値】
    '  成功した場合に TRUE を、失敗した場合に FALSE を返します。
    '【処理】
    '  指定したディレクトリを作成します。
    '=======================================================================
    Public Function mkdir(ByVal pathname)

        mkdir = false
        pathname = fileMapPath(pathname)
        If not fso.FolderExists(pathname) Then
            mkdir = fso.CreateFolder(pathname)
        End If

    End Function

    '=======================================================================
    ' ファイルパスに関する情報を返す
    '=======================================================================
    '【引数】
    '  path     = string    調べたいパス。
    '  options  = string    どの要素を返すのかをオプションのパラメータ options  で指定します。これは PATHINFO_DIRNAME、 PATHINFO_BASENAME、 PATHINFO_EXTENSION および PATHINFO_FILENAME の組み合わせとなります。 デフォルトではすべての要素を返します。
    '【戻り値】
    '   以下の要素を含む連想配列を返します。 dirname (ディレクトリ名)、basename (ファイル名) そして、もし存在すれば extension (拡張子)。
    '   options を使用すると、 すべての要素を選択しない限りこの関数の返り値は文字列となります。 
    '【処理】
    '  pathinfo() は、path  に関する情報を有する連想配列を返します。
    '=======================================================================
    Public Function pathinfo(path,options)

        Dim obj : set obj = Server.CreateObject("Scripting.Dictionary")
        Dim tmp


        obj("dirname") = dirname(path)
        obj("basename") = basename(path,")
        obj("extension") = obj("basename")

        If inStr(obj("basename"),".") Then
            tmp = Split(obj("basename"),".")
            obj("extension") = tmp( uBound(tmp) )
        End if

        obj("filename") = Replace(obj("basename"),"." & obj("extension"),")

        If len(options) > 0 Then

            If options = PATHINFO_DIRNAME Then
                pathinfo = obj("dirname")
            ElseIf options = PATHINFO_BASENAME Then
                pathinfo = obj("basename")
            ElseIf options = PATHINFO_EXTENSION Then
                pathinfo = obj("extension")
            ElseIf options = PATHINFO_FILENAME Then
                pathinfo = obj("filename")
            End if
            Exit Function
        End If

        set pathinfo = obj
    End Function

    '=======================================================================
    ' ディレクトリを削除する
    '=======================================================================
    '【引数】
    '  dirname     = string    ディレクトリへのパス。
    '【戻り値】
    '   成功した場合に TRUE を、失敗した場合に FALSE を返します。
    '【処理】
    '  dirname で指定されたディレクトリを 削除しようと試みます。
    '  ディレクトリは空でなくてはならず、また 適切なパーミッションが設定されていなければなりません。
    '=======================================================================
    Public Function rmdir(ByVal dirname)

        dirname = fileMapPath(dirname)
        fso.DeleteFolder dirname
        rmdir = true

    End Function
    
    '=======================================================================
    ' ファイルを削除する
    '=======================================================================
    '【引数】
    '  filename     = string    ファイルへのパス。
    '【戻り値】
    '   成功した場合に TRUE を、失敗した場合に FALSE を返します。
    '【処理】
    '  filename  を削除します。 Unix C 言語の関数 unlink() と動作は同じです。
    '=======================================================================
    Public Function unlink(ByVal filename)

        filename = fileMapPath(filename)
        fso.DeleteFile filename
        unlink = true

    End Function

End Class

ファイルシステムを操作するclass。
詳しい使い方は各関数を参照ください。

その他の PHP filesystem 関数