Mam problem z udostępnianiem plików, w którym mój proces próbuje odczytać plik dziennika, podczas gdy obecnie jest otwarty przez NLog. W diagnozowaniu problemu znalazłem coś zaskakującego. Dodaje się nie powiedzie:Udostępnianie plików nie działa zgodnie z oczekiwaniami
using (var fileStream1 = new FileStream("test.file", FileMode.Append, FileAccess.Write, FileShare.Read))
using (var fileStream2 = new FileStream("test.file", FileMode.Open, FileAccess.Read, FileShare.Read))
{
}
Drugi FileStream
konstruktor połączenia nie powiedzie się z:
System.IO.IOException was unhandled
Message=The process cannot access the file 'c:\...\test.file' because it is being used by another process.
Source=mscorlib
StackTrace:
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy, Boolean useLongPath)
at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share)
Dzieje się tak pomimo faktu, że pierwszy FileStream
wskazuje gotowość do dzielenia się lekturą. Co znalazłem jeszcze bardziej zaskakujące było to, że to działa:
using (var fileStream1 = new FileStream("test.file", FileMode.Append, FileAccess.Write, FileShare.Read))
using (var fileStream2 = new FileStream("test.file", FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
}
Um, tak, prosząc więcej dostęp podczas otwierania drugi strumień rzeczywiście omija ten problem. Jestem całkowicie zaskoczony, dlaczego tak jest, i mogę tylko założyć, że coś nie rozumiem. Przeczytałem dokumenty API, ale one po prostu wspierają mój obecny model mentalny, by dowiedzieć się, jak to powinno działać, w przeciwieństwie do tego, jak działa.
Oto kilka cytatów z wspierające docs:
Typowym zastosowaniem tego wyliczenia jest określenie, czy dwa procesy może jednocześnie czytać z tego samego pliku. Na przykład, jeśli plik ma wartość otwarty, a odczyt jest określony, inni użytkownicy mogą otworzyć plik do odczytu , ale nie do zapisu.
Oto kolejna perełka:
Poniższy konstruktora FileStream otwiera istniejący plik i dotacje dostęp tylko do odczytu dla innych użytkowników (odczyt).
FileStream s2 = new FileStream(name, FileMode.Open, FileAccess.Read, FileShare.Read);
Czy ktoś może rzucić jakieś światło na ten problem. Testuję to na .NET 4% Windows XP.
Dzięki. Więc to nieporozumienie jest tak powszechne, że nawet doktorzy są w błędzie/wprowadzają w błąd? –
Masz na myśli "FileShare.Write" w drugim strumieniu, prawda? – rookie1024