c# - 操作方法:使用 Microsoft.Office.Interop 打开/保存文件时,停止在快速访问中将文件添加到“最近的文件”
问题描述
使用以下代码打开和保存 Word/Excel 文档时,打开和保存的文件将被添加到 Windows 文件资源管理器的最近文件中(见屏幕截图)。代码本身适用于我的目的;我只复制了一小部分与环绕相关的代码。但是,我在阻止这种不良行为方面遇到了困难,并且搜索互联网似乎只给了我关于如何防止文件出现在办公应用程序本身的“最近文件”列表中的结果,而不是 Windows 文件资源管理器。
我在包含旧的非 xml 格式的 Office 文件的上千个目录上运行此代码,有些甚至分成 5 位数。当.Open()
被调用时,原始文件显示在列表中,当.SaveAs()
/.SaveAs2()
被调用时,新文件显示在列表中。当我逐步执行代码时,这会实时发生,它会导致 explorer.exe 进程的 CPU 使用率飙升。打开和重新保存旧格式的 office 文件的操作发生得相当快,我怀疑这会由于 explorer.exe 不断处理最近的文件而导致大量的 CPU 使用负载。我认为相关的其他症状是,当代码运行时,光标下方不断有旋转轮,整个操作系统 GUI 似乎变得有些无响应。
需要明确的是,我认为阻止 Windows 将文件添加到列表中的主动解决方案将是最佳途径,而不是仅在事后清理列表的追溯解决方案。
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";
}
}
解决方案
当文件条目添加到“最近的文件”列表时,由于 explorer.exe 的 CPU 峰值,我面临着运行时性能不佳的问题。
打开和重新保存旧格式的 office 文件的操作发生得相当快,我怀疑这会由于 explorer.exe 不断处理最近的文件而导致大量的 CPU 使用负载。我认为相关的其他症状是,当代码运行时,光标下方不断有旋转轮,整个操作系统 GUI 似乎变得有些无响应。
你能先检查一下这些常见的原因 - 关闭后台进程,在 Device Mgr 中检查 IO 驱动程序是否正常并暂时禁用防病毒:
- 后台进程太多
- 司机
- 防病毒
- 恶意软件
- WmiPrvSE.exe
下载 Microsoft 的Process Explorer以查看导致 CPU 峰值的原因。在这里查看高 CPU 消耗线程,就是这个 Audioses.DLL+0x1141b0。你能告诉我当你执行操作时哪个 DLL 占用了最高的 CPU 吗?如果它的 Explorer.EXE 不是 Audioses.DLL 消耗 CPU,请转到您的解决方案的第 2 步。如果是别的东西,我们可能需要一个 PerfCounter 跟踪。
在计算机上运行系统文件检查器 (SFC) 扫描以扫描损坏的系统文件并替换它们:http: //support.microsoft.com/kb/929833
“我不敢相信一个坏掉的图标会导致 explorer.exe 进入一个循环,耗尽它所能占用的所有 CPU。”
和 ..
“我的桌面上有一个带有损坏图标的 exe,将其移动到文件夹中解决了问题”
如果问题仍然存在,请创建一个新用户帐户,以该用户身份登录并检查问题是否消失,那么您就知道您的个人资料已损坏。
用更好的硬件解决问题:硬件很便宜,程序员很贵
参考:
https ://www.techspot.com/community/topics/explorer-exe-high-cpu-usage-probably-not-malware.240788/
https://answers.microsoft.com/en-us/windows/论坛/所有/explorerexe-high-cpu-usage-tried-everything-i-can/28cf8431-f9db-4169-9237-8e6521ef4c1c
https://linustechtips.com/main/topic/939842-solvedexplorerexe0xa8150-high-cpu-usage /
推荐阅读
- ruby-on-rails - Rails mongoid insert_many 并与模型关联
- python - 在数据帧行的开头和结尾搜索单词模式
- bootstrap-modal - 您好,我想使用引导程序创建一个模式弹出窗口,但它(弹出窗口)没有出现。我只是想知道我是否错过了什么
- javascript - 在边缘浏览器中动态注入 JavaScript 模块
- c - 我应该将什么传递给 isdigit() 以使其正常工作?
- selenium - Selenium 没有正确解释属性值
- javascript - 如何在 JavaScript 中创建对象列表
- reactjs - React、Redux、NextJS 奇怪的状态竞争覆盖
- python - 如何使用 setuptools 安装可写共享和用户特定数据文件?
- firebase - 如果收到 Firebase 安全规则信函,我该怎么办?