如何替换当前打开的文件?
How to replace a file that is currently opened?
我实际上是在我的应用程序中处理 pdf 文档。
我正在将要读取的 pdf 文件存储在应用程序的本地文件夹中。
此文件在整个应用程序中使用,因此我认为此文件在整个应用程序中保持打开状态。当我想用一个新文件替换该文件时,它给我错误,我认为原因是该文件正在使用中。我找不到关闭此文件的任何选项。无论如何关闭从 pdfDocument class 的 loadFromFileAsync() 方法打开的文件?或者有没有其他方法可以替换正在使用的文件。
var loc = Windows.Storage.ApplicationData.current.localFolder;
var picker = new Windows.Storage.Pickers.FileOpenPicker();
var pdf;
function newFile() {
picker.fileTypeFilter.append(".pdf");
picker.pickSingleFileAsync().then(
function (f) {
f.copyAsync(loc, "main.pdf", Windows.Storage.NameCollisionOption.replaceExisting).done(
function (f1) {
Windows.Data.Pdf.PdfDocument.loadFromFileAsync(f1).then(
function (file) {
pdf = file;
Windows.UI.Popups.MessageDialog("loaded " + pdf).showAsync();
document.getElementById("btn").onclick = newFile;
});
},
function (e) {
Windows.UI.Popups.MessageDialog("Error: " + e).showAsync();
});
});
}
newFile();
名为"main.pdf" 的文件存储在应用程序的本地文件夹中。
上面的代码重现了我的应用程序中出现的问题。因此,在上面的代码中,当应用程序启动时,会调用 newFile() 方法并将本地文件夹中的 "main.pdf" 文件替换为新的 "main.pdf" 文件。但是当在应用程序中再次调用 newFile() 方法时,它在替换 "main.pdf" 文件时给我一个未指定的错误。
我认为,要替换的文件正在由 PdfDocument class 操作,这是错误的原因,因为当我不从 loadFromFileAsync() 方法加载此文件时PdfDocument class,newFile() 方法第二次也能正常工作。
完成这项工作的方法是什么?
您在 newFile()
之外声明了 pdf
变量,但此变量在 newFile()
方法中引用了 pdf 文件。 newFile()
方法调用完成后,这个变量还没有被释放。
要解决您的问题,您可以在 newFile()
方法中声明此 pdf 变量。
function newFile() {
var pdf;
picker.fileTypeFilter.append(".pdf");
picker.pickSingleFileAsync().then(
function (f) {
f.copyAsync(loc, "main.pdf", Windows.Storage.NameCollisionOption.replaceExisting).done(
function (f1) {
Windows.Data.Pdf.PdfDocument.loadFromFileAsync(f1).then(
function (file) {
pdf = file;
Windows.UI.Popups.MessageDialog("loaded " + pdf).showAsync();
});
},
function (e) {
Windows.UI.Popups.MessageDialog("Error: " + e).showAsync();
});
});
}
我实际上是在我的应用程序中处理 pdf 文档。 我正在将要读取的 pdf 文件存储在应用程序的本地文件夹中。 此文件在整个应用程序中使用,因此我认为此文件在整个应用程序中保持打开状态。当我想用一个新文件替换该文件时,它给我错误,我认为原因是该文件正在使用中。我找不到关闭此文件的任何选项。无论如何关闭从 pdfDocument class 的 loadFromFileAsync() 方法打开的文件?或者有没有其他方法可以替换正在使用的文件。
var loc = Windows.Storage.ApplicationData.current.localFolder;
var picker = new Windows.Storage.Pickers.FileOpenPicker();
var pdf;
function newFile() {
picker.fileTypeFilter.append(".pdf");
picker.pickSingleFileAsync().then(
function (f) {
f.copyAsync(loc, "main.pdf", Windows.Storage.NameCollisionOption.replaceExisting).done(
function (f1) {
Windows.Data.Pdf.PdfDocument.loadFromFileAsync(f1).then(
function (file) {
pdf = file;
Windows.UI.Popups.MessageDialog("loaded " + pdf).showAsync();
document.getElementById("btn").onclick = newFile;
});
},
function (e) {
Windows.UI.Popups.MessageDialog("Error: " + e).showAsync();
});
});
}
newFile();
名为"main.pdf" 的文件存储在应用程序的本地文件夹中。 上面的代码重现了我的应用程序中出现的问题。因此,在上面的代码中,当应用程序启动时,会调用 newFile() 方法并将本地文件夹中的 "main.pdf" 文件替换为新的 "main.pdf" 文件。但是当在应用程序中再次调用 newFile() 方法时,它在替换 "main.pdf" 文件时给我一个未指定的错误。
我认为,要替换的文件正在由 PdfDocument class 操作,这是错误的原因,因为当我不从 loadFromFileAsync() 方法加载此文件时PdfDocument class,newFile() 方法第二次也能正常工作。 完成这项工作的方法是什么?
您在 newFile()
之外声明了 pdf
变量,但此变量在 newFile()
方法中引用了 pdf 文件。 newFile()
方法调用完成后,这个变量还没有被释放。
要解决您的问题,您可以在 newFile()
方法中声明此 pdf 变量。
function newFile() {
var pdf;
picker.fileTypeFilter.append(".pdf");
picker.pickSingleFileAsync().then(
function (f) {
f.copyAsync(loc, "main.pdf", Windows.Storage.NameCollisionOption.replaceExisting).done(
function (f1) {
Windows.Data.Pdf.PdfDocument.loadFromFileAsync(f1).then(
function (file) {
pdf = file;
Windows.UI.Popups.MessageDialog("loaded " + pdf).showAsync();
});
},
function (e) {
Windows.UI.Popups.MessageDialog("Error: " + e).showAsync();
});
});
}