当我尝试通过jetty删除debian中的文件时,我得到了一个FileSystemException。请注意,文件的所有者是mysql,因为在此操作之前我已经使用mysql完成了一个导出,并且该文件存在于debian中的**/tmp文件夹中。现在当我尝试使用Java删除该文件时,我得到了一个FileSystemException**,并说不允许操作。以下是我的代码。
String filePath = "tmp/test.csv";
try {
Files.deleteIfExists(Paths.get(filePath));
} catch (IOException e) {
e.printStackTrace();
}
这是堆栈跟踪。
java.nio.file.FileSystemException: /tmp/test.csv: Operation not permitted
at sun.nio.fs.UnixException.translateToIOException(UnixException.java:91)
at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:102)
at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:107)
at sun.nio.fs.UnixFileSystemProvider.implDelete(UnixFileSystemProvider.java:244)
at sun.nio.fs.AbstractFileSystemProvider.deleteIfExists(AbstractFileSystemProvider.java:108)
at java.nio.file.Files.deleteIfExists(Files.java:1165)
我假设这个错误是由于文件的所有者是mysql。我还试图在删除文件之前将文件的所有者更改为jetty,但仍然以相同的错误结束。
Path path = Paths.get(filePath);
UserPrincipalLookupService lookupService = FileSystems.getDefault().getUserPrincipalLookupService();
UserPrincipal jetty = lookupService.lookupPrincipalByName("jetty");
try {
Files.setOwner(path, jetty);
}catch(FileSystemException fe) {
fe.printStackTrace();
}
我还尝试了另一种方法,但再次结束了同样的错误。
Path path = Paths.get(filePath);
FileOwnerAttributeView view = Files.getFileAttributeView(path, FileOwnerAttributeView.class);
UserPrincipal hostUid = path.getFileSystem().getUserPrincipalLookupService().lookupPrincipalByName("jetty");
try {
view.setOwner(hostUid);
}catch(FileSystemException fe) {
fe.printStackTrace();
}
我可以删除这个文件吗?任何帮助将不胜感激。
谢谢
1条答案
按热度按时间s5a0g9ez1#
正如@JoakimErdfelt在评论中提到的,问题是**/tmp文件夹中设置了sticky位**,这阻止了另一个用户删除文件(在本例中为jetty)。如果我使用chmod -t /tmp删除了sticky位,则可以删除文件。
更多详细信息请访问Why does Files.delete throw a FileSystemException
这里是Linux Sticky Bit Concept Explained with Examples