Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.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:list文件在MacOS上的外部存储上返回null_Java_Macos - Fatal编程技术网

Java:list文件在MacOS上的外部存储上返回null

Java:list文件在MacOS上的外部存储上返回null,java,macos,Java,Macos,当我尝试使用file.list()列出外部存储器上文件夹的内容时,该方法总是返回null。医生没有真正的帮助。它说: 如果此抽象路径名不表示目录,或者发生I/O错误,则返回null 在我的例子中,抽象路径名确实表示一个目录(根据Java本身),并且权限似乎很好 任何帮助都将不胜感激。到目前为止,我只找到了Android的解决方案。我正在使用macOS Big Sur 11.4(我没有linux或windows机器进行测试)和JDK 15 导入java.io.File; 导入java.util.a

当我尝试使用
file.list()
列出外部存储器上文件夹的内容时,该方法总是返回
null
。医生没有真正的帮助。它说:

如果此抽象路径名不表示目录,或者发生I/O错误,则返回null

在我的例子中,抽象路径名确实表示一个目录(根据Java本身),并且权限似乎很好

任何帮助都将不胜感激。到目前为止,我只找到了Android的解决方案。我正在使用macOS Big Sur 11.4(我没有linux或windows机器进行测试)和JDK 15

导入java.io.File;
导入java.util.array;
班长
{
公共静态void main(字符串[]args)
{
var path=“/Volumes/MyStorage”;
var file=新文件(路径);
System.out.println(“用户名:”+System.getProperty(“用户名”);
System.out.println(“文件存在:“+File.exists());
System.out.println(“文件是一个目录:”+File.isDirectory());
System.out.println(“文件列表:+Arrays.toString(file.List()));
}
}
输出:

Username: username
File exists: true
File is a directory: true
List of files: null
权限似乎很好:

$ls-la/卷/
总数0
drwxr-xr-x 4根轮128 May 29 21:08。
drwxr-xr-x 20根车轮640 2020年1月1日。。
drwxrwxr-x 13用户名职员510 5月29日20:52 MyStorage
lrwxr-xr-x 1根控制盘1 5月26日10:15 Macintosh HD->/
作为
用户名
,我可以访问MyStorage的整个结构。我可以使用
ls/Volumes/MyStorage
列出磁盘的内容

编辑: 根据注释中的要求,下面是我使用
Files.list(Path.of(Path))
获得的错误堆栈跟踪:

考虑到文件夹上的权限看起来很好,这是非常令人费解的。另外,其他语言列出文件夹也没有问题(C、Python,可能还有其他语言)。我试着在Java中作为子进程运行工作的python脚本,但它不工作(文件夹显示为空)

编辑2: 到目前为止,我一直在NetBeans中运行java应用程序。但是如果我通过shell(
java-jar myapp.jar
)运行java应用程序,那么它可以工作:

$java-jar TestApplication.jar
用户名:Username
文件存在:true
文件是一个目录:true
文件列表:[.DocumentRevisions-V100、.DS_Store、.fseventsd、.Spotlight-V100、.TemporaryItems、.Trashes、private、work]
NetBeans(仅NetBeans?)是否可能没有列出文件夹的权限

编辑3: 感谢dan1st,缩小了问题范围。当我使用
packr
打包应用程序并运行
.app
文件时,macOS要求我授权列出可移动存储(黑色矩形隐藏我的应用程序名称):


如果我单击“确定”,那么它将按预期工作。不幸的是,我们无法手动为NetBeans添加这些授权。也许这是“询问不同”的问题?

使用
文件.list(Path.of(Path))
时会发生什么?这会导致异常吗?在这种情况下,您可以共享堆栈跟踪吗?谢谢,我确实得到了一个错误。看起来像是权限问题,但它使这个问题更难理解…应用程序在哪个用户下运行?你能运行ls-la/Volumes/MyStorage吗?外部存储使用什么文件系统?如果以管理员身份运行应用程序/使用
sudo
,会发生什么情况?它与子目录一起工作吗?你能访问文件吗?谢谢你提出这些问题。如果我在NetBeans之外运行这个应用程序,它看起来是可以工作的(从没想过这会是个问题)。然而,我不明白为什么在Netbeans中(并且仅在Netbeans中)不可能列出这个列表。
java.nio.file.FileSystemException: /Volumes/MyStorage: Operation not permitted
    at java.base/sun.nio.fs.UnixException.translateToIOException(UnixException.java:100)
    at java.base/sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:106)
    at java.base/sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:111)
    at java.base/sun.nio.fs.UnixFileSystemProvider.newDirectoryStream(UnixFileSystemProvider.java:411)
    at java.base/java.nio.file.Files.newDirectoryStream(Files.java:476)
    at java.base/java.nio.file.Files.list(Files.java:3765)
    at Main.main(Main.java:22)