0

Android のファイル システム全体のフラット リストを表示するアプリケーションを作成しました。ファイル システム全体のフラット リストは、再帰的な方法で作成されます (以下を参照)。

ここで問題があります。コードが変更されていなくても、毎回取得されるパスの総数が異なる場合があります (たとえば、結果は ± 100 パス前後で異なります)。この問題は、mLevelLimitが > 0 に設定されている場合 (つまり、再帰が実行されている場合) にのみ発生することに注意してください。

private int mLevelLimit = 3; // the depth of the path to display
private int mLevelCount = 0;

private FileFilter mDirectoriesFilter = new FileFilter() {
    public boolean accept(File file) {
        return file.isDirectory();
    }
};

/**
 * Get entire system folder list.
 * 
 * @param parentDirectory
 *            the root directory
 */
private List<File> getFoldersList(File parentDirectory) {
    ArrayList<File> folderList = new ArrayList<File>();
    File[] files = parentDirectory.listFiles(mDirectoriesFilter);

    if (files != null) {
        for (File file : files) {
            folderList.add(file);

            if (mLevelCount < mLevelLimit) {
                mLevelCount++;
                folderList.addAll(getFoldersList(file));
                mLevelCount--;
            }
        }
    }

    return folderList;
}

File.listFiles() API に関する既知の問題が報告されているかどうかを検索してみましたが、結果が見つかりませんでした。代わりに、再帰的な方法に何か問題があるのではないかと思っています。どんな助けでも大歓迎です。ありがとう!

4

2 に答える 2

0

File.listFiles() メソッドから返された長さ/サイズの不一致の根本原因を発見しました。この変動は、システム フォルダが実行時に変更されることが原因で発生します (たとえば、/proc/31683 フォルダがある瞬間に、このフォルダがシステムによって削除された場合など)。言い換えれば、私のコードのオリジナルは完全に正常に機能しています。ありがとう。

于 2013-05-09T01:12:24.890 に答える
0

File.listFiles()のドキュメントによると、

結果の配列内の名前文字列が特定の順序で表示されるという保証はありません。特に、アルファベット順に表示されるとは限りません。

したがって、再帰は、実行するたびにおそらく異なるパスをたどります。目的の効果を得るためlistFiles()に、反復の前に取得した配列をソートすることができます。

于 2013-05-08T07:22:49.923 に答える