2011-09-02 4 views
8

"/"から始まるすべてのディレクトリをスキャンして、 "MYFOLDER"のような特定のディレクトリを探しています。しかし、このフォルダは、同じフォルダの二重のインスタンスを取得することです。これは、1つのフォルダが「/ mnt/sdcard/MYFOLDER」にあり、同じフォルダに「/ sdcard/MYFOLDER」のシンボリックリンクがあるために発生します。アンドロイド:シンボリックリンクの決定

私の質問は次のとおりです。フォルダはシンボリックリンクかどうか? "私にいくつかの提案を教えてください。..

+0

あなたは私たちのコードを示すことができますか? –

+0

ここで確認できます:http://stackoverflow.com/questions/813710/java-1-6-determine-symbolic-linksそれはあなたを助けるかもしれない! –

+0

先生、コードに特化したものは何もありません。私は非常に簡単な質問があります。 listFiles()関数を使用してディレクトリをスキャンします。ただし、/ mnt/scardと/ sdcardの2つのディレクトリがあります。 1つは他へのシンボリックリンクです。私はちょうどこれらの2つを区別する方法があるかどうかを知りたいのです..フォルダがシンボリックリンクであることを知る方法はありますか?ありがとうございます – Farhan

答えて

13

彼らは(their licenseに対象)Apache Commonsで行う方法これは本質的である:@LarsHコメントへ

public static boolean isSymlink(File file) throws IOException { 
    File canon; 
    if (file.getParent() == null) { 
    canon = file; 
    } else { 
    File canonDir = file.getParentFile().getCanonicalFile(); 
    canon = new File(canonDir, file.getName()); 
    } 
    return !canon.getCanonicalFile().equals(canon.getAbsoluteFile()); 
} 

編集感謝を。 上記のコードは、子ファイルがシンボリックリンクであるかどうかのみをチェックします。

OPの質問に答えるためには、さらに簡単です:

public static boolean containsSymlink(File file) { 
    return file.getCanonicalFile().equals(file.getAbsoluteFile()); 
} 
+0

彼らが親ファイルをチェックし、常にcanon = fileを使うのではなく、親のgetCanonicalFile()を使う理由は何ですか?パス要素が存在しない(または検索可能でない)場合、正規化をテキスト操作( "a /../ b"は "a" " 存在しない) 。"? – LarsH

+1

ああ、私はそれを得る...これは、 'file'のパスの*最後のコンポーネント*がシンボリックリンクであるかどうかを判断することです。*ファイルのパス内の任意のコンポーネント*がシンボリックリンクであるかどうかは関係ありません。私はOPの場合、後者が必要であると思います。この場合、この関数のelse節を削除します。 – LarsH

+1

@LarsH良い点!私は答えを編集しました。 – rds

関連する問題