File.Delete не может удалить файл, так как он используется другим процессом

Я получаю сообщение об ошибке, когда перезаписываю файл. И если он все еще работает, не может найти способ закрыть файл. Может кто-то мне помочь, пожалуйста ?

        if (System.IO.File.Exists(Server.MapPath("/html/" + htmlname)))
        {
            System.IO.File.Delete(Server.MapPath("/html/" + htmlname));

            System.IO.File.WriteAllText(Server.MapPath("/html/" + htmlname), mailbody);

        }
        else
        {
            System.IO.File.WriteAllText(Server.MapPath("/html/" + htmlname), mailbody);
        }

person Seration    schedule 12.04.2014    source источник
comment
По моему опыту, статические методы файлового ввода-вывода плохо подходят для удаления дескрипторов файлов. Я бы перешел на использование FileStream и самостоятельное управление ресурсами; вы можете наступить себе на ногу.   -  person Jeff    schedule 12.04.2014
comment
@Джефф, могли бы вы/мы реализовать запись файлов лучше или иначе, чем то, что делает WriteAllText()?   -  person Adriano Repetti    schedule 12.04.2014
comment
@Seration, вы должны сначала найти все места, которые вы записываете в этот файл. Вы пропустили Close()/Dispose()? Есть что-то асинхронное? Без дополнительного контекста вы просто получите 10 000 предложений (и если вы проверите их все, вы можете даже выбрать правильное...)   -  person Adriano Repetti    schedule 12.04.2014
comment
@Adriano Проблема в том, что я пишу файл. нет опций close() или dispose(). Так что я действительно понятия не имею о том, что что-то упустил   -  person Seration    schedule 12.04.2014
comment
Если вы пишете с использованием этих статических методов, вам не нужно закрывать его (они это делают). Вы должны закрыть его, когда у вас есть поток (например, из File.Open). Вы также должны проверить, используете ли вы его асинхронно (например, вы пишете и читаете в разных потоках или нескольких запросах). Это всего лишь (несколько) общих случаев, но трудно выбрать правильный без дополнительной информации (что это за файл? где вы его пишете? где вы его читаете? он используется кем-то другим?   -  person Adriano Repetti    schedule 12.04.2014
comment
Не связанный с вопросом: замените весь свой код одним вызовом WriteAllText. Он перезаписывает.   -  person usr    schedule 12.04.2014
comment
@ Adriano У меня есть страница заказа. Когда я нажимаю кнопку сохранения и отправки почты. Этот код создает файл и сохраняет. После этого, если вы вернетесь на страницу заказа, чтобы отредактировать и сохранить новый файл и почту, это тоже нормально. Это перезаписывается. Но когда я пытаюсь выполнить второе редактирование. Это бум!   -  person Seration    schedule 12.04.2014
comment
@usr Извините, я не понял вашего совета. Не могли бы вы прислать мне пример, пожалуйста?   -  person Seration    schedule 12.04.2014
comment
Удалите все, кроме одного вызова WriteAllText.   -  person usr    schedule 12.04.2014
comment
@ Адриано Дело не в лучшем; эти методы не удаляют ресурсы дескриптора после завершения. Ваш комментарий о том, что они закроют дескриптор файла, вводит в заблуждение, поскольку файл в конечном итоге будет закрыт, но это происходит недетерминировано, когда GC решает удалить.   -  person Jeff    schedule 12.04.2014
comment
@usr это не сработало :/   -  person Seration    schedule 12.04.2014
comment
Это не должно было решить проблему. Это был комментарий, не относящийся к вашей проблеме. Ваша проблема в том, что вы открыли рассматриваемый файл, а не закрыли его. Все экземпляры этого сообщения об ошибке одинаковы для решения: найти, где вы не закрыли файл, или найти другое приложение, которое держит его открытым. Мы не можем помочь вам в этом, потому что не знаем всех мест, где вы получаете доступ к файлу.   -  person usr    schedule 12.04.2014
comment
@Adriano Так неужели нельзя закрыть файл с помощью ? Или что мне делать?   -  person Seration    schedule 12.04.2014
comment
@Seration, вы не можете принудительно закрыть файл, потому что код, который его открыл, полагается на то, что он останется открытым. Управление файловыми дескрипторами является совместным. Вы не можете вытащить ресурсы из-под ног других частей вашего приложения. Найдите, где вы не закрыли этот файл. Устраняйте первопричину, а не симптом.   -  person usr    schedule 13.04.2014


Ответы (1)


Взято с msdn.com, в котором говорится, что: «Указанный файл используется. -или- В файле есть открытый дескриптор, а операционная система — Windows XP или более ранняя версия. Этот открытый дескриптор может быть результатом перечисления каталогов и файлов. . Для получения дополнительной информации см. Как: перечислить каталоги и файлы».

взгляните на это: http://msdn.microsoft.com/en-us/library/system.io.file.delete.aspx

Кроме того, самостоятельный поиск окажется эффективным в долгосрочной перспективе.

С наилучшими пожеланиями.

person lauCosma    schedule 12.04.2014
comment
Вы можете быть правы, но это какое-то большое предположение (особенно если предположить, что он использует XP на рабочем сервере или для разработки). - person Adriano Repetti; 12.04.2014
comment
Я действительно не думаю, что при использовании File.Delete и исключении IOException это предположение. Скорее всего, он протестировал код, и там есть открытый дескриптор (или он просматривает его в блокноте), и есть этот надоедливый дескриптор. - person lauCosma; 12.04.2014
comment
Предполагается, что дескриптор исходит из перечисления, а ОС — Windows XP. Если вы удалите это, вы просто скажете, что ваш файл где-то используется, ищите, где вы его используете. Маловато для ответа... - person Adriano Repetti; 12.04.2014
comment
Этот ответ является лучшим, на который можно ответить, учитывая, что у нас нет дополнительной информации. Просто где-то есть открытая ручка. Он должен найти его. Конец истории. - person usr; 12.04.2014