8

我想使用 Java 代码为图像文件赋予权限模式值“777”。我怎么能用Java给它呢?因为我无法删除默认权限模式“664”的图像。

4

5 回答 5

9

您可以使用 'exec' 方法运行外部命令来执行 chmod。

Runtime.getRuntime().exec( "chmod 777 myfile" );
于 2009-06-12T14:13:45.627 回答
8

您可以创建与文件关联的File对象,然后使用setExecutablesetReadablesetWritable更改权限。自然,如果您的程序无权更改文件的访问权限,这些操作将失败。

于 2009-06-12T14:18:02.433 回答
3

它是 NIO 包的一部分。您可以通过java.nio.file.attribute.PosixFilePermission来完成。

虽然这只是在Java 1.7中,但它已经成为一个已知问题已有一段时间了。

于 2009-06-12T14:13:37.297 回答
2

不幸的是,Java 很少抓住系统文件属性,因为它会打破 Java 的“一次编写,到处运行”的黄金法则。

事实上,当你写下你想要对文件进行 777 访问时,这显然意味着你在 unix 下。但是,例如在 Windows 下这样的请求意味着什么?

因此,要解决特定的操作系统主题,您必须使用特定的功能,这不足为奇。这是使用声称(有充分理由)“平台独立”的语言时要付出的代价

更安全的方法是使用完全实现您想要的 JNI 库。一种简单但又脏又危险的方法是使用 Runtime.getRuntime().exec("chmod 777 myFile")。

为什么危险?事实上,当调用这样的 exec("blahblah") 时会发生什么?

运行您的 java 程序的 unix 进程分叉;“重复”进程然后执行一个 shell(ksh ? csh ? bash ?? 这取决于您的 unix 配置),它试图理解和运行您的“blahblah”句子。

如果您的 jvm 实际上使用 500 MB,则分叉的进程在启动时将具有相同的大小...

然后 shell 将以与 java 进程相同的“shell 上下文”开始,即相同的 PATH、别名等。甚至“chmod”也可能是别名,因此最好调用 chmod 的完整路径(/bin/chmod、/usr/bin/chmod...这取决于 unix 风格...)。

在 shell 执行期间,您的 java 程序被冻结,如果由于任何原因 shell 挂起,您将无法解冻它。

最后,甚至不确定 java 程序的 unix 所有者是否有足够的权限来更改文件上的此类信息(例如,他可以被允许创建文件,但不能更改用户级别的权限)。

也许您尝试在 java 级别处理应该在操作系统级别解决的问题?

于 2009-06-12T15:32:19.493 回答
1

代码如下:-

List<String> chPermList = new LinkedList<String>();
chPermList.add("/bin/chmod");
chPermList.add("777");
chPermList.add(Path_to_image_file);


    public void changePermission(List chPermList)
    {
        ProcessBuilder pb = null;
        pb = new ProcessBuilder(chPermList);
                pb.redirectErrorStream(true);

                Process p = pb.start();

                BufferedReader br = new BufferedReader(new InputStreamReader(p
                        .getInputStream()));

                p.waitFor();

                if(p.exitValue()!=0)
                {
                    strExpMsg = "The permission change failed with exit value" + p.exitValue();

                }
    }
于 2010-12-21T07:28:51.730 回答