riswanzaman Ответов: 2

Файл используется каким-то другим процессом при удалении


Всем Привет,
У меня есть веб-приложение на языке C#. Основное использование этого приложения-генерация отчетов. приложение создает временные файлы при создании отчетов. Я хочу удалить 100 лучших файлов из папки Temp. Проблема в том, что я не могу удалить файлы из-за того, что файл используется каким-то другим процессом. пожалуйста, помогите мне

Что я уже пробовал:

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

David_Wimbley

Вам нужно опубликовать свой код, не весь, а соответствующие части, чтобы кто-то даже начал давать вам некоторые рекомендации.

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

riswanzaman

For i As Integer = mcount To mDirectoryInfo.GetFiles().Длина - 1
Dim f As FileInfo = mDirectoryInfo.GetFiles()(i)
Если f.Extension = ".tmp" или f.Extension = ".rpt", то
Файл.Открыть(Ф.Полное Имя, Содержит Filemode.Открыть)
Dim swWriter как новый StreamWriter(f.FullName)
swWriter.WriteLine("бабабаба")
Если f.CreationTime.AddMinutes(5) < DateTime.Ну А Теперь
- Система.GC.Collect();
Системы'.ГК.WaitForPendingFinalizers();
-Файл.Удалить(picturePath);
Системы.ГК.Собирать()
System.GC.WaitForPendingFinalizers()
Файл.Удалить(f.полное имя)
Приставка.WriteLine("Удалено")
Конец, Если
Конец, Если
Следующий

Vincent Maverick Durano

Мы можем посмотреть ваш код? Удаление файла перед удалением должно решить эту проблему.

riswanzaman

For i As Integer = mcount To mDirectoryInfo.GetFiles().Длина - 1
Dim f As FileInfo = mDirectoryInfo.GetFiles()(i)
Если f.Extension = ".tmp" или f.Extension = ".rpt", то
Файл.Открыть(Ф.Полное Имя, Содержит Filemode.Открыть)
Dim swWriter как новый StreamWriter(f.FullName)
swWriter.WriteLine("бабабаба")
Если f.CreationTime.AddMinutes(5) < DateTime.Ну А Теперь
- Система.GC.Collect();
Системы'.ГК.WaitForPendingFinalizers();
-Файл.Удалить(picturePath);
Системы.ГК.Собирать()
System.GC.WaitForPendingFinalizers()
Файл.Удалить(f.полное имя)
Приставка.WriteLine("Удалено")
Конец, Если
Конец, Если
Следующий

Richard Deeming

Зовущий GetFiles() многократное повторение подобных действий крайне неэффективно и может привести к ошибкам - особенно если вы пытаетесь удалить некоторые файлы в цикле.

Замените его For петля и ее первая строка с:

For Each f As FileInfo In mDirectoryInfo.GetFiles()

2 Ответов

Рейтинг:
2

OriginalGriff

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

using (StreamWriter sw = new StreamWriter(pathToFile))
   {
   WriteFile(sw);
   }
То using блок автоматически очистит и закроет файл, а затем избавится от потока при выходе из него - независимо от того, как он будет выведен. Таким образом, сбой кода, который улавливается более высоким уровнем try...catch блок, например, приведет stiopp к тому, что файл будет сохранен и разблокирован.


CS2011

поверьте мне, он понятия не имеет о том, что вы принимаете в своем решении. Смотрите его код в комментарии.

OriginalGriff

Ах милый.
Это ... гм ... довольно бедно, не правда ли?

Я лучше поговорю с этим беднягой.

Рейтинг:
1

OriginalGriff

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

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

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

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

File.Open(f.FullName, FileMode.Open)

Начните с документации файла.Открыть: Файл.Открытый Метод (System.IO) | Microsoft Docs[^] и он очень ясно говорит, что он делает:
Цитата:
Возвращается
файловый поток
Файловый поток, открытый в указанном режиме и пути, с доступом на чтение/запись и не являющийся общим.
Так почему же вы игнорируете этот поток файлов и пытаетесь создать свой собственный в следующей строке?
Dim swWriter As New StreamWriter(f.FullName)
Это будет неудачно, потому что вы только что открыли файл для эксклюзивного доступа в предыдущей строке!
Замените эти две строки следующим текстом:
Using swWriter As StreamWriter = File.Open(f.FullName, FileMode.Open)
    ...
End Using
И поместите свой код для записи файла внутрь, где находится многоточие.
То Using блок автоматически закроет файл, Когда вы закончите с ним, а переменная swWriter выходит за рамки видимости. После Using блок закрывается, вы можете удалить свой файл, безопасно зная, что он больше не используется.

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