繁体   English   中英

当您不是文件所有者时,Java File.setLastModified() 在 Linux 上失败

[英]Java File.setLastModified() fails on Linux when you are not the file owner

我有一个 java jar 文件,它使用 File.setLastModified() 通过引用 /mnt/nxx/file.name 为文件设置特定时间戳。 当文件由与运行 java 进程的登录用户相同的 UID 拥有时,它可以正常工作。 但如果登录用户是任何其他 UID,它就会失败。

该文件托管在外部 USB 驱动器上,该驱动器格式化为在引导时通过 /etc/fstab 安装在 Raspberry Pi 上的 Ext4 文件系统,使用:

/dev/sdb1 /mnt/nxx ext4 defaults 0 2

同一网络上的 Ubuntu 主机,并在引导时通过 /etc/fstab 使用:

192.168.x.x:/mnt/nxx /mnt/nxx nfs rw 0 1

只要登录的用户与 Pi 上的 UID 相同,也可以成功设置时间戳。

但是,通过 Samba 连接到同一磁盘(映射为 N:\ 到 \RASPI\root\mnt)并运行相同的 java 代码的 Windows-10 主机可以成功地为任何文件设置时间戳,而不管文件所有者如何声称由 Pi。

有问题的文件具有 777 权限,并且正如预期的那样,我家庭网络中任何主机上的任何用户都可以成功修改该文件。 The only issue is that the java call to setLastModified() fails when the UID of the user on the Linux hosts doesn't match the file owner -- even if the user java process is running with the same GID as the file.

我的目标是能够通过任何方法挂载磁盘并在我的家庭网络中的所有主机之间共享它,以便我家庭网络上的 Windows 和 Linux 主机可以使用 Z93F725A07423FE1C8846F448B33D2F 代码成功操作

为什么 Windows-10 无论用户如何都能成功操作时间戳,而 Linux 不能? 有没有办法让我在各种 fstab 挂载指令、smb.conf 或其他地方添加/配置选项来配置磁盘,以便 Linux 的行为方式与 Windows 的行为方式相同?

顺便说一句:使用 NTFS 文件系统格式化的外部安装的 HDD 也存在同样的问题。 我还没有尝试使用 NTFS 驱动器进行用户映射。

任何帮助,将不胜感激。

连续波

以下是针对遇到此问题的人的一些进一步信息,我相信即使潜在问题似乎仍然存在,也可以提供可行的解决方法。

仅当 (1) 所讨论的文件不属于正在运行的 java 进程的 UID 时,问题才会出现(注意:文件读/写权限不是这里的问题,重要的是文件所有权,)和( 2) 有问题的文件所在的磁盘卷安装在与文件所有者不同的 UID 下。 在这些情况下,java 无法按预期设置 Last-Modified 时间。

如果磁盘安装为 CIFS 或使用与文件所有者匹配的 UID,则 java 可以成功管理时间戳。

此外,此问题仅在 Linux 主机上出现。 无论文件所有权或文件系统如何,Windows 主机似乎都不会出现此问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM