昔のブログから引っ越してきた、2011/07/29当時の記事です
ThinkITの記事を見つつ(リンク切れ)HelloWorldコマンドプラグインでベースを作成。
やるべきことは技術的には
- 1.eclipse上の選択フォルダを取得する
- ファイル一覧を取得する
- 既存ファイルを削除する
- ファイルをコピーする
ぐらい。
1.eclipse上の選択フォルダを取得する
execute(ExecutionEvent event) { //で ISelection currentSelections = HandlerUtil.getCurrentSelection(event); // 選択取得
// ISelection 継承したインターフェースは現在はIStructuredSelectionだけ
// 配下はiterator()で回すとObject型でとれる
IStructuredSelection sSelection = (IStructuredSelection) currentSelections;
for (Iterator iterator = sSelection.iterator(); iterator.hasNext();) {
// オブジェクトをキャストして選択を取得
IFolder selectedFolder = (IFolder) selectedObj;
とれるものは下のもの。
/**
* Type constant (bit mask value 1) which identifies file resources.
*
* @see IResource#getType()
* @see IFile
*/
public static final int FILE = 0x1;
/**
* Type constant (bit mask value 2) which identifies folder resources.
*
* @see IResource#getType()
* @see IFolder
*/
public static final int FOLDER = 0x2;
/**
* Type constant (bit mask value 4) which identifies project resources.
*
* @see IResource#getType()
* @see IProject
*/
public static final int PROJECT = 0x4;
ルートはIResourceの方にあるけどC:\のようなファイルシステム上のルートを表すので
ワークベンチの選択では飛んでこない(はず。。)
/**
* Type constant (bit mask value 8) which identifies the root resource.
*
* @see IResource#getType()
* @see IWorkspaceRoot
*/
public static final int ROOT = 0x8;
eclipse起動直後の何も選択していない状態はnullでなく空のイテレーターだった。
2.ファイル一覧を取得する
IFolder extends IContainer extends IResourceで
(意味はあとで見てもわかるはず。親の親)
IContainer.members()で直下のリソース(フォルダ内なのでフォルダかファイル)が取得できる
直下のみなので配下一覧を取得する場合は再帰処理
private void getFileList(IFolder tartgetFolder, List fileList) throws CoreException {
{
assert tartgetFolder != null;
assert fileList != null;
}
IResource[] members = tartgetFolder.members();
for(IResource currentResource : members ){
if( currentResource.getType() == IResource.FOLDER ) {
getFileList( (IFolder)currentResource, fileList);
} else if(currentResource.getType() == IResource.FILE ){
IFile currentFile = (IFile)currentResource;
if(isCopyTarget(currentFile)) fileList.add( currentFile );
}
}
}
3.既存ファイルを削除する
currentFile.delete(true, null);
で削除。
一個目の引数はファイルシステムと同期できていない場合に削除するか
二個目の引数はモニター(?)を使うためのもの。進捗状況ビュー???
private void deleteOldImages(IContainer tartgetFolder) throws CoreException {
IResource[] members = tartgetFolder.members();
for(IResource currentResource : members){
if( currentResource.getType() != IResource.FILE ) continue;// リソースの種類
IFile currentFile = (IFile)currentResource;
if( this.isRemoveTarget(currentFile) )
currentFile.delete(true, null);
}
}
4.ファイルをコピーする
コピーしたいファイルオブジェクトの、コピーメソッドを呼び出す。
引数のバージョンはあるけど使ったのは以下。
currentFile.copy(targerFolderPath.append(sbFileName.toString()), true, null);
第一引数はファイルのパスオブジェクト(IPath )
パスオブジェクトは
IResource.getFullPathでプロジェクト名を起点としたパス
IResource.getLocationはローカルのファイルシステムを起点としたパス(c:\~)
第二引数はファイルシステムと同期できていない場合に削除するか
第三引数はモニター(?)を使うためのもの。進捗状況ビュー???
IResource.getFullPath
IResource.getLocation
※↓の定数はAPIのでなく自分で宣言したもの
private void copyTargetFileList(IContainer tartgetFolder, List targetFileList) throws CoreException {
StringBuffer sbFileName = new StringBuffer();
IPath targerFolderPath = tartgetFolder.getFullPath();
for( IFile currentFile: targetFileList ){
String[] segmentArray = currentFile.getFullPath().removeFirstSegments(SEGMENT_INDEX_DRAWABLE + 1 ).segments();
for( int arrayIndex = 0 ; arrayIndex < segmentArray.length; arrayIndex++){
sbFileName.append(segmentArray[arrayIndex]);
if( arrayIndex != segmentArray.length -1 ) sbFileName.append(FILE_DELIMITER);
}
currentFile.copy(targerFolderPath.append(sbFileName.toString()), true, null);
sbFileName.delete(0, sbFileName.length());
}
}
Fileに色々な属性があるので、この通りに動かないことも多いけどベースはこんな感じで。