eclipseプラグイン開発におけるパス表記再考

eclipseのプラグインを開発しているとパスの表記方法がいくつもあることに気が付く。意識していないと混乱するので適当にメモ。

eclipse上でのパス表記方法

最初に、eclipseには2つのパスの表記方法がある。1つはeclipseのworkspaceからのパス、もう1つはOS標準のパス表記だ。それに加えて、それぞれについて絶対パス相対パスを持つ。OS標準のダイアログを使ってファイルを読み込んだ場合、取得したパスはOS標準の絶対パスになっている。
eclipse上のパスは全てIPathを使って管理される。これはパスを表す為だけのインターフェースであり、これ自体にはOSのファイルシステムのパスとplatformのパスを変換するようなインターフェースは備わっていない。親フォルダのIPathを返したり、別のIPathからの相対パスを返す、といったインターフェースは持っている。

eclipse上でファイルを扱うには

IResourceはeclipseのworkspace上にあるリソースを扱う為のインターフェースである。これを継承したファイルを扱うためのIFile、フォルダを扱うためのIFolderも存在する。基本的にeclipseプラグイン作成時はjava.io.Fileは直接使わずにこれらのインターフェースを使用する。
なお、getLocation()はOSのファイルシステム絶対パスを返し、getFullPath()はplatformからのパスを返却する。
ひとつ注意したいのは、なんらかの関数からIFileをインスタンス化したオブジェクトを取得出来たとしても、実際にファイルがあるかどうかはIResource#existsがtrue/falseかを見ることでしか判断出来ない。IFileを予め取得しておいて、そこにファイルを新規に作成する、という使い方をすることもあるからだ。

選択された要素を取得して、パスを表示するだけの例を示す。

public void run(IAction action) {
	IStructuredSelection selection = (IStructuredSelection) window
			.getSelectionService().getSelection();
	IFile file = (IFile) selection.getFirstElement();

	// getFullPathを使った場合
	IPath fullPath = file.getFullPath();
	System.out.println(fullPath.toOSString());
	
	// getLocationを使った場合
	IPath locationPath = file.getLocation();
	System.out.println(locationPath.toOSString());

	// 最後のファイル名だけfuga.txtに置換する
	System.out.println(locationPath.uptoSegment(locationPath.segmentCount() - 1).append("fuga.txt"));
}

以下実行結果。

/hoge.hoge/hogehoge.txt
/Users/mkouhei0910/Documents/runtime-EclipseApplication/hoge.hoge/hogehoge.txt
/Users/mkouhei0910/Documents/runtime-EclipseApplication/hoge.hoge/fuga.txt