Próbuję zarządzać plikami w mojej aplikacji internetowej. Czasami muszę utworzyć plik w folderze (z File.Copy):Plik jest używany przez inny proces po File.Copy
File.Copy(@oldPath, @newPath);
a kilka sekund później, że plik może zostać usunięty:
if (File.Exists(@newPath)) {
File.Delete(@newPath);
}
Jednak nie wiem dlaczego nowy plik pozostaje zablokowany przez proces serwera (IIS, w3wp.exe) po File.Copy. Po File.Delete otrzymuję wyjątek:
"Proces nie może uzyskać dostępu do pliku, ponieważ jest on używany przez inny proces."
Według Api plik File.Copy nie blokuje pliku, prawda?
Próbowałem zwolnić zasoby, ale nie zadziałało. Jak mogę to rozwiązać?
ZAKTUALIZACJA: Rzeczywiście, używając Process Explorer plik jest blokowany przez proces IIS. Próbowałem zaimplementować kod kopiowania w celu uwolnienia zasobów ręcznie, ale problem nadal jest długa:
public void copy(String oldPath, String newPath)
{
FileStream input = null;
FileStream output = null;
try
{
input = new FileStream(oldPath, FileMode.Open);
output = new FileStream(newPath, FileMode.Create, FileAccess.ReadWrite);
byte[] buffer = new byte[32768];
int read;
while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
{
output.Write(buffer, 0, read);
}
}
catch (Exception e)
{
}
finally
{
input.Close();
input.Dispose();
output.Close();
output.Dispose();
}
}
Więc co to jest za plik? Najwyraźniej nie byłoby po prostu bezcelowe tworzenie pliku, którego nic więcej nie używa, aby usunąć go kilka sekund później, więc coś musi z niego korzystać. Co to jest? –
Plik pochodzi z innego systemu, więc został w nim zmieniony. Muszę zastąpić stary. Opracowuję system "lustrzany". – jbernal
Być może to podobne pytanie może ci pomóc: http://stackoverflow.com/questions/7937966/ – Bridge