Android 디렉토리에 파일을 나열하는 방법은 무엇입니까?


120

지금까지 내 코드는 다음과 같습니다.

String path = Environment.getExternalStorageDirectory().toString()+"/Pictures";

        AssetManager mgr = getAssets();

        try {

            String list[] = mgr.list(path);
            Log.e("FILES", String.valueOf(list.length));

            if (list != null)
                for (int i=0; i<list.length; ++i)
                    {
                        Log.e("FILE:", path +"/"+ list[i]);
                    }

        } catch (IOException e) {
            Log.v("List error:", "can't list" + path);
        }

그러나 그 디렉토리에 파일이 있지만 list.length = 0을 반환합니다. 어떤 아이디어가 있습니까?

답변:


328

파일에 액세스하려면 매니페스트 파일에 권한을 부여해야합니다.

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

이 시도:

String path = Environment.getExternalStorageDirectory().toString()+"/Pictures";
Log.d("Files", "Path: " + path);
File directory = new File(path);
File[] files = directory.listFiles();
Log.d("Files", "Size: "+ files.length);
for (int i = 0; i < files.length; i++)
{
    Log.d("Files", "FileName:" + files[i].getName());
}

7
고마워 Yury, 이상하게도 file.length는 NullPointerException을 제공합니다 ... 어떤 아이디어가 있습니까? Spasibo!
Roger Travis

8
지정된 폴더에 파일이 없다고 생각합니다. file []에서 null을 확인하십시오. 널이면 결과가없고 file.length로 인해 예외가 발생합니다.
Yury

4
"/"가 누락 된 것 같습니다. :) 감사합니다!
Roger Travis

1
매력처럼 작동했습니다! 내 모바일은 Moto G4, Android N 입니다. 누군가 직면하고 있다면 can't play video error. 모바일로 이동 settings --> apps --> your app --> permissions --> enable storage. 해야합니다.이 오류가 발생하면 수동으로 수행해야합니다. <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />매니페스트에 있는지 확인하십시오 . 직면 한 사람들을 위해 NullPointerException-앱의 내부 저장소에있는 개인 파일에 액세스하려고합니다. 죄송합니다. 그렇게 할 수 없습니다.
coderpc

fileList (). clear (); 같은 것이 있습니까? 그래서이 방법을 재사용 할 수있다
user55924

44

나는 방금 발견했다 :

new File("/sdcard/").listFiles() 다음이 없으면 null을 반환합니다.

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

AndroidManifest.xml 파일에서 설정합니다.


6
이게 진실이라는 건 알지만 ...이게 대답인가요? 아니면 댓글이어야합니까?
Joaquin Iurchuk 2015

7
또한 Android 6.0 이상에서는 설정-> 앱-> 앱-> 권한에서 권한을 부여해야합니다.
vt.

1
디렉토리가 비어있는 경우에도 NULL을 반환
Hitesh Sahu

11

음, APK 파일 안에 AssetManager있는 assets폴더 내의 파일을 나열 합니다. 따라서 위의 예에서 나열하려는 것은 [apk] / assets / sdcard / Pictures입니다.

assets응용 프로그램 내부의 폴더에 그림을 넣고 Pictures디렉토리에 있으면 mgr.list("/Pictures/").

반면에 APK 파일 외부에있는 sdcard의 파일이 Pictures폴더에있는 경우 다음 File과 같이 사용 합니다.

File file = new File(Environment.getExternalStorageDirectory(), "Pictures");
File[] pictures = file.listFiles();
...
for (...)
{
log.e("FILE:", pictures[i].getAbsolutePath());
}

문서의 관련 링크 :
File
Asset Manager


"File [] pictures = file.listFiles ();"시도했지만 NullPointException도 제공합니다 ... 흠 ...
Roger Travis

1
"/"가 누락 된 것 같습니다. :) 감사합니다!
Roger Travis

1
내 하루 :) 절약 주셔서 감사합니다
에드 나자르 모하메드를

@SyedNazarMuhammad 하. 그리고 내 친구를 구 해주셔서 감사합니다. D : 항상 긍정적 인 발언 즐길
리드

11

위의 모든 답변 외에도 :

Android 6.0 이상 (API 레벨 23 이상)을 사용하는 경우 외부 저장소에 대한 액세스 권한을 명시 적으로 요청해야합니다. 단순히 갖는

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

매니페스트에서 충분하지 않습니다. 또한 활동에 대한 권한을 적극적으로 요청했습니다.

//check for permission
if(ContextCompat.checkSelfPermission(this,
            Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_DENIED){
    //ask for permission
    requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, READ_EXTERNAL_STORAGE_PERMISSION_CODE);
}

나는 이것을 읽는 것이 좋습니다 : http://developer.android.com/training/permissions/requesting.html#perm-request


2

귀하는 path자산 폴더 내에 있지 않습니다. 를 사용하여 자산 폴더 내의 파일을 열거 AssetManager.list()하거나 다음을 통해 SD 카드의 파일을 열거합니다.File.list()


1
String[] listOfFiles = getActivity().getFilesDir().list();

또는

String[] listOfFiles = Environment.getExternalStoragePublicDirectory (Environment.DIRECTORY_DOWNLOADS).list();

1

이 시도:

public class GetAllFilesInDirectory {

public static void main(String[] args) throws IOException {

    File dir = new File("dir");

    System.out.println("Getting all files in " + dir.getCanonicalPath() + " including those in subdirectories");
    List<File> files = (List<File>) FileUtils.listFiles(dir, TrueFileFilter.INSTANCE, TrueFileFilter.INSTANCE);
    for (File file : files) {
        System.out.println("file: " + file.getCanonicalPath());
    }

}

}

1

다음 두 가지가 발생할 수 있습니다.

  • READ_EXTERNAL_STORAGE권한을 추가하지 않습니다.AndroidManifest.xml
  • Android 23을 타겟팅하고 있으며 사용자에게 해당 권한을 요청하지 않습니다. Android 22로 이동하거나 사용자에게 해당 권한을 요청합니다.

0

이것을 시도하십시오

 String appDirectoryName = getResources().getString(R.string.app_name);
    File directory = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/" + getResources().getString(R.string.app_name));
    directory.mkdirs();
    File[] fList = directory.listFiles();
    int a = 1;
    for (int x = 0; x < fList.length; x++) {

        //txt.setText("You Have Capture " + String.valueOf(a) + " Photos");
        a++;
    }
    //get all the files from a directory
    for (File file : fList) {
        if (file.isFile()) {
            list.add(new ModelClass(file.getName(), file.getAbsolutePath()));
        }
    }

0

Android 10 / Q를 사용 중이고 외부 저장소를 읽기위한 액세스 권한을 요청하기 위해 모든 올바른 작업을 수행했지만 여전히 작동하지 않는 경우이 답변을 읽어 볼 가치가 있습니다.

Android Q (10)는 모든 저장소에 대한 액세스 권한을 요청합니다. 범위가 지정된 저장소

나는 작동하는 코드를 가지고 있었지만, 네트워크 연결에있을 때 (보통 연결이없는 상태 였을 때) 장치가 자동으로 업데이트했습니다. Android 10에서는 파일 액세스가 더 이상 작동하지 않았습니다. 코드를 다시 작성하지 않고 쉽게 수정할 수있는 유일한 방법은 설명 된대로 매니페스트에 추가 속성을 추가하는 것입니다. 이제 파일 액세스가 Android 9에서와 같이 다시 작동합니다. YMMV, 아마도 향후 버전에서 계속 작동하지 않을 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.