如何替换当前打开的文件?

Posted

技术标签:

【中文标题】如何替换当前打开的文件?【英文标题】:How to replace a file that is currently opened? 【发布时间】:2019-07-10 11:52:32 【问题描述】:

我实际上是在我的应用程序中处理 pdf 文档。 我将要读取的 pdf 文件存储在应用程序的本地文件夹中。 这个文件在整个应用程序中使用,所以我认为这个文件在整个应用程序中保持打开状态。当我想用新文件替换文件时,它给了我错误,我认为原因是文件正在使用中。我找不到关闭此文件的任何选项。无论如何要关闭从 pdfDocument 类的 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 类操作,这是导致错误的原因,因为当我不从 PdfDocument 类的 loadFromFileAsync() 方法加载此文件时,newFile( ) 方法第二次也可以正常工作。 完成这项工作的方法是什么?

【问题讨论】:

请贴出代码,LoadFromFileAsync 不应该让文件处于打开状态,所以如果问题不在其他地方,值得调查 @MartinZikmund 抱歉回复晚了,代码已添加,请查收。 我认为你应该打开保存选择器 @Iindexi 保存选择器将能够将文件保存在用户指定的位置,我不希望那样。 【参考方案1】:

您在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 变量是全局变量,并在 newFile(); 中使用 null 对其进行初始化;方法。

以上是关于如何替换当前打开的文件?的主要内容,如果未能解决你的问题,请参考以下文章

我们如何使用Windows Powershell脚本替换文本文件中的日期?

如何替换不在当前循环Python中的文本文件中的一行

用(当前)非git文件夹替换分支中的所有文件和文件夹

如何打开文件、替换一些字符串并将更新保存到同一个文件?

如何使用Robot + Linux在json文件中以UTC(Zulu UTC)格式替换当前时间?

图片文件的文件名后缀名替换后正常打开图片使用吗?