【问题标题】:How to stop from deleting a file/workbook in MS excel when it is already open?MS excel中的文件/工作簿已经打开时如何停止删除它?
【发布时间】:2022-09-30 14:24:34
【问题描述】:

我们为 MS Excel 和 Word 2019 设计了 ​​Microsoft 插件,用 VB.net 编写。 在那里我们设计了一个选项卡,单击此选项卡时,我们打开一个任务窗格。 在加载此任务窗格时,我们执行代码以启动另一个 Excel 文件/Word 文件。

因此,当我在 MS Word 中删除已打开的文件时,它会显示异常文件 \'Filename\' 已存在。 下面给出的是我用来删除一个已经存在的名为 processFile 的打开文件的代码 sn-p

My.Computer.FileSystem.DeleteFile(processFile)

现在,当我在 MS Excel 中运行相同的代码 sn-p 时,它不会显示此异常并删除文件。

我无法理解这种行为。 请建议是否有人对此有所了解

以下是有关我正在工作的环境的更多信息:

操作系统: 微软视窗 10 专业版

代码编辑器: 视觉工作室 2019

技术: Vb.net(.Net Framework 4.8)

微软办公版: 2019(32 位) : Microsoft Windows 10 Pro

    标签: excel vb.net vsto office-addins excel-addins


    【解决方案1】:

    如果文件正在使用中,则应该抛出 IOException。您需要先关闭所有编辑器,然后再删除文件。

    【讨论】:

    • 是的,当我删除已经打开的文件但不在 MS Excel 中时,会在 MS Word 中显示 IOException。这就是我的问题
    • 是否有可能在 MS Excel 中打开了该文件的副本?
    • @EugeneAstafiev,看起来程序在word上运行良好,而不是在excel上运行。甚至用户都说文件已删除,但它在 excel 编辑器中保持打开状态。可以是 Microsoft Excel 问题,还是您有其他选择。
    • 文件是否在保护模式下打开?两者有什么区别?
    • @EugeneAstafiev 是的,当我在保护模式下打开文件时,我没有收到任何异常并且文件被删除,但是当文件在编辑模式下打开时,它显示 IOException 并且它不会删除文件
    【解决方案2】:

    检查文件是否打开。我在下面有一个代码可能会有所帮助。

    作为 import sfile 使用带有文件名的完整路径。 (例如“C:\Windows\test.txt”) 当文件打开时返回 True,否则返回 false。

    您将需要“导入 System.IO”

     Public Function IsFileInUse(sFile As String) As Boolean
            Try
                If File.Exists(sFile) Then
                    Using f As New IO.FileStream(sFile, FileMode.Open, FileAccess.ReadWrite, FileShare.None)
                    End Using
                End If
            Catch Ex As Exception
                Return True
            End Try
            Return False
        End Function
    

    【讨论】:

    • 嗨,我刚刚检查了您在上面提供的 sn-p。它返回“False”,即使文件以打开模式显示并从驱动器中删除。
    【解决方案3】:

    根据评论部分中的信息,该文件以“保护模式”打开,您说它正在删除,而它仍然对用户开放。

    所以是的,如果文件被某个程序占用和删除,它应该抛出异常而不是删除。但是,如果没有例外,即 Windows/MS Excel 已完成某些特定处理,则文件已被删除,同时仍保留在缓冲区中并处于打开状态。它的答案只能由微软给出。

    一种解决方案,我可以建议是关闭“受保护的对象”,然后删除文件,这样就不会向用户打开任何文件,它会被安全地删除。

    用于打开插件(VSTO)文件的片段:

    Dim objProtectedMode As String objProtectedMode = Globals.Connect.Application.ProtectedViewWindows.Open(fileLocation, , False, False)

    片段以安全地删除文件:

    If Not (objProtectedMode Is Nothing) Then
    objProtectedMode.Close()
    End If
    
    My.Computer.FileSystem.DeleteFile(objProtectedMode)
    

    注意: - 解决方案可能因其他加载项而异。为 VSTO 加载项提供的代码 sn-p。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-07
      • 2022-10-08
      • 1970-01-01
      • 2014-09-12
      • 2021-05-01
      • 1970-01-01
      • 2018-06-23
      相关资源
      最近更新 更多