如何在 android 目录中列出文件?

以下是我目前的代码:

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... ... 有什么想法吗?

272254 次浏览

要访问这些文件,必须在清单文件中给出权限。

<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());
}

您的 path不在资产文件夹中。您可以使用 AssetManager.list()枚举资产文件夹中的文件,也可以使用 File.list()枚举 SD 卡上的文件

好的,AssetManager列出了位于 APK 文件中的 assets文件夹中的文件。因此,在上面的示例中要列出的是[ apk ]/asset/sdcard/Pictures。

如果您将一些图片放在应用程序内的 assets文件夹中,并且它们位于 Pictures目录中,那么您将执行 mgr.list("/Pictures/")

另一方面,如果 sdcard 上的文件位于 APK 文件之外,在 Pictures文件夹中,那么可以这样使用 File:

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

以及相关文件的链接:
档案
资产经理

我刚发现:

new File("/sdcard/").listFiles() 如果你没有:

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

在 AndroidManifest.xml 文件中设置。

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

或者

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

试试这个:

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());
}


}


}

可能会发生两件事:

  • 您没有向您的 AndroidManifest.xml添加 READ_EXTERNAL_STORAGE权限
  • 你的目标是 Android 23,而不是向用户请求这个权限。转到 Android22或者向用户请求许可。

除了上述所有答案之外:

如果你使用的是 Android 6.0 + (API Level 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

试试这个

 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()));
}
}

如果你使用的是 Android 10/Q 系统,并且你做了所有正确的事情来请求访问权限来读取外部存储,但是它仍然不能工作,那么这个答案值得一读:

Android Q (10)请求获得访问所有存储的权限

我有工作代码,但是我的设备在网络连接时自行更新代码(通常没有连接)一旦进入 Android 10,文件访问将不再有效。要在不重写代码的情况下解决这个问题,唯一简单的方法就是按照所描述的那样向清单中添加额外的属性。现在文件访问的工作原理和 Android 9一样。YMMV,它可能不会继续工作在未来的版本。

更新工作方法

我的 minSdkversion 是21,所以我使用 ContextCompat.checkSelfPermission()方法来授予权限 分开,使其不必在清单中添加 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>。因此,为了消除 NullPointerException (尽管目标目录中有文件) ,按如下方式授予权限:-

MainActivity.java


public class MainActivity extends AppCompatActivity {
/*Other variables & constants here*/
private final int READ_EXTERNAL_STORAGE=100;


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);


// ignore the button code


Button btn = (Button) findViewById(R.id.button);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
openWebView();
}
});
    



/*---------------------------- GRANT PERMISSIONS START-------------------------*/
// Main part to grant permission. Handle other cases of permission denied
//   yourself.
if(ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED)
ActivityCompat.requestPermissions(this,new String[] {Manifest.permission.READ_EXTERNAL_STORAGE},READ_EXTERNAL_STORAGE);


/*---------------------------- GRANT PERMISSIONS OVER-------------------------*/
}


以及列出所有文件(在 MainActivity.java 中)的函数,这要感谢 @ Yury:-
public void getDownloadedFile() {
String path = Environment.getExternalStorageDirectory().toString()+"/Download/";
Log.d("Files", "Path: " + path);
File directory = new File(path);
File[] files = directory.listFiles();
if(directory.canRead() && files!=null) {
Log.d("Files", "Size: " + files.length);
for(File file: files)
Log.d("FILE",file.getName());
}
else
Log.d("Null?", "it is null");
}

Yury 的回答需要对新版本的 Android 做一些阐述。

首先,确保在清单文件中定义了 READ _ EXTERNAL _ STORAGE 读取 _ 外部存储权限。

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

对于大于或等于 Android10(Q)的 SDK,请包括以下内容。

<application android:requestLegacyExternalStorage="true"...</application>

现在可以列出目录中的文件。

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());
}

对于人们仍然得到 NullPointerException时,他们尝试获取文件列表,如果你使用安卓 API 29+然后你需要添加

<application android:requestLegacyExternalStorage="true"...

在你的 AndroidManifest.xml文件中。

然后再次请求存储权限。

在特定文件夹中列出 android 设备中的文件的简单方法

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

在科特林

val fileRoot = Environment.getExternalStorageDirectory()
val yourDir = File(fileRoot, "FOLDER_NAME")
for (f in yourDir.listFiles()!!) {
if (f.isFile){
print(f.name)
}
}

所有的文件名都将以文件扩展名打印出来