ファイル名、パス名を取得する
概要
ファイル名、パス名を取得する方法。
FileSystemObjectのパス関係のメソッド
| メソッド | 説明 |
|---|---|
| GetAbsolutePathName | フルパスを返す |
| GetBaseName | 拡張子を除いたファイル名を返す |
| GetExtensionName | 拡張子を返す |
| GetFileName | ファイル名を返す |
| GetDriveName | ドライブ名を返す |
| GetParentFolderName | 親フォルダ名を返す |
| BuildPath | 文字列をつないでパスを返す |
| GetSpecialFolder | 特殊フォルダのパスを返す |
指定したファイルのファイル名やパスを取得する
以下のスクリプトファイルは、テキストファイルtest.txtと一緒にC:\Scriptフォルダ内に置いてあるとする。
Dim fso, path
Set fso = CreateObject("Scripting.FileSystemObject")
'フルパスで指定した場合
path = "C:¥Script¥test.txt"
Msgbox fso.GetAbsolutePathName(path) 'C:¥Script¥test.txt
Msgbox fso.GetBaseName(path) 'test
Msgbox fso.GetExtensionName(path) 'txt
Msgbox fso.GetFileName(path) 'test.txt
Msgbox fso.GetDriveName(path) 'C:
Msgbox fso.GetParentFolderName(path) 'C:¥Script
'ファイル名で指定した場合
path = "test.txt"
Msgbox fso.GetAbsolutePathName(path) 'C:¥Script¥test.txt
Msgbox fso.GetBaseName(path) 'test
Msgbox fso.GetExtensionName(path) 'txt
Msgbox fso.GetFileName(path) 'test.txt
Msgbox fso.GetDriveName(path) '
Msgbox fso.GetParentFolderName(path) '
'長さ0の文字列で指定した場合
path = ""
Msgbox fso.GetAbsolutePathName(path) 'C:¥Script
Msgbox fso.GetBaseName(path) '
Msgbox fso.GetExtensionName(path) '
Msgbox fso.GetFileName(path) '
Msgbox fso.GetDriveName(path) '
Msgbox fso.GetParentFolderName(path) '
'現在の作業フォルダで指定した場合
path = "."
Msgbox fso.GetAbsolutePathName(path) 'C:¥Script
Msgbox fso.GetBaseName(path) '
Msgbox fso.GetExtensionName(path) '
Msgbox fso.GetFileName(path) '.
Msgbox fso.GetDriveName(path) '
Msgbox fso.GetParentFolderName(path) '
'現在の作業フォルダの親フォルダで指定した場合
path = ".."
Msgbox fso.GetAbsolutePathName(path) 'C:¥
Msgbox fso.GetBaseName(path) '.
Msgbox fso.GetExtensionName(path) '
Msgbox fso.GetFileName(path) '..
Msgbox fso.GetDriveName(path) '
Msgbox fso.GetParentFolderName(path) '
引数のファイルが実在しなくてもエラーは発生せず値は返ってくる。
BuildPathメソッド
2つの引数を適宜\を補足してつないだパスを返す。
Dim fso
Set fso = CreateObject("Scripting.FileSystemObject")
Msgbox fso.BuildPath("C:\Script", "test.txt") 'C:\Script\test.txt
Msgbox fso.BuildPath("C:\Script\", "test.txt") 'C:\Script\test.txt
Msgbox fso.BuildPath("C:\Script", "\test.txt") 'C:\Script\test.txt
Msgbox fso.BuildPath("C:\Script\", "\test.txt") 'C:\Script\test.txt
Msgbox fso.BuildPath("C:\Script\test.txt", "new.txt") 'C:\Script\test.txt\new.txt
Msgbox fso.BuildPath("C:", "test.txt") 'C:test.txt
Msgbox fso.BuildPath("C:\", "test.txt") 'C:\test.txt
ただし下から2番目の場合は\を補足してくれない。
GetSpecialFolderメソッド
特殊フォルダを取得できる。
| 引数 | 説明 |
|---|---|
| 0 | Windowsフォルダ |
| 1 | システムフォルダ |
| 2 | Tempフォルダ |
Dim fso
Set fso = CreateObject("Scripting.FileSystemObject")
Msgbox fso.GetSpecialFolder(0) 'C:\Windows
Msgbox fso.GetSpecialFolder(1) 'C:\Windows\System32
Msgbox fso.GetSpecialFolder(2) 'C:\Users\ログインユーザ\AppData\Local\Temp
上記のGetSpecialFolderメソッドで取得できるのはフォルダオブジェクトだが、Msgboxに渡されるとパス(デフォルトプロパティ)が表示される。
WshShellオブジェクトのSpecialFoldersプロパティ
SpecialFoldersコレクションを取得し、特殊フォルダのパスを取得できる。
Dim col
Set col = CreateObject("WScript.Shell").SpecialFolders
Msgbox col(0) 'C:\Users\Public\Desktop
Msgbox col("AllUsersDesktop") 'C:\Users\Public\Desktop
取得できるパス一覧
| 数値 | 指定名 | 説明 |
|---|---|---|
| 0 | AllUsersDesktop | 全ユーザ共通のデスクトップ |
| 1 | AllUsersStartMenu | 全ユーザ共通のスタートメニュー |
| 2 | AllUsersPrograms | 全ユーザ共通のスタートメニューのプログラムフォルダ |
| 3 | AllUsersStartup | 全ユーザ共通のスタートアップフォルダ |
| 4 | Desktop | デスクトップ |
| 5 | AppData | アプリケーションデータ |
| 6 | PrintHood | プリンタ |
| 7 | Templates | テンプレート |
| 8 | Fonts | フォント |
| 9 | NetHood | ネットワーク |
| 10 | Desktop | デスクトップ |
| 11 | StartMenu | スタートメニュー |
| 12 | SendTo | 送るフォルダ |
| 13 | Recent | 最近使ったファイル |
| 14 | Startup | スタートアップフォルダ |
| 15 | Favorites | お気に入り |
| 16 | MyDocuments | マイドキュメント |
| 17 | Programs | プログラムフォルダ |
WshShellオブジェクトのCurrentDirectoryプロパティ
現在の作業フォルダの取得と変更ができる。
使用例
Dim shell
Set shell = CreateObject("WScript.Shell")
'取得
Msgbox shell.CurrentDirectory 'C:\Script
'変更
shell.CurrentDirectory = "C:\Test"
Msgbox shell.CurrentDirectory 'C:\Test
VBAだとChDirとChDriveを使って現在の作業フォルダを変更できるが、ネットワーク上の共有フォルダを指定するには、ネットワークドライブを設定しておく必要があった。
VBAでも上記のやり方で、ネットワーク上の共有フォルダを指定できて、「ファイルを開く」ダイアログボックスの初期に表示されるフォルダを制御できる。
WScriptオブジェクトのパス関係のプロパティ
WSHプログラムや実行中のスクリプトのパスを取得できる。
| プロパティ | 説明 |
|---|---|
| Name | Windows Script Hostという文字列 |
| Path | Windows Script Hostプログラムがある場所 |
| ScriptName | スクリプトファイルのファイル名 |
| ScriptFullName | スクリプトファイルのフルパス |
使用例
Msgbox WScript.Name
Msgbox WScript.Path
Msgbox WScript.ScriptName
Msgbox WScript.ScriptFullName
GetAbsolutePathNameメソッドについて
起動したスクリプトファイルと同じフォルダ内にあるtest.txtの絶対パスを取得したい場合
Dim fso, buf
Set fso = CreateObject("Scripting.FileSystemObject")
buf = fso.GetAbsolutePathName("test.txt")
で取得できるが、フォルダがネットワーク上の共有フォルダである場合は(共有フォルダでなくローカルのシステムフォルダが作業フォルダになってしまうので)うまくいかない。その場合は
Dim fso, buf
Set fso = CreateObject("Scripting.FileSystemObject")
buf = fso.GetParentFolderName(WScript.ScriptFullName) & "\" & "test.txt"
で取得できる。ただし以下のやり方でも取得できる。
Dim fso, buf
Set fso = CreateObject("Scripting.FileSystemObject")
buf = fso.GetAbsolutePathName(WScript.ScriptFullName & "\..\test.txt")
test.txtがスクリプトファイルの一つ上の階層にある場合も、以下のようにすればよい。
Dim fso, buf
Set fso = CreateObject("Scripting.FileSystemObject")
buf = fso.GetAbsolutePathName(WScript.ScriptFullName & "\..\..\test.txt")
GetParentFolderNameを2重に適用するよりは、こちらのほうが使いやすい。