Android SDKでフォルダ内のファイルをソートして列挙する

test130_01.png
フォルダ内のファイル一覧は「File[] files = new File(strPath) .listFiles();」のような感じで簡単に習得できる。しかしこうやって取得したファイル配列は名前順に並んでいないし、隠しファイルや隠しフォルダも含まれている。

今回は隠しファイル/隠しフォルダを省き、さらにソートした状態のファイル配列を取得できる関数を作成した。
package com.Test130;

import java.io.File;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;

public class Test130Act extends Activity
{
	@Override
	public void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		File[]	aFiles = GetFileList("/system/lib/");

		for(File file : aFiles)
		{
			if(file.isDirectory())
				Log.d("Test130","Found : " + file.getAbsolutePath() + "/");
			else
				Log.d("Test130","Found : " + file.getAbsolutePath());
		}
	}


	//
	//パスで指定されたフォルダ内のファイル/フォルダをソートして返す
	//
	public	File[]	GetFileList(String strPath)
	{
		//ソート用の独自オブジェクトクラス ここでしか使わないから関数内で無理やり宣言
		final class Data
		{
			private File _data;

			public Data(File data)
			{
				_data = data;
			}

			public	File	getFile()
			{
				return	_data;
			}
			
			public	int	Compare(Data cmp)
			{
				String	str1 = _data.getAbsolutePath();
				String	str2 = cmp._data.getAbsolutePath();

				if(cmp == null || cmp._data == null || _data == null)
					return	0;
				
				if(_data.isDirectory() == cmp._data.isDirectory())
					return	str1.compareToIgnoreCase(str2);
				if(_data.isDirectory())
					return	-1;
				return	1;
			}
		}

		//ソート用比較関数  ここでしか使わないから関数内で無理やり宣言
		final class DataComparator implements java.util.Comparator
		{
			public int compare(Object o1, Object o2)
			{
				return	((Data)o1).Compare((Data)o2);
			}
		}
		
		
		//strPathをファイルオブジェクトにする
		File	file = new File(strPath);

		//strPathがファイルだったらそのファイルが含まれるフォルダを処理対象とする
		if(file.isFile())
		{
			file = file.getParentFile();
			if(file == null)
				return	null;
		}

		int		i;
		File[]	afTmp;

		//フォルダ内のファイル配列を取得
		afTmp = file.listFiles();
		if(afTmp == null || afTmp.length == 0)
			return	null;
		
		//一度独自オブジェクトのリストに変換して、、、
		java.util.ArrayList	alist = new java.util.ArrayList();
		for(i = 0; i < afTmp.length; i++)
		{
			if(afTmp[i].isHidden() == false)	//隠しファイル/フォルダは無視
				alist.add(new Data(afTmp[i]));
		}

		//オブジェクトリストからオブジェクト配列に変換
		Object[]	aObject = alist.toArray();

		//javaのオブジェクト用メソッドを使ってソート
		java.util.Arrays.sort(aObject,new DataComparator());

		//オブジェクト配列からファイル配列に変換
		afTmp = new File[aObject.length];
		for(i = 0; i < aObject.length; i++)
			afTmp[i] = ((Data)aObject[i]).getFile();

		return	afTmp;
	}
}

test130_02.png
これで指定したフォルダ内のファイルとフォルダがソートされた状態でログに出力された。




プロジェクトファイルをダウンロード


カテゴリー「android」 のエントリー