Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Windows Java中,如何取消对文件夹及其所有内容的只读设置?_Java_Windows_File Io - Fatal编程技术网

在Windows Java中,如何取消对文件夹及其所有内容的只读设置?

在Windows Java中,如何取消对文件夹及其所有内容的只读设置?,java,windows,file-io,Java,Windows,File Io,假设我有一个文件夹C:\stuff。在stuff中,有数千个杂项文件和其他文件夹 在Windows中,我只需转到文件夹,右键单击它并单击“属性”,取消设置只读标志,然后将该操作应用于父文件夹、所有子文件夹和所有文件 但是,我希望通过在GUI中单击JButton,在Java中实现自动化。ActionListener中的代码是什么样子的?甚至有可能做到这一点吗?有什么东西我可以利用,比如让Java写入PowerShell或cmd 您可以使用,但如果您在ActionListener(或从ActionL

假设我有一个文件夹
C:\stuff
。在
stuff
中,有数千个杂项文件和其他文件夹

在Windows中,我只需转到文件夹,右键单击它并单击“属性”,取消设置只读标志,然后将该操作应用于父文件夹、所有子文件夹和所有文件

但是,我希望通过在GUI中单击
JButton
,在Java中实现自动化。
ActionListener
中的代码是什么样子的?甚至有可能做到这一点吗?有什么东西我可以利用,比如让
Java
写入
PowerShell
cmd

您可以使用,但如果您在ActionListener(或从ActionListener调用的任何方法)中这样做,则在更改文件时,应用程序将被冻结。这是因为ActionListener是在事件分派线程上调用的,该线程与键盘输入、鼠标输入和屏幕绘制是在同一线程上完成的。因此,当您在该线程中执行耗时的操作时,您的应用程序将忽略键盘输入和鼠标输入,并且如果它在视觉上被随后移动或关闭的任何其他应用程序遮挡,它将不会重新绘制自身

如果您不关心应用程序是否挂起,可以在ActionListener中执行以下操作:

Files.walkFileTree(rootDirectory, new SimpleFileVisitor<Path>() {
    @Override
    public FileVisitResult preVisitDirectory(Path dir,
                                             BasicFileAttributes attr)
    throws IOException {
        Files.setAttribute(dir, "dos:readonly", false);
        return FileVisitResult.CONTINUE;
    }

    @Override
    public FileVisitResult visitFile(Path file,
                                     BasicFileAttributes attr)
    throws IOException {
        Files.setAttribute(file, "dos:readonly", false);
        return FileVisitResult.CONTINUE;
    }
});
Files.walkFileTree(根目录,新的SimpleFileVisitor(){
@凌驾
公共文件VisitResult preVisitDirectory(路径目录,
基本文件属性(属性属性属性)
抛出IOException{
setAttribute(dir,“dos:readonly”,false);
返回FileVisitResult.CONTINUE;
}
@凌驾
公共文件VisitResult visitFile(路径文件,
基本文件属性(属性属性属性)
抛出IOException{
Files.setAttribute(文件“dos:readonly”,false);
返回FileVisitResult.CONTINUE;
}
});
但实际上,您不应该挂起事件调度线程。文件I/O应该在另一个线程中完成。有很多方法可以做到这一点,但对许多人来说似乎是最简单的:

static void updateReadOnlyInTree(final Path root,
                                 Window parentWindow) {

    SwingWorker<Void, Integer> worker = new SwingWorker<Void, Integer>() {
        @Override
        public Void doInBackground()
        throws IOException {

            Files.walkFileTree(root, new SimpleFileVisitor<Path>() {
                @Override
                public FileVisitResult preVisitDirectory(
                                                Path dir,
                                                BasicFileAttributes attr)
                throws IOException {
                    Files.setAttribute(dir, "dos:readonly", false);
                    return FileVisitResult.CONTINUE;
                }

                @Override
                public FileVisitResult visitFile(Path file,
                                                 BasicFileAttributes attr)
                throws IOException {
                    Files.setAttribute(file, "dos:readonly", false);
                    return FileVisitResult.CONTINUE;
                }
            });

            return null;
        }
    };

    final JOptionPane waitPane = new JOptionPane("Updating files\u2026",
        JOptionPane.INFORMATION_MESSAGE);
    final JDialog waitDialog = 
        waitPane.createDialog(parentWindow, "Files Update");

    worker.addPropertyChangeListener(new PropertyChangeListener() {
        @Override
        public void propertyChange(PropertyChangeEvent event) {
            if (event.getPropertyName().equals("state") &&
                event.getNewValue() == SwingWorker.StateValue.DONE) {

                waitPane.setValue(JOptionPane.CLOSED_OPTION);
            }
        }
    });

    EventQueue.invokeLater(new Runnable() {
        @Override
        public void run() {
            waitDialog.setVisible(true);
        }
    });

    worker.execute();
}
static void updateradonlyintree(最终路径根、,
窗口(父窗口){
SwingWorker worker=新SwingWorker(){
@凌驾
公共无效doInBackground()
抛出IOException{
walkFileTree(根目录,新的SimpleFileVisitor(){
@凌驾
公共文件VisitResult preVisitDirectory(
路径目录,
基本文件属性(属性属性属性)
抛出IOException{
setAttribute(dir,“dos:readonly”,false);
返回FileVisitResult.CONTINUE;
}
@凌驾
公共文件VisitResult visitFile(路径文件,
基本文件属性(属性属性属性)
抛出IOException{
Files.setAttribute(文件“dos:readonly”,false);
返回FileVisitResult.CONTINUE;
}
});
返回null;
}
};
final JOptionPane waitPane=new JOptionPane(“更新文件\u2026”,
JOptionPane.INFORMATION(信息和消息);
最终JDialog waitDialog=
创建对话框(父窗口,“文件更新”);
worker.addPropertyChangeListener(新的PropertyChangeListener(){
@凌驾
公共作废propertyChange(PropertyChangeEvent事件){
if(event.getPropertyName().equals(“状态”)&&
event.getNewValue()=SwingWorker.StateValue.DONE){
waitPane.setValue(JOptionPane.CLOSED_选项);
}
}
});
invokeLater(新的Runnable(){
@凌驾
公开募捐{
waitDialog.setVisible(true);
}
});
worker.execute();
}

您甚至可以更进一步,在更改任何文件之前对文件进行计数,然后使用a而不是JOptionPane。

请参阅@l19除非您一直在使用Java 6,否则不要再使用Java.io.File。它已经过时了。使用,而不是。