首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当您不是文件所有者时,Java File.setLastModified()在Linux上会失败。

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

Stack Overflow用户
提问于 2020-04-03 19:43:14
回答 1查看 291关注 0票数 1

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

该文件托管在外部U盘上,该驱动器使用以下命令在引导时通过/etc/fstab挂载在Raspberry Pi上并使用Ext4文件系统格式化:

代码语言:javascript
复制
/dev/sdb1 /mnt/nxx ext4 defaults 0 2

同一网络上的Ubuntu主机,它在引导时通过/etc/fstab使用以下命令挂载相同的磁盘:

代码语言:javascript
复制
192.168.x.x:/mnt/nxx /mnt/nxx nfs rw 0 1

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

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

所讨论的文件具有777权限,不出所料,我的家庭网络中任何主机上的任何用户都可以成功修改该文件。唯一的问题是,当Linux主机上用户的UID与文件所有者不匹配时,对setLastModified()的java调用就会失败--即使用户java进程使用与文件相同的GID运行也是如此。

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

为什么无论用户是谁,Windows-10都能成功地操作时间戳,而Linux却不能?有没有办法在各种fstab mount指令中、在smb.conf或其他地方添加/配置选项来配置磁盘,使Linux的行为与Windows一样?

顺便说一句:使用NTFS文件系统格式化的外部挂载硬盘也存在同样的问题。我尚未尝试使用NTFS驱动器进行用户映射。

任何帮助都将不胜感激。

cw

EN

回答 1

Stack Overflow用户

发布于 2020-04-15 19:46:35

对于那些遇到这个问题的人,这里有一些进一步的信息,我相信这些信息提供了一个可行的变通办法,即使潜在的问题似乎仍然存在。

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

如果磁盘作为CIFS挂载,或者挂载在与文件所有者的UID匹配的UID下,则java可以成功管理时间戳。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61011124

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档