Проблема блокировки файлов .NET - PullRequest
2 голосов
/ 11 марта 2010

В настоящее время я делаю следующее:

  • Я создаю файл, используя FileStream, заключенный в тег using() - только создание файла происходит в операторе using.Остальные операторы почти последовательны.
  • Запустите файл, который я создал, используя Process.Start()
  • Считайте небольшую часть метаданных из файла, используя Assembly.ReflectionOnlyLoadFrom()
  • Перечислите запущенные процессы, используя Process.GetProcessesByName
  • Убейте процесс, используя Process.Kill
  • Попробуйте удалить файл, используя File.Delete()

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

Что, черт возьми, может потреблять файл извыше (буквально все есть)?Я установил все ссылки на null и зашел так далеко, что назвал страшных GC.Collect(), и не повезло.

Ответы [ 3 ]

5 голосов
/ 11 марта 2010

Когда вы загружаете сборку, она размещается в текущем домене приложений. Если вы загрузите его, используя ReflectionOnlyLoad(byte[]), он загрузит его как тень и не заблокирует файл.

var bytes = File.ReadAllBytes(path);
var assembly = Assembly.ReflectionOnlyLoad(bytes);

В настоящее время код, блокирующий файл, - Assembly.ReflectionOnlyLoadFrom(), а не запись в файл (при условии, что FileStream удаляется перед попыткой удаления). Файл будет выпущен только после выгрузки домена приложения.

1 голос
/ 11 марта 2010

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

Обратите внимание на окно вывода Visual Studio, вы получите уведомление отладчика, как только он загрузится. Пройдя по коду во время просмотра windwo, вы легко изолируете оператор, который его вызывает.

1 голос
/ 11 марта 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...