質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.79%

Android端末におけるファイルパス文字数の上限値

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,970

Alice0225

score 190

現在、端末内の写真を使用するアプリを作成しています。
アプリ作成に際してのOS仕様の確認にあたり、
「Android端末において、OSでどの深さのフォルダ階層まで扱うことができるか(ファイルパスの長さの上限はいくつか)」
を調べておりますが、「上限はない」「ファイル名を含めて255文字」「ファイル名を含めて260文字」等様々な情報があり、どれが本当なのかの判断がつかない状況です。
実際にAndroid端末上で動作を確認したところ、255、260を超えても問題なく扱うことができている為、「上限はない」が正解なのかと思っています。
上記につきまして、公式に記載されているサイトなどありませんでしょうか。
ご存知の方がいらっしゃいましたらご教授いただけますと幸いです。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

公式に「Androidでは最大N文字のPATH名をサポートしている」と記載してるものは無いと思われます。

Androidのファイルシステムは種類によって長大なPATH文字列を許すのだけれど、ファイルやPATHを取り扱うランタイムライブラリがサポートしきれていないので、実質4096バイト(場合によって文字)未満で使うこと」と言うのが、私のこの回答の結論です。

ファイルのPATH文字数とは、この場合ファイルが存在するディレクトリ名を含んだ、ファイル名のフルPATH名を指すことと思いますが、最終的にはファイルシステムがそのディレクトリ名とファイル名を格納できるサイズが上限となります。Androidが扱うファイルシステムは ext4ファイルシステムやSDカードで使うexFAT等ですが、これらはそれぞれ、収納できるサイズが違います。

  1. ext4
    wikipedia - ext4 filesystem
    ファイル名は255バイト、サブディレクトリ数は無制限。
    私自身、Linux(Ubuntu16.04)上で確認しましたが、ディレクトリ名も最大255バイトです。

  2. exFAT
    wikipedia - exFAT
    ファイル名は255文字

Microsoft Docs - File System Functionality Comparison
こちらの記述にはPATH長として32,760文字との記載がある

ext4がファイル名とディレクトリ名がそれぞれ単独で255バイト、ディレクトリ数は制限がありませんので、理論的に考えるとディレクトリを掘り進めることでPATHの長さに制限が無くなります。外部ストレージで使われるであろうexFATは、ファイル名が255文字、PATH名は32,760文字です。尚、ext4 ではバイト単位、exFATは文字(UNICODE UTF-16)単位と言う点も注意する必要があります。

ここから話が少し複雑になりますが、実際にファイルやディレクトリを操作する為にファイルシステムにアクセスする際、AndroidアプリはAndroid Runtimeを介し、linuxのシステムコールへと行き着きます。内部の詳細は私自身も把握している訳ではありませんが、その途中でC言語ベースで作られたコードがあり、それらはPATH名の最大長として適時、ヘッダーファイル limits.h で定義されるPATH_MAXマクロを使っているものと思われます。AndroidのOSカーネルはLinuxベースですが、そのLinux上で使う場合のlimits.hにおけるPATH_MAXは以下のようになっていて、末端のNULL文字を入れて最大で4096バイトです。

/* limits.h */
#define PATH_MAX 4096 /* 末端のNULLを含むPATH名 */

ランタイムライブラリでは、ディレクトリとファイル名はそれぞれ255バイト、組み合わせて4095バイト以下のPATH長で扱われる可能性がある、ということを示唆していると思います。

実際 Nexus 6P (Android 6.0, APIレベル23)のAndroidエミュレーター上で確認してみました。アプリ用のデータディレクトリ /data/user/0/<パッケージ名>/app_<アプリ名>... 下にディレクトリを作成すると、4096バイト以上のPATHとなるディレクトリを作成することはできませんでした。Javaの文字はUNICODE(UTF-16)ですので、もしPATH名に例えば日本語を使ってしまうと4096文字未満にもなりえます。あくまで私の推測ですが、4096と言うのは前述したようにランタイムの制限だと思われます。

AndroidのAPI(JavaのFile API)ではカレントディレクトリを変えることはできませんので、カレントディレクトリを変更しつつ相対PATH指定でディレクトリを掘り進めることはできず、その為、実質的に取り扱えるPATH長としては4095バイトが最大であるかな、と言う訳です。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.79%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る