我有一个 Windows 文件服务器,它安装到位于
/mnt/DrawingsPB
的 Ubuntu 服务器上。挂载点使用 SMB 协议来管理 Windows 服务器上的文件。
我正在尝试创建一个文件并覆盖它(如果它已经存在):
private Path drawingsTargetDirectory = Paths.get("/mnt/DrawingsPB/Test");
public OutputStream getOutputStream() throws IOException {
Path directory = drawingsTargetDirectory.resolve("TestDir");
Files.createDirectories(directory);
Path path = directory.resolve("TestFile.txt");
return Files.newOutputStream(path, StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING,
StandardOpenOption.WRITE);
}
AccessDeniedException
:
Caused by: java.nio.file.AccessDeniedException: /mnt/DrawingsPB/Test/TestDir/TestFile.txt
at sun.nio.fs.UnixException.translateToIOException(UnixException.java:84) [rt.jar:1.8.0_382]
at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:102) [rt.jar:1.8.0_382]
at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:107) [rt.jar:1.8.0_382]
at sun.nio.fs.UnixFileSystemProvider.newByteChannel(UnixFileSystemProvider.java:214) [rt.jar:1.8.0_382]
at java.nio.file.spi.FileSystemProvider.newOutputStream(FileSystemProvider.java:434) [rt.jar:1.8.0_382]
at java.nio.file.Files.newOutputStream(Files.java:216) [rt.jar:1.8.0_382]
at com.company.router.drawing.impl.FileSystemStreamProvider.lambda$4(FileSystemStreamProvider.java:75) [classes:]
... 50 more
但是,如果我进行手动检查和删除而不是截断,它不会失败:
public OutputStream getOutputStream() throws IOException {
Path directory = drawingsTargetDirectory.resolve("TestDir");
Files.createDirectories(directory);
Path path = directory.resolve("TestFile.txt");
if (Files.exists(path))
Files.delete(path); // Works
return Files.newOutputStream(path, StandardOpenOption.CREATE_NEW, StandardOpenOption.WRITE); // Works
}
为什么会出现这种情况?
为什么会出现这种情况?
您正在比较的两个操作并不等同。尽管 Windows 和 Linux 之间的细节有所不同,但修改文件的内容(包括将其截断为长度为零)与删除同一文件是不同的操作,需要不同的权限:
在 Unix 中,截断现有文件需要文件的 write 权限,而从目录中删除它需要目录的 write 权限。
写入数据 权限才能修改该文件的内容(包括截断它),但您需要文件的 删除 权限 或 删除子文件夹和文件其目录将其删除。
write / Write Data 操作。由于您能够删除它,因此您很可能在目录上具有 write / Delete Subfolders and Files,但也有可能您在文件上具有 Delete(但不是 Write Data)。