使用 DirectoryChooser 保存文件时拒绝访问
access denied while saving file using DirectoryChooser
我正在使用 Apache 库编辑 DOCX 文件,我希望用户选择保存文件的目录。 select 到哪个文件夹并不重要,它总是会发出异常并显示 "path (Access denied)"、,但是 ,如果我在我的代码中选择目录,它会完美运行。这是我的一些代码:
XWPFDocument doc = null;
try {
doc = new XWPFDocument(new ByteArrayInputStream(byteData));
} catch (IOException e) {
e.printStackTrace();
}
/* editing docx file somehow (a lot of useless code) */
Alert alert = new Alert(Alert.AlertType.INFORMATION);
DirectoryChooser dirChooser = new DirectoryChooser();
dirChooser.setTitle("Choose folder");
Stage stage = (Stage) (((Node) event.getSource()).getScene().getWindow());
File file = dirChooser.showDialog(stage);
if (file != null) {
try {
doc.write(new FileOutputStream(file.getAbsoluteFile()));
alert.setContentText("Saved to folder " + file.getAbsolutePath());
} catch (IOException e) {
alert.setContentText(e.getLocalizedMessage());
}
} else {
try {
doc.write(new FileOutputStream("C://output.docx"));
alert.setContentText("Saved to folder C:\");
} catch (IOException e) {
alert.setContentText(e.getLocalizedMessage());
}
}
alert.showAndWait();
请帮我找出我做错了什么:(
DirectoryChooser returns 一个 File
对象,它可以是一个目录或一个空值(如果您没有通过按取消或退出对话框来选择一个)。所以为了保存你的文件,你还需要将文件名附加到你选择的目录的绝对路径上。您可以通过 :
doc.write(new FileOutputStream(file.getAbsoluteFile()+"\doc.docx"));
但这是平台相关的原因,因为 windows 它是‘\’,对于 unix 它是‘/’,所以最好使用 File.separator
,例如:
doc.write(new FileOutputStream(file.getAbsoluteFile()+File.separator+"doc.docx"));
你可以阅读更多关于上面的内容here
编辑: 正如 Fabian 在下面的评论中提到的,您可以使用 File
构造函数,传递文件夹(您从他们那里获得的文件 DirectoryChooser )和新的文件名作为参数,使代码更具可读性:
new FileOutputStream(new File(file, "doc.docx"))
我正在使用 Apache 库编辑 DOCX 文件,我希望用户选择保存文件的目录。 select 到哪个文件夹并不重要,它总是会发出异常并显示 "path (Access denied)"、,但是 ,如果我在我的代码中选择目录,它会完美运行。这是我的一些代码:
XWPFDocument doc = null;
try {
doc = new XWPFDocument(new ByteArrayInputStream(byteData));
} catch (IOException e) {
e.printStackTrace();
}
/* editing docx file somehow (a lot of useless code) */
Alert alert = new Alert(Alert.AlertType.INFORMATION);
DirectoryChooser dirChooser = new DirectoryChooser();
dirChooser.setTitle("Choose folder");
Stage stage = (Stage) (((Node) event.getSource()).getScene().getWindow());
File file = dirChooser.showDialog(stage);
if (file != null) {
try {
doc.write(new FileOutputStream(file.getAbsoluteFile()));
alert.setContentText("Saved to folder " + file.getAbsolutePath());
} catch (IOException e) {
alert.setContentText(e.getLocalizedMessage());
}
} else {
try {
doc.write(new FileOutputStream("C://output.docx"));
alert.setContentText("Saved to folder C:\");
} catch (IOException e) {
alert.setContentText(e.getLocalizedMessage());
}
}
alert.showAndWait();
请帮我找出我做错了什么:(
DirectoryChooser returns 一个 File
对象,它可以是一个目录或一个空值(如果您没有通过按取消或退出对话框来选择一个)。所以为了保存你的文件,你还需要将文件名附加到你选择的目录的绝对路径上。您可以通过 :
doc.write(new FileOutputStream(file.getAbsoluteFile()+"\doc.docx"));
但这是平台相关的原因,因为 windows 它是‘\’,对于 unix 它是‘/’,所以最好使用 File.separator
,例如:
doc.write(new FileOutputStream(file.getAbsoluteFile()+File.separator+"doc.docx"));
你可以阅读更多关于上面的内容here
编辑: 正如 Fabian 在下面的评论中提到的,您可以使用 File
构造函数,传递文件夹(您从他们那里获得的文件 DirectoryChooser )和新的文件名作为参数,使代码更具可读性:
new FileOutputStream(new File(file, "doc.docx"))