如何:使用Microsoft.Office.Interop打开/保存文件时,停止将文件添加到“快速访问”中的“最近的文件”中

时间:2019-05-30 20:21:37

标签: c# office-interop recent-file-list

使用以下代码打开和保存Word / Excel文档时,已打开和保存的文件将添加到Windows File Explorer的“最近文件”中(请参见屏幕截图)。该代码本身可以很好地达到我的目的。我只复制了与环绕声相关的代码的一小部分。但是,我在阻止这种不良行为方面遇到困难,并且在Internet上搜索似乎只能为我提供有关如何防止文件显示在Office应用程序本身(而不是Windows File Explorer)的“最近文件”列表中的结果。

using WORD = Microsoft.Office.Interop.Word;
using EXCEL = Microsoft.Office.Interop.Excel;

//==============================================================================


try
{
    if (newFileExt == FileExt.NEW_Word)
    {
        //open the doc
        var document = WordApp.Documents.Open(FileName: fdesc.FileInfo.FullName, ConfirmConversions: false, ReadOnly: true, AddToRecentFiles: false, Visible: false);

        //save the doc
        document.SaveAs2(FileName: newname, FileFormat: WORD.WdSaveFormat.wdFormatXMLDocument, CompatibilityMode: WORD.WdCompatibilityMode.wdCurrent, AddToRecentFiles: false);

        // close the doc
        document.Close(WORD.WdSaveOptions.wdDoNotSaveChanges);
    }
    else if (newFileExt == FileExt.NEW_Excel)
    {
        // open the workbook
        /// https://docs.microsoft.com/en-us/dotnet/api/microsoft.office.interop.excel.workbooks.open?view=excel-pia#Microsoft_Office_Interop_Excel_Workbooks_Open_System_String_System_Object_System_Object_System_Object_System_Object_System_Object_System_Object_System_Object_System_Object_System_Object_System_Object_System_Object_System_Object_System_Object_System_Object_
        EXCEL.Workbook workbook = ExcelApp.Workbooks.Open(Filename: fdesc.FileInfo.FullName, ReadOnly: true, IgnoreReadOnlyRecommended: true, AddToMru: false);

        // save the doc
        /// https://docs.microsoft.com/en-us/dotnet/api/microsoft.office.interop.excel._workbook.saveas?view=excel-pia

        if (workbook.HasVBProject)
        {
            FileInfo newFile = new FileInfo(newname);
            newname = newFile.DirectoryName + Path.DirectorySeparatorChar + Path.GetFileNameWithoutExtension(newFile.Name) + FileExt.NEW_Excel_Macro;
            UpateNewFileNameConsole(new FileInfo(newname));
            workbook.SaveAs(Filename: newname, FileFormat: EXCEL.XlFileFormat.xlOpenXMLWorkbookMacroEnabled, ReadOnlyRecommended: false, AddToMru: false);
        }
        else
        {
            workbook.SaveAs(Filename: newname, FileFormat: EXCEL.XlFileFormat.xlOpenXMLWorkbook, ReadOnlyRecommended: false, AddToMru: false);
        }


        // close the Workbook
        workbook.Close(SaveChanges: false);
    }
    else { throw new Exception("unkown File in conversion"); }

    //move the old file
    File.Move(fdesc.FileInfo.FullName, moveDir.FullName + Path.DirectorySeparatorChar + fdesc.FileInfo.Name);

}
catch (Exception ex)
{
    Debug.WriteLine(ex.Message);
}


//==============================================================================


public static class FileExt
{
    public const string OLD_Word = ".doc";
    public const string NEW_Word = ".docx";
    public const string OLD_Excel = ".xls";
    public const string NEW_Excel = ".xlsx";
    public const string NEW_Excel_Macro = ".xlsm";
    public const string RichTextFormat = ".rtf";
    public const string OldFormatDir = "!old_format";
    }
}

运行一段时间的代码后,Windows File Explorer的屏幕截图: enter image description here

2 个答案:

答案 0 :(得分:0)

这可能会有所不同,具体取决于客户端操作系统版本。

要清除Windows 10中的文件资源管理器历史记录,请手动打开注册表编辑器应用程序。 转到以下注册表项: HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer

删除名为TypedPaths的子项:

enter image description here

打开文件资源管理器,转到文件夹%APPDATA%\Microsoft\Windows\Recent\ 并删除您看到的所有文件和文件夹。


尽管历史记录文件夹是隐藏的,您仍然可以提取创建的文件并以编程方式将其删除,例如:

string[] recentFiles = System.IO.Directory.GetFiles(Environment.GetFolderPath(Environment.SpecialFolder.History), "*", SearchOption.AllDirectories);

foreach (var file in recentFiles)
{
   System.IO.File.Delete(file);
}

要使用代码删除注册表项:

string keyName = @"Software\Microsoft\Windows\CurrentVersion\Explorer";
using (RegistryKey key = Registry.CurrentUser.OpenSubKey(keyName, true))
{
    if (key == null)
    {
        // Key doesn't exist. Do whatever you want to handle this case
    }
    else
    {
        key.DeleteValue("TypedPaths");
    }
}

尝试备份注册表之前。

答案 1 :(得分:0)

  

由于将文件条目添加到“最近的文件”列表中时来自explorer.exe的CPU峰值,因此我面临运行时性能不佳的问题。

     

打开并重新保存旧格式的Office文件的动作发生得很快,并且我怀疑由于explorer.exe不断处理最新文件而导致大量的CPU使用负载。我认为有关的其他症状是,在代码运行时,光标始终在其下方有一个旋转轮,并且整个OS GUI似乎都没有响应。

您能否首先检查以下常见原因-关闭后台进程,在Device Mgr中检查IO驱动程序是否正常并暂时禁用防病毒:

  • 后台进程太多
  • 驱动程序
  • 防病毒
  • 恶意软件
  • WmiPrvSE.exe

  1. 下载了Microsoft的Process Explorer,以了解导致CPU峰值的原因。请参阅此处的高CPU消耗线程,它是Audioses.DLL + 0x1141b0。您可以告诉/告诉我执行该操作时哪个DLL占用了最高的CPU吗?如果其Explorer.EXE不是Audioses.DLL,则消耗CPU转到解决方案的步骤2。如果还有其他问题,我们可能需要PerfCounter跟踪。

    enter image description here

  2. 在计算机上运行系统文件检查器(SFC)扫描以扫描损坏的系统文件并替换它们:http://support.microsoft.com/kb/929833

    “我不敢相信损坏的图标会导致explorer.exe陷入循环,吞噬了所有可能的CPU。”

    和..

    “我的台式机上的exe文件带有损坏的图标,将其移动到文件夹中即可解决问题”

  3. 如果问题仍然存在,请创建一个新的用户帐户,以该用户身份登录并检查问题是否消失,那么您就知道您的个人资料已损坏。

  4. 在此问题上投放更好的硬件:Hardware is Cheap, Programmers are Expensive

参考文献:
https://www.techspot.com/community/topics/explorer-exe-high-cpu-usage-probably-not-malware.240788/
https://answers.microsoft.com/en-us/windows/forum/all/explorerexe-high-cpu-usage-tried-everything-i-can/28cf8431-f9db-4169-9237-8e6521ef4c1c
https://linustechtips.com/main/topic/939842-solvedexplorerexe0xa8150-high-cpu-usage/