How-To: Прекратить добавление файлов в «Недавние файлы» в Quick Access при открытии / сохранении файлов с помощью Microsoft.Office.Interop - PullRequest
2 голосов

При открытии и сохранении документов Word / Excel с использованием следующего кода открываемые и сохраняемые файлы добавляются в последние файлы проводника Windows (см. Скриншот).Сам код прекрасно работает для моих целей;Я только скопировал небольшую часть с соответствующим кодом окружения.Тем не менее, я испытываю трудности с остановкой этого нежелательного поведения, и поиск в Интернете, кажется, только дает мне результаты о том, как предотвратить отображение файлов в списке «Недавние файлы» самих офисных приложений, а не Windows File Explorer.

Я выполняю этот код в каталогах, которые содержат верхние тысячи, некоторые даже разбиты на 5-значные числа файлов Office в старом формате, отличном от xml.Когда вызывается .Open(), исходный файл появляется в списке, а когда вызывается .SaveAs() / .SaveAs2(), новый файл появляется в списке.Это происходит в режиме реального времени, когда я выполняю шаги по коду, и это вызывает скачок использования процессора в процессе explorer.exe.Открытие и повторное сохранение офисных файлов старого формата происходит довольно быстро, и я подозреваю, что это приводит к большой загрузке ЦП из-за постоянной обработки explorer.exe последних файлов.Другие симптомы, которые, я думаю, связаны с тем, что курсор постоянно имеет вращающееся колесо под ним, когда код выполняется, и весь графический интерфейс ОС кажется несколько не отвечающим.

Чтобы быть ясным, я считаю, что упреждающийЛучше всего выбрать решение, не позволяющее 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 File Explorer после запускакод для бита: enter image description here

Ответы [ 2 ]

0 голосов
/ 19 июня 2019

У меня низкая производительность во время выполнения из-за скачков ЦП из explorer.exe, когда записи файлов добавляются в список последних файлов.

Процесс открытия и повторного сохранения старогоформатирование офисных файлов происходит довольно быстро, и я подозреваю, что это вызывает большую загрузку ЦП из-за постоянной обработки файлов explorer.exe последними файлами.Другие симптомы, которые, я думаю, связаны с тем, что курсор постоянно имеет вращающееся колесо под ним, когда код выполняется, и весь графический интерфейс ОС кажется несколько не отвечающим.

Можете ли вы сначала проверить эти общиепричины - закрыть фоновые процессы, в Device Mgr проверить, что драйвер ввода-вывода в порядке и временно отключить антивирус:

  • Слишком много фоновых процессов
  • Драйвер
  • АнтивирусВирус
  • Вредоносное ПО
  • WmiPrvSE.exe

  1. Загруженный Microsoft Process Explorer , чтобы увидеть, что вызываетПики процессора.Посмотрите здесь потоки с высокой загрузкой процессора, это Audioses.DLL + 0x1141b0.Можете ли вы показать / сказать мне, какая DLL использует самый высокий процессор при выполнении операции?Если его Explorer.EXE не Audioses.DLL, потребляющий процессор, перейдите к шагу 2 для вашего решения.Если это что-то еще, нам может понадобиться трассировка PerfCounter.

    enter image description here

  2. Запустить проверку проверки системных файлов (SFC) на компьютере, чтобысканировать поврежденные системные файлы и заменять их: http://support.microsoft.com/kb/929833

    "Я не могу поверить, что сломанный значок может привести к тому, что explorer.exe зацикливается, пожирая весь процессор, который он может. "

    и ..

    " У меня был exe-файл с поврежденным значком на рабочем столе, перемещение его в папку решило проблему "

  3. Если проблема не устранена, создайте новую учетную запись пользователя, войдите в систему как этот пользователь и проверьте, устранена ли проблема, то вы знаете, что ваш профиль поврежден.

  4. Бросьте лучшее оборудование в проблему: Оборудование дешевое, Программисты дорогие

Ссылка:
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/

0 голосов
/ 16 июня 2019

Это может незначительно отличаться в зависимости от версии операционной системы клиента.

Чтобы очистить историю проводника в 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");
    }
}

Сделайте резервную копию вашего реестра, прежде чем пытаться это сделать.

...