ボンジュール・マドモアゼル

本サイトの情報は自己責任にてご利用下さい。

[VBScript] VBScript Windows ファイルパス比較

 
Windowsのファイルパスには、次のような仕様がある。
次のパス名はすべて同じファイルを示すものとして解釈される:
  1. d:\InetPub\wwwroot\secret\data.txt
     基本形
  2. d:\inetpub\WWWROOT\SECRET\DATA.TXT
     大文字小文字は同一視される
  3. d:/InetPub/wwwroot/secret/data.txt
     ディレクトリの区切りに「/」も使える
  4. d:\\InetPub\\\wwwroot\\\\secret\\\\\data.txt
     ディレクトリの区切り文字は幾つか重複しても構わない
  5. d:////InetPub///wwwroot//secret/data.txt
     「/」も重複できる
  6. d:\InetPub\.\wwwroot\.\.\secret\.\.\.\data.txt
     「カレントディレクトリ」を表す . を差し挟むことができる
  7. d:\fake\fake\..\..\InetPub\wwwroot\secret\data.txt
     実在しないディレクトリもあとで「..」で遡れば指定可能

http://www.ipa.go.jp/security/awareness/vendor/programmingv1/b08_01.html


以下は、上記の仕様に則ってファイルパスの比較を行うVBScriptのサンプルコード。少し修正すればVBAでも使えるはず。
'FilePathComp.vbs

Option Explicit

Call Test("C:WindoWSSystEm32", "C://///Windows////System32")
Call Test("C:WindowsWeb..SystEm32", "C:///Windows.SysTEM32")

Function FilePathsAreSame(FilePath1, FilePath2)
FilePathsAreSame = (StrComp(CanonicalizeFilePath(FilePath1), _
CanonicalizeFilePath(FilePath2), _
vbBinaryCompare) = 0)
End Function


Private fs
Function CanonicalizeFilePath(FilePath)
If IsEmpty(fs) Then
Set fs = CreateObject("Scripting.FileSystemObject")
End If
CanonicalizeFilePath = LCase(fs.GetAbsolutePathName(FilePath))
End Function


Sub Test(FilePath1, FilePath2)
Dim Paths(1)
Paths(0) = FilePath1
Paths(1) = FilePath2

WScript.Echo "FilePathsAreSame(""" & Paths(0) & _
""", """ & Paths(1) & """) ==> " & _
FilePathsAreSame(Paths(0), Paths(1))
Dim i
for i = 0 to 1
WScript.Echo "CanonicalizeFilePath(""" & Paths(i) & """)" & _
vbTab & "==> " & CanonicalizeFilePath(Paths(i))
Next
WScript.Echo
End Sub
出力結果
C:\>cscript FilePathComp.vbs

Microsoft (R) Windows Script Host Version 5.8
Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.

FilePathsAreSame("C:\\\WindoWS\\\\\SystEm32", "C://///Windows////System32") ==> True
CanonicalizeFilePath("C:\\\WindoWS\\\\\SystEm32") ==> c:\windows\system32
CanonicalizeFilePath("C://///Windows////System32") ==> c:\windows\system32

FilePathsAreSame("C:\Windows\Web\..\SystEm32", "C:///Windows\\.\SysTEM32") ==> True
CanonicalizeFilePath("C:\Windows\Web\..\SystEm32") ==> c:\windows\system32
CanonicalizeFilePath("C:///Windows\\.\SysTEM32") ==> c:\windows\system32
  1. 2012/03/20(火) 09:28:04|
  2. VBScript|
  3. トラックバック(-)|
  4. コメント:0
<<VBScript RegExp MultiLine まとめ | ホーム | DAO.Database DAOデータベースがOpen状態かどうかを判定する方法>>

コメント

コメントの投稿

管理者にだけ表示を許可する

画像の文字を半角数字で下記ボックスに記入ください。
文字が読みにくい場合はブラウザの更新をすると新しい文字列が表示されます。