为什么 TRUNCATE_EXISTING 无法通过 Ubuntu 在 SMB 上工作?

问题描述 投票:0回答:1

我有一个 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
}

为什么会出现这种情况?

java linux ubuntu nio samba
1个回答
0
投票

为什么会出现这种情况?

您正在比较的两个操作并不等同。尽管 Windows 和 Linux 之间的细节有所不同,但修改文件的内容(包括将其截断为长度为零)与删除同一文件是不同的操作,需要不同的权限:

  • 在 Unix 中,截断现有文件需要文件write 权限,而从目录中删除它需要目录write 权限。

  • 在 Windows / NTFS 中,您需要文件的

    写入数据 权限才能修改该文件的内容(包括截断它),但您需要文件的 删除 权限 删除子文件夹和文件其目录将其删除。

由于您被拒绝截断文件,因此您一定没有对文件执行过

write / Write Data 操作。由于您能够删除它,因此您很可能在目录上具有 write / Delete Subfolders and Files,但也有可能您在文件上具有 Delete(但不是 Write Data)。

© www.soinside.com 2019 - 2024. All rights reserved.