Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 文件的listFile()不使用文件中的链接_Java_Android_File - Fatal编程技术网

Java 文件的listFile()不使用文件中的链接

Java 文件的listFile()不使用文件中的链接,java,android,file,Java,Android,File,我试图通过File.listFiles()从中创建数组Files[]currentDir的文件包含一个子目录,该子目录恰好是一个链接(请参见下面的图像链接) 在我试图创建currentDir的活动中,我试图在之后设置它的长度,但我得到了NullpointerException:trument to get length of null array 相应的代码: File directory = new File("/storage/self") currentDir = directory.li

我试图通过
File.listFiles()
从中创建数组
Files[]currentDir
文件包含一个子目录,该子目录恰好是一个链接(请参见下面的图像链接)

在我试图创建
currentDir
的活动中,我试图在之后设置它的长度,但我得到了
NullpointerException:trument to get length of null array

相应的代码:

File directory = new File("/storage/self")
currentDir = directory.listFiles();
...

for(File mFile:currentDir){...}
以下是指向我的图像的链接:

使用调试器,我发现,
currentDir
确实是空的(null)

我的猜测是,这是因为目录
primary
实际上是一个链接

我找到了以下线索,并尝试实施这些建议:

我试过:

File directory = directory.getCanonicalFile();
String[] files = directory.listFiles();
我试着:

...

String mPath = null;
            try {
                mPath = directory.getCanonicalPath();
            } catch (IOException e) {
                e.printStackTrace();
            }

    File[] currentDir = null;

    Path dirPath = Paths.get(mPath);

    if (Files.isSymbolicLink(dirPath)) {
        Path[] files = null;

        try {
            dirPath = Files.readSymbolicLink(dirPath);
            files =  Files.list(dirPath).toArray(size -> new Path[size]);
            currentDir = new File[files.length];

            for(int i = 0; i <files.length; i++){
                currentDir[i] = files[i].toFile();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    else{
        currentDir = directory.listFiles();
    }

...

for(File mFile:currentDir){...}
。。。
字符串mPath=null;
试一试{
mPath=directory.getCanonicalPath();
}捕获(IOE异常){
e、 printStackTrace();
}
文件[]currentDir=null;
路径dirPath=Path.get(mPath);
if(Files.isSymbolicLink(dirPath)){
Path[]files=null;
试一试{
dirPath=Files.readsymbolicink(dirPath);
files=files.list(dirPath).toArray(大小->新路径[size]);
currentDir=新文件[files.length];

对于(int i=0;i,
listFiles
返回空值的原因似乎有很多,即使它不是目录,也不存在

查看其代码时,它会询问
SecurityManager
该应用程序是否有权访问该文件夹,并且由于移动应用程序通常在使用手机时受到很大限制(例如,访问或修改个人信息、联系人等),因此,如果这是问题所在,也就不足为奇了


这就是阻止您的代码在此工作的原因,我认为您需要添加任何必要的代码,以便应用程序向用户请求访问这些资源的权限。

您是否尝试过创建新文件(“/storage/self”)。exists()
,看看这是否是真的……我不知道也许还有更基本的东西在这里不起作用。请注意,可以使用备用根目录执行进程,因此在资源管理器中可以看到预期的结构这一事实并不保证您的程序会看到它。我刚刚测试了它,并且是的,它是存在的。如果它不存在,那会很奇怪,因为在我对它应用
listFiles()
之前,我是通过
listFiles()
检索它的。但是谢谢你的想法!我想知道是否存在权限问题,也许你没有这个目录的读取权限?关于
directory.canRead()呢
然后呢?即使我添加了
directory.canRead()`仍然返回false。这正常吗,我必须实现许可请求吗?我无能为力,因为我没有这方面的专业知识……如果/storage/self是一个超出限制的特殊位置(除非您已将设备根目录化)那么你就不走运了。也许你正在尝试的用户权限方法还可以……但是如果你想一想,应用程序会给自己做事情的权限是没有意义的,应该发生的是,应用程序容器会问用户他是否可以做这样那样的事情……也许你正在修改的配置会导致该查询可能会发生,但我猜由于您的请求,因此不起作用。可能有问题。
android:name=“android.permission.WRITE\u external\u STORAGE”/code>和
都在清单文件中,但
ContextCompat.checkSelfPermission()
返回的值仍然为false。这是我所能帮助的。请进一步处理(任何人):就权限未完全处理而言,回答者是正确的。现在,我获得了在外部存储器上写入和读取的权限,我可以成功地检查它,但即使这样做有效,并且我可以证明
文件
目录
,它仍然无法通过
目录读取。canRead()
。这让我认为这不是权限问题,这又回到了我最初的问题。我不确定这是否正确……canRead()是否返回false?如果是,这可能仍然是权限问题,因为在现有目录上canRead()返回false的方式是有限的(请查看canRead)()以找出答案)。如果这是真的,则意味着您获取权限的尝试(事实上,这些配置更改)根本不起作用,无论原因是什么。请注意,文件系统读取权限不能确保从Java VM中读取权限,因为SecurityManager可能会限制(而且会限制)应用程序可能会做什么,也可能不能做什么。