Próbuję wykryć, czy plik istnieje w czasie wykonywania, jeśli nie, utwórz go. Jednak pojawia się ten błąd, gdy próbuję do niego napisać:
Proces nie może uzyskać dostępu do pliku „myfile.ext”, ponieważ jest używany przez inny proces.
string filePath = string.Format(@"{0}\M{1}.dat", ConfigurationManager.AppSettings["DirectoryPath"], costCentre);
if (!File.Exists(filePath))
{
File.Create(filePath);
}
using (StreamWriter sw = File.AppendText(filePath))
{
//write my text
}
Jakieś pomysły, jak to naprawić?
File.Create()
metody! Powyższy fragment już tworzy plik!Chcę zaktualizować tę odpowiedź, aby powiedzieć, że nie jest to najbardziej efektywny sposób pisania całego tekstu. Powinieneś używać tego kodu tylko wtedy, gdy potrzebujesz czegoś szybkiego i nieczystego.
Byłem młodym programistą, kiedy odpowiedziałem na to pytanie i wtedy myślałem, że jestem jakimś geniuszem, jeśli chodzi o wymyślenie takiej odpowiedzi.
źródło
FileStream(string, FileMode)
konstruktora i przekazać go FileMode.Create , który nadpisze istniejący plik. Nadal nie ma potrzeby dwukrotnego otwierania pliku. Również ta odpowiedź została zredagowana po tym, jak zamieściłem mój oryginalny komentarz..Close()
na końcu, więc działa w każdym przypadku. Nie ufam systemowi używaniaFileStream
do wszystkiego, ponieważ nie chcę, aby zdarzał się wyjątek,FileMode.Create
że plik już tam jest - zwłaszcza gdy chcę wyczyścić zawartość i nie dołączać do niej za pośrednictwemFileMode.Open
. Dla mnieFileStream
tak naprawdę działa tylko po pozbyciu się danego pliku, a następnie napisaniu do niego. PonieważFile.Create
pozostawia to otwarte i zamknięte, wydaje się, że dodawanie.Close()
do niego jest jedynym prawdziwym sposobem radzenia sobie z moim scenariuszem i SO.Tworząc plik tekstowy możesz skorzystać z następującego kodu:
Używając kodu z Twojego komentarza. Utworzony plik (strumień) musi zostać zamknięty. File.Create zwraca strumień pliku do właśnie utworzonego pliku .:
źródło
File.Create
powracaFileStream
i to maClose()
źródło
File.Create zwraca FileStream. Musisz to zamknąć, gdy napiszesz do pliku:
Możesz użyć do automatycznego zamykania pliku.
źródło
StreamWriter
jak można wywnioskować z jego użyciaFile.AppendText
.Zaktualizowałem Twoje pytanie fragmentem kodu. Po odpowiednim wcięciu od razu widać, na czym polega problem: używasz,
File.Create()
ale nie zamykasz tegoFileStream
, co zwraca.Zrobienie tego w ten sposób jest niepotrzebne,
StreamWriter
pozwala już na dołączenie do istniejącego pliku i utworzenie nowego pliku, jeśli jeszcze nie istnieje. Lubię to:Który używa tego
StreamWriter
konstruktora .źródło
Na to pytanie udzielono już odpowiedzi, ale tutaj jest rozwiązanie ze świata rzeczywistego, które sprawdza, czy katalog istnieje i dodaje na końcu liczbę, jeśli plik tekstowy istnieje. Używam tego do tworzenia codziennych plików dziennika w usłudze Windows, którą napisałem. Mam nadzieję, że to komuś pomoże.
źródło
Wiem, że to stare pytanie, ale chcę po prostu wyrzucić to, z którego nadal możesz korzystać
File.Create("filename")"
, po prostu je dodaj.Dispose()
.File.Create("filename").Dispose();
W ten sposób tworzy i zamyka plik do wykorzystania w następnym procesie.
źródło
File.Create(FilePath).Close();
z powyższej odpowiedzi mathis.Dispose(true); GC.SuppressFinalize((object) this);
w swojej realizacji.Myślę, że znam powód tego wyjątku. Możesz uruchamiać ten fragment kodu w wielu wątkach.
źródło
Spróbuj tego: zadziała w każdym przypadku, jeśli plik nie istnieje, utworzy go, a następnie zapisze do niego. A jeśli już istnieje, nie ma problemu to otworzy się i napisze do niego:
źródło