Myślałem, że to jest całkowicie trywialne zadanie, ale sprawiło mi to trochę bólu głowy. Chciałbym otworzyć plik, aby zapewnić sobie wyłączny dostęp, przetestować pod pewnymi warunkami, a następnie go usunąć.Jak poprawnie otworzyć plik do usunięcia?
Teraz używam podejście 99%:
FileStream s = null;
try {
s = new FileStream (
path,
FileMode.Open,
FileAccess.ReadWrite,
FileShare.None);
// some stuff about the file is checked here
s.Dispose();
// hope the file is not accessed by someone else...
File.Delete (path);
return true;
}
catch (IOException) {
if (s !=null) s.Dispose();
return false;
}
To zazwyczaj działa, ale pomyślałem, że będzie lepszy sposób, który pozwala uniknąć stanu krawędzi.
Otwarcie pliku z flagą DeleteOnClose nie działa, ponieważ wspomniana kontrola (która występuje po otwarciu z już ustawioną flagą usunięcia) może oznaczać, że plik nie powinien zostać usunięty.
Nie jesteś pewien, czy to pomoże, ale czy spojrzałeś na projekt [transakcyjnego menedżera plików] (http://transactionalfilemgr.codeplex.com/) na codeplex? – Oded
Czy próbowałeś otworzyć plik z FileShare.Delete i wywołać File.Delete przed pozbyciem się strumienia? – Fox32
Na czym właściwie polega problem? Pierwszy otwarty może wywołać wyjątek IOException, jeśli plik jest już zablokowany (lub został usunięty przez kogoś innego) w taki sam sposób, jak plik File.Delete. Łapiesz i radzisz sobie z wyjątkiem, więc gdzie to stwarza problem? – Eddy