[英]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
寫入PowerShell
或cmd
?
您可以使用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.