Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何:停止将文件添加到";最近的档案;使用Microsoft.Office.Interop打开/保存文件时处于快速访问状态_C#_Office Interop_Recent File List - Fatal编程技术网

C# 如何:停止将文件添加到";最近的档案;使用Microsoft.Office.Interop打开/保存文件时处于快速访问状态

C# 如何:停止将文件添加到";最近的档案;使用Microsoft.Office.Interop打开/保存文件时处于快速访问状态,c#,office-interop,recent-file-list,C#,Office Interop,Recent File List,使用以下代码打开和保存Word/Excel文档时,打开和保存的文件将添加到Windows文件资源管理器的最新文件中(请参见屏幕截图)。就我而言,代码本身运行良好;我只复制了一小部分与环绕相关的代码。但是,我很难阻止这种不受欢迎的行为,搜索internet似乎只能给我关于如何防止文件显示在office应用程序本身的“最近文件”列表中的结果,而不是Windows文件资源管理器 我在目录上运行这段代码,这些目录中包含旧的非xml格式的Office文件,数量高达数千个,有些甚至分为5位数。调用.Open

使用以下代码打开和保存Word/Excel文档时,打开和保存的文件将添加到Windows文件资源管理器的最新文件中(请参见屏幕截图)。就我而言,代码本身运行良好;我只复制了一小部分与环绕相关的代码。但是,我很难阻止这种不受欢迎的行为,搜索internet似乎只能给我关于如何防止文件显示在office应用程序本身的“最近文件”列表中的结果,而不是Windows文件资源管理器

我在目录上运行这段代码,这些目录中包含旧的非xml格式的Office文件,数量高达数千个,有些甚至分为5位数。调用
.Open()
时,原始文件显示在列表中,调用
.SaveAs()
/
.SaveAs2()
时,新文件显示在列表中。这是在我逐步完成代码时实时发生的,它会导致explorer.exe进程的CPU使用高峰。打开和重新保存旧格式的office文件的动作发生得相当快,我怀疑这会由于explorer.exe常量处理最近的文件而导致大量CPU使用负载。我认为与此相关的其他症状是,当代码运行时,光标不断地旋转,整个OS 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";
    }
}
运行代码一段时间后Windows文件资源管理器的屏幕截图:

这可能因客户端操作系统版本的不同而略有不同

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

删除名为TypedPath的子项:

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


尽管history文件夹是隐藏的,但您仍然可以获取您创建的文件并以编程方式删除它们,例如:

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");
    }
}
在尝试此操作之前,请先备份注册表

当文件条目添加到“最近使用的文件”列表时,由于explorer.exe的CPU峰值,我面临运行时性能不佳的问题

打开和重新保存旧格式的office文件的动作发生得相当快,我怀疑这会由于explorer.exe常量处理最近的文件而导致大量CPU使用负载。我认为与此相关的其他症状是,当代码运行时,光标不断地旋转,整个OS GUI似乎变得有些无响应

您是否可以首先检查这些常见原因-关闭后台进程,在设备管理器中检查IO驱动程序是否正常并暂时禁用防病毒:

  • 后台进程太多
  • 司机
  • 反病毒
  • 恶意软件
  • WmiPrvSE.exe

  • 下载了微软的,看看是什么导致了CPU峰值。请看这里的高CPU消耗线程,这是Audioses.DLL+0x1141b0。当你执行这个操作时,你能告诉我什么DLL占用了最高的CPU吗?如果其Explorer.EXE不是Audioses.DLL,则转到步骤2以获取解决方案。如果是其他东西,我们可能需要一个PerfCounter跟踪

  • 在计算机上运行系统文件检查器(SFC)扫描以扫描损坏的系统文件并替换它们:

    “我不敢相信一个坏掉的图标会导致explorer.exe进入循环,耗尽它所能消耗的所有CPU。”

    “我的桌面上有一个带有损坏图标的exe,将其移动到一个文件夹解决了问题”

  • 如果问题仍然存在,请创建一个新用户帐户,以该用户的身份登录并检查问题是否消失,那么您就知道您的配置文件已损坏

  • 针对问题使用更好的硬件:

  • 参考编号:



    在不知道要通过什么路径的情况下,但看到屏幕截图显示了具有相同名称但不同扩展名的成对文件,是否为调用
    Open()
    和随后调用
    SaveAs()
    /
    SaveAs2()创建了最近的文件条目
    ?请看:我不认为您可以做任何事情来阻止它们,因为这是一种操作系统用户设置类型的事情。事后清理自己可能是你能做的最好的事情。它将依赖于操作系统。例如,在Windows 10中,您必须乱用HKEY\U CURRENT\U USER\Software\Microsoft\Windows\CurrentVersion\Explorer\RecentDocs\reg键。@BACON-是。调用
    .Open()
    时,原始文件显示在列表中,调用
    .SaveAs()
    /
    .SaveAs2()
    时,新文件显示在列表中。当我通过代码时,这会发生,它会导致CPU使用率从 Explorer .exe < /Cord> @ SorcCy-您的链接可以提供一些非常有用的信息,但是我不知道如何在C.NET应用程序中使用那些C++ API。我可以请求一份该信息的人工翻译/提炼版本,以及如何在C#NET中使用它吗?谢谢您的回答。我更新了这个问题,解释了为什么在这种情况下,追溯清理
    最近的文件
    列表没有帮助。当前,当文件项添加到
    最近的文件
    列表时,由于
    explorer.exe
    的CPU峰值,我面临运行时性能不佳的问题。您无法阻止Windows添加最近的项目。引擎盖下的窗口使用r中的MRU列表