2010-01-20 6 views
1

Можно создать дубликат:
Is there a way to check if a file is in use?C# Проблема с открытыми файлами

Есть ли способ, чтобы закрыть файл в C#?

if(File.Exists(TEMP_FILENAME)) 
      File.Delete(TEMP_FILENAME); 

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

Есть ли способ проверить открытые дескрипторы файлов в VS 2008?

+0

вы могли бы разместить код, который приносит вам здесь, может быть ключом к более серьезной проблемой. – gingerbreadboy

ответ

2

Закройте все потоки, используя файл в вашем приложении.

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

+0

Фактически файл является файлом изображения, но на нем я не вызывал метод dispose. Я исправил его, и он начал работать. Спасибо Yuliy – Boolean

+0

, вы, вероятно, все еще хотите сделать проверку на использование - лучше поместить чек сейчас, чем позже вовнутрь. – aronchick

+0

aronchick: лучше обернуть удаление в try-catch, чем делать, если (можно удалить) File.Delete. Это позволяет избежать ошибки TOCTTOU (время проверки на время использования). – Yuliy

1

I ИМЕЛО Это произошло в VS2008 при запуске программы, прекратив выполнение после того, как я открыл файл, а затем снова запустил и попытался что-то сделать с файлом. Когда это произойдет, единственный способ, которым я решил исправить это, - закрыть VS и повторно открыть его или убить процесс * .vshost.exe, чтобы освободить файл. Я никогда не смотрел, почему это происходит, но я предполагаю, что это связано с тем, что фактический процесс, выполняемый как приложение из VS, является файлом * .vshost.exe, который не закрывается, когда вы заканчиваете выполнение вашей программы.

Кроме того, чтобы предотвратить это, всегда либо обязательно закройте свои потоки, либо используйте блок using. Убедитесь, что эта часть вашего кода выполняется до окончания выполнения через VS.

Если это НЕ, что происходит, проверьте ответ, предоставленный mkus, как узнать, заблокировано ли у вашего приложения другое приложение.

+0

Да, это случилось со мной тоже ... Обычно я просто перезапускаю VS. Спасибо за подсказку с остановкой процесса vshost.exe, я попробую в следующий раз, когда это произойдет. –

+0

Я обычно перезапускаю VS в этот момент, и часто мой компьютер тоже, так как я обычно только перезагружаюсь один раз в неделю, это подходящее время для перезапуска и захвата свежего кофе ... Если я прямо посреди моего поезда однако, когда это происходит, намного быстрее просто убить процесс vshost и продолжить то, что я делаю, а не сбрасывать с ног пять минут, ожидая, когда все мои вещи вернутся. –

0

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

см это link

Смежные вопросы