簡體   English   中英

在Windows Java中,如何取消設置只讀文件夾及其所有內容?

[英]In Windows Java, how do I unset read only from a folder and all its contents?

說我有一個文件夾C:\\stuff stuff ,有成千上萬個其他文件和其他文件夾。

在Windows中,我只需要轉到該文件夾​​,右鍵單擊它,然后單擊屬性,取消設置只讀標志,然后將該操作應用於父文件夾,所有子文件夾和所有文件。

但是,我想通過在GUI中單擊JButton來在Java中自動執行此操作。 ActionListener的代碼是什么樣的? 甚至有可能這樣做嗎? 有什么可以利用的東西,例如使Java寫入PowerShellcmd

您可以使用Files.walkFileTree來執行此操作,但是如果在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;
    }
});

但實際上,您不應該掛起事件分發線程。 文件I / O應該在另一個線程中完成。 有很多方法可以做到這一點,但是SwingWorker對於許多人來說似乎是最簡單的:

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();
}

您甚至可以更進一步,在更改文件之前對文件進行計數,然后使用ProgressMonitor而不是JOptionPane。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM