Процесс Wpf не может получить доступ к файлу

Обновлено: 21.11.2024

28 ноября 2008 г.

Процесс не может получить доступ к файлу, поскольку он используется другим процессом.
Это сообщение об ошибке чаще всего появляется,
когда вы пытаетесь получить доступ к файлу, открытому другим процессом.

Вы можете открыть файл изображения в одной из ваших форм в окне изображения, используя ImageFromFile или что-то в этом роде.
В основном я использую поток памяти для открытия изображения.
После чтения в byte[] запишите его в поток и закройте его.

Вы можете проверить, используется ли файл, с помощью простой функции.
Попробуйте открыть файл без общего доступа. Эта функция вернет true, если
файл используется другим процессом или нет.

8 комментариев:

Эй, не могли бы вы рассказать мне, как вы используете поток памяти для загрузки изображения в память. Я использую два изображения. Я сравню их, и если они будут одинаковыми, я удалю их. Я использовал метод FromFile для получения изображений. это сработало. но после сравнения и когда они одинаковы, я попытался удалить их, используя эту кодировку

string zDirectoryL = "C:\\Eagle Eye";
строка zFileNameL = "image1.jpg";
Информация о файле Информация о файле = новая информация о файле (zDirectoryL + "\\" + zFileNameL);
if (TheFileInfo.Exists)
File.Delete(zDirectoryL + "\\" + zFileNameL);
>

но выдает "Процесс не может получить доступ к файлу, так как он используется другим процессом". Поэтому я пытаюсь запомнить эти изображения и удалить их после сравнения. так что это не будет использовать изображения, тогда я могу их удалить.

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


bool _FileUse = false;
while (!_FileUse)
попробуйте
StreamWriter strWriter = new StreamWriter(p_directoryPath + p_Filename + ".txt",true);
strWriter.Write(_Builder);
strWriter.AutoFlush = true;
strWriter.Flush();
strWriter.Dispose();
strWriter.Close();
Thread.Sleep(1000);
_FileUse = истина;
>
catch (Exception ex)
Thread.Sleep(1000);
_FileUse = ложь;
>

этот цикл предоставит флаг потоку для проверки или проверки.

bool _FileUse = false;
while (!_FileUse)
попробуйте
StreamWriter strWriter = new StreamWriter(p_directoryPath + p_Filename + ".txt",true);
strWriter.Write(_Builder);
strWriter.AutoFlush = true;
strWriter.Flush();
strWriter.Dispose();
strWriter.Close();
Thread.Sleep(1000);
_FileUse = истина;
>
catch (Exception ex)
Thread.Sleep(1000);
_FileUse = ложь;
>
Надеюсь, это сработает, этот цикл создаст флаг и позволит всем потокам ждать определенного потока. если вы не получите логику, напишите мне, я вышлю вам весь код, который вам нужен: 0

Помимо проверки того, используется ли он, даже если он используется, может быть возможно открыть его с помощью FileShare.ReadWrite:

File.Open(имя файла, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);

IOException может возникать и для некоторых других исключений! это не только "Процесс не может получить доступ к файлу, потому что он используется другим процессом"

Если вы хотите уточнить, вам нужно проверить сообщение об ошибке, чтобы увидеть, содержит ли оно "Процесс не может получить доступ к файлу, поскольку он используется другим процессом"

Ваш код работает неправильно, вам необходимо закрыть открытый FileStream.

Сообщение об ошибке довольно ясное: вы пытаетесь получить доступ к файлу, а он недоступен, потому что другой процесс (или даже тот же процесс) что-то делает с ним (и он не разрешает никакого обмена).< /p>

Отладка

Это может быть довольно легко решить (или довольно сложно понять), в зависимости от вашего конкретного сценария. Давайте посмотрим кое-что.

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

К счастью, FileStream реализует IDisposable , поэтому весь код легко поместить в оператор using:

Этот шаблон также гарантирует, что файл не останется открытым в случае исключений (это может быть причиной того, что файл используется: что-то пошло не так, и никто его не закрыл; см. пример в этом посте) .

Обратите внимание на распространенную ошибку, которую мы очень часто видим в StackOverflow:

В этом случае ReadAllText() завершится ошибкой, поскольку файл уже используется ( File.Open() в предыдущей строке). Открывать файл заранее не только не нужно, но и неправильно. То же самое относится ко всем функциям File, которые не возвращают дескриптор файла, с которым вы работаете: File.ReadAllText() , File.WriteAllText() , File.ReadAllLines() , File.WriteAllLines() и другие (например, функции File.AppendAllXyz()) будут открывать и закрывать файл сами по себе.

Ваш процесс не единственный, кто имеет доступ к этому файлу.
Если ваш процесс не единственный, кто имеет доступ к этому файлу, тогда взаимодействие может быть сложнее. Поможет шаблон повторных попыток (если файл не должен быть открыт кем-либо еще, но он открыт, вам нужна утилита, такая как Process Explorer, чтобы проверить, кто делает что).

Как избежать

Когда применимо, всегда используйте операторы using для открытия файлов. Как сказано в предыдущем абзаце, это активно поможет вам избежать многих распространенных ошибок (см. этот пост для примера того, как его не использовать).

По возможности постарайтесь решить, кому принадлежит доступ к конкретному файлу, и централизуйте доступ с помощью нескольких известных методов. Если, например, у вас есть файл данных, который ваша программа считывает и записывает, вам следует поместить весь код ввода-вывода в один класс. Это упростит отладку (потому что вы всегда можете поставить там точку останова и посмотреть, кто что делает), а также будет точкой синхронизации (при необходимости) для множественного доступа.

Не забывайте, что операции ввода-вывода всегда могут завершиться ошибкой. Типичный пример:

Если кто-то удалит файл после File.Exists(), но до File.Delete() , это вызовет исключение IOException в том месте, где вы можете ошибочно чувствовать себя в безопасности.

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

Расширенные сценарии
Это не всегда так просто, поэтому вам может потребоваться предоставить доступ кому-то другому. Если, например, вы читаете с начала и пишете до конца, у вас есть как минимум два варианта.

1) совместно использовать один и тот же FileStream с надлежащими функциями синхронизации (поскольку он не является потокобезопасным). См. этот и этот сообщения для примера.

2) используйте перечисление FileShare, чтобы указать ОС разрешить другим процессам (или другим частям вашего собственного процесса) одновременный доступ к одному и тому же файлу.

В этом примере я показал, как открыть файл для записи и поделиться им для чтения; обратите внимание, что когда чтение и запись перекрываются, это приводит к неопределенным или недействительным данным. Это ситуация, которая должна быть обработана при чтении. Также обратите внимание, что это не делает доступ к потоку потокобезопасным, поэтому этот объект нельзя использовать совместно с несколькими потоками, если доступ каким-либо образом не синхронизирован (см. предыдущие ссылки). Доступны и другие варианты обмена, и они открывают более сложные сценарии. Дополнительные сведения см. в MSDN.

В общем случае N процессов могут одновременно читать из одного и того же файла, но только один из них должен записывать, в контролируемом сценарии вы даже можете включить одновременную запись, но это не может быть обобщено в нескольких текстовых абзацах внутри этого ответ.

Можно ли разблокировать файл, используемый другим процессом? Это не всегда безопасно и не так просто, но да, это возможно.

О чем говорит эта ошибка?

Как указывает ошибка, процесс (в данном случае служба или агент BuildMaster) не может перезаписать файл (в данном случае AWSSDK.dll в папке /bin). Есть три причины возникновения этой ошибки:

  • Файл доступен только для чтения и не может быть перезаписан;
  • Субъект-служба (учетная запись пользователя) не имеет разрешения на доступ к файлу.
  • Файл заблокирован, и пока он заблокирован, доступ к нему невозможен.

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

Например, когда два человека в одной сети пытаются открыть один и тот же документ Word (или PowerPoint и т. д.). Второй человек, открывший его, получит следующее предупреждение:

В этом есть смысл, поскольку без него несколько человек изменяли бы один и тот же документ, и им постоянно приходилось бы пытаться объединять изменения.

Почему возникает ошибка… Иногда?

Если приложение, которое вы развертываете, имеет только один или два небольших файла в папке /bin, перезапуск пройдет успешно, ваше приложение будет обновлено, и все будет работать нормально.

Но что происходит, когда файлов больше? В итоге мы получаем что-то вроде состояния гонки.

Когда BuildMaster пытается перезаписать файл, который ASP.NET в данный момент читает, мы получаем сообщение об ошибке "не удается получить доступ к файлу".

Как это можно предотвратить?

Вместо этого шаг развертывания артефакта сборки следует окружить в плане развертывания командами для остановки и запуска пула приложений.

Добавить эти шаги в BuildMaster очень просто. В плане развертывания нажмите зеленую кнопку с плюсом и щелкните тег [iis]. Вы увидите варианты остановки и запуска пулов приложений.

Затем выберите действие «Запустить пул приложений IIS» и выберите свой пул приложений:

После добавления действий остановки и запуска у вас будет примерно следующее:

Конечно, вы также можете использовать переменные для всего имени пула приложений или его части, например «My_Web$EnvironmentName», если у вас есть несколько пулов приложений, названных для каждой среды.

Инструменты Inedo DevOps максимально экономят время разработчиков, минимизируют риски выпуска и позволяют заинтересованным сторонам быстрее воплощать свои идеи в жизнь. И все это благодаря людям и технологиям, которые у вас есть прямо сейчас.

Я пытаюсь сохранить файлы в БД, которая должна записывать файл как "BinaryData".

Я использую RadAsyncUpload, но когда я загружаю файл, я получаю расширение "System.IO.IOException: процесс не может получить доступ к файлу, поскольку он используется другим процессом". и файл загружается только в папку App_Data моего приложения, в автоматически созданную папку «RadUploadTemp».

Я пытался отключить упоминания пути в методе SaveFile, получая сообщение об ошибке "Путь не найден". Любая из доступных демонстраций телерика похожа на мой контекст.

Как решить эту проблему?

EDIT: ошибка была устранена добавлением использования "fileStream.Close();", тем не менее, теперь файл сохраняется как null, сохраняется только имя файла и разрешается только 1 операция, исчезая со второй.

Я создал целевую папку. отделить от временной папки. Поскольку имя файла сохранено, я полагаю, что моя логика близка к верной.

2 ответа, 1 принят

Вы можете проверить следующие ресурсы, связанные с доступом к временным файлам:

Это должно помочь вам получить доступ к самому файлу, сохранить его в базе данных, и если вы не зададите целевую папку, файл будет автоматически удален из временной папки.

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

С уважением,
Пётр Мильчев
Прогресс Телерик

Любите продукты Telerik и Kendo UI и считаете, что больше людей должны попробовать их? Пригласите коллегу-разработчика стать клиентом Progress, и каждый из вас сможет получить подарочный ваучер Amazon на 50 долларов США.

Я пытаюсь использовать аналогичный подход к демонстрации, сделанной с помощью OleDB, с входным потоком, назначая свойство filebytes. Тем не менее, я получаю нулевое значение в БД.

Чего мне не хватает? Я использую TargetFolder, и он успешно получает FileName.

Частично решил! Надеюсь, это окажется полезным. Мне не хватило скопировать байты в переменную. тем не менее, у меня все еще есть проблемы

Я могу сохранить файл, только если регистр БД пуст. Как добавить возможность замены файла в мой код? Когда я пытаюсь отредактировать файл, он все равно выдает тот же " " Процесс не может получить доступ к файлу, потому что он используется другим процессом.". Или это не разрешено?

И еще одна проблема заключается в том, что я использую RadAsyncUpload в окне, поэтому я могу выполнить только одну операцию до полной перезагрузки страницы. Можно ли использовать частичный постбэк в окне?

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

Эта ошибка может появиться, если вы попытаетесь изменить e.File.InputStream вместо обновления базы данных.

Мне удалось решить проблему, не привязывая файл к форме редактирования. Отображение элемента как пустого в форме позволяет мне нормально обновлять новый файл. Не идеальный сценарий, но позволяет мне продолжить.

У меня есть и другие проблемы с использованием этой реализации вместе с RadWindow, поэтому может быть что-то не так в моем коде или невозможно отобразить значение файла в форме редактирования?

Это зависит от всей вашей настройки, могут быть некоторые проблемы с конфигурацией.

Вы также можете попробовать встроенные возможности Grid с редактором всплывающих окон и столбцом GridAttachment вместо того, чтобы реализовывать все это с нуля.

Что касается AsyncUpload, вы можете получить файл только при выборе файла, а затем, как только он будет загружен, вы сможете получить к нему доступ на сервере, прежде чем он будет перемещен в целевую папку. Как только это будет сделано, AsyncUpload больше не сможет получить доступ к файлам, и вам потребуется специальный код для загрузки файла из БД.

При применении команды Netsh несколько пользователей Windows жаловались на получение сообщения об ошибке Процесс не может получить доступ к файлу, поскольку он используется другим процессом Windows. Мало того, другие пользователи получают это сообщение об ошибке при использовании службы IIS. В информационных службах Интернета (IIS) или консоли управления Microsoft (MMC) пользователи получают доступ. Ошибка при попытке щелкнуть правой кнопкой мыши снимок веб-сайта. Эту ошибку, какой бы болезненной и редкой она ни была, можно устранить, и в этом посте мы быстро устраним эту ошибку, не теряя ни времени, ни денег.

Оглавление

Что такое процесс не может получить доступ к файлу, потому что он используется другим процессом Ошибка?

Эта ошибка сохраняется в Windows Vista, Windows 7, Windows 8.1, Windows 10 и на серверах Windows. Когда пользователь пытается щелкнуть правой кнопкой мыши и открыть веб-сайт в службах IIS, ему мешает процесс, который не может получить доступ к файлу, поскольку он используется другим сообщением об ошибке Windows процесса. Следовательно, пользователи не могут открыть веб-страницу.

Причины того, что процесс не может получить доступ к файлу, потому что он используется другой ошибкой процесса:

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

  • Команда требует прав администратора
  • У вас нет соответствующего разрешения
  • Другой процесс использует порт 80
  • Порт 443 уже используется
  • Подраздел реестра ListenOnlyList настроен неправильно

Типы процессов, при которых процесс не может получить доступ к файлу, поскольку он используется другим процессом. Ошибка:

Как исправить и решить, что процесс не может получить доступ к файлу, потому что он используется другой ошибкой процесса

Если вы в данный момент пытаетесь найти способ избавиться от этого сообщения об ошибке, этот пост Windows «Процесс не может получить доступ к файлу, поскольку он используется другим процессом» может быть вам полезен. Ниже я перечислил набор решений и методов, которые очень эффективны для устранения этого сообщения об ошибке.

1. Запуск команды с правами администратора —

Как упоминалось ранее в этой статье Utorrent «Процесс не может получить доступ к файлу, поскольку он используется другим процессом», пользователь может столкнуться с этой ошибкой, если у него нет необходимых прав доступа к программному обеспечению и контролю среды, в которой он находится. строительство. Чтобы получить необходимое разрешение, вам нужно открыть командную строку. Обратите внимание, что командную строку необходимо открывать в административном режиме.

    • Одновременно нажмите клавишу Windows и букву R.
    • Введите CMD
    • Открыть его в режиме с повышенными правами
    • По запросу UAC (Контроль учетных записей пользователей) нажмите Да, чтобы предоставить права администратора.
    • Запустите команду еще раз и посмотрите, появилось ли сообщение об ошибке.

    2. Установка нового диапазона IP-адресов —

    Если процесс не может получить доступ к файлу, поскольку он используется другим процессом, проблема с BitTorrent связана с конфликтом IP-адресов, и вы пытаетесь разрешить ее с помощью команды Netsh, тогда может оказаться полезной установка нового диапазона IP-адресов. Ниже приведены команды, которые помогут разрешить конфликт DNS и Quickbook.

    3. Разрешить конфликт портов IIS —

    Если вы получаете эту ошибку BitTorrent: «Процесс не может получить доступ к файлу, потому что он используется другим процессом» при попытке щелкнуть правой кнопкой мыши и открыть веб-сайт в оснастке IIS MMC, попробуйте выполнить следующие команды, чтобы исправить конфликт.

    • Нажмите клавишу Windows и букву R.
    • Введите CMD в поле «Выполнить» и откройте представление с повышенными правами.
    • Введите следующую команду
    • Вернитесь и прокрутите список активных подключений и проверьте, активно ли одни и те же процедуры используют порты 50 и 443.

    • Закройте окно и снова откройте окно "Выполнить", нажав клавишу Windows + R.
    • Введите Regedit и нажмите Enter.
    • В реестре найдите этот путь.
    • Откройте командную строку, запустите эту команду и нажмите клавишу ввода.
    • Введите Y и нажмите Enter, когда вас спросят, хотите ли вы продолжить этот процесс.

    • Закрыть командную строку и вернуться в панель реестра

    *Примечание. Если присутствует подраздел ListenOnlyList и указан адрес 0.0.0.0, вам придется удалить другие IP-адреса.

    • Перезагрузите компьютер
    • Откройте CMD в режиме администратора.
    • Введите эту команду и нажмите Enter
    • Если вы получили это сообщение, запрошенная служба уже запущена.
    • Готово!
    Вывод:

    В этой статье мы обсудили способы устранения сообщения об ошибке Windows «Процесс не может получить доступ к файлу, поскольку он используется другим процессом». Надеюсь, вам понравилась эта руководящая статья.

    Прокомментируйте ниже, если вы столкнулись с какой-либо проблемой при выполнении шагов окна Процесс не может получить доступ к файлу, поскольку он используется другим процессом. Хорошего дня!

    Читайте также: