Dostęp do pliku na dysku na wyłączność, przez pewien okres czasu

0

Jest program którego zadaniem jest odbieranie strumienia bitów (po TCP) i zapisywanie ich do odpowiednich plików. Dostaję dane partiami, kilkaset razy, za każdym razem 1000 bajtów.
Aby zapisać dane do pliku, najpierw (zanim dostanę jakiekolwiek dane) tworzę FileStream:

_targetFileStream = File.Open(TemporalFilePathAbsolute, FileMode.OpenOrCreate, FileAccess.Write, FileShare.None);

Następnie, za każdym razem jak przyjdą dane, wywoływana jest ta funkcja:

        public async Task WritePartToFileAsync(int partNumber, byte[] partContent)
        {
            FileTransferBegan = true;
            WaitingForValidDownloadSource = false;
            _logger.LogInformation("Writing part " + partNumber + " to file " + TargetFilePathAbsolute.LocalPath);

            if (_targetFileStream == null)
            {
                return;
            }

            try
            {

                int startingPoint = partNumber * TcpConnectionsManager.SizeOfPart;

                int dataToWrite = Math.Min(partContent.Length, TcpConnectionsManager.SizeOfPart);

                _targetFileStream.Seek(startingPoint, SeekOrigin.Begin);
                await _targetFileStream.WriteAsync(partContent, 0, dataToWrite);

                ReceivedParts[partNumber] = true;
                ReceivedPartsCounter++;

                if (ReceivedPartsCounter == ExpectedNumberOfParts)
                {
                    finishDownloading();
                }
            }
            catch (Exception e)
            {
                _logger.LogError("Writing failed: " + e.Message);
                //throw new Exception("Writing to file failed. " + e.Message);
            }

        }

Problem polega na tym, że bardzo często program rzuca w tej funkcji wyjątkami. Najczęściej jest tak, że FileStream zostaje prawidłowo otwarty, następnie dane są prawidłowo zapisywane tak w 1/3, czasem w połowie, po czym nagle okazuje się że plik jest wykorzystywany przez inny proces, albo FileStream jest zamknięty (closed).
Nie mogę dojść dlaczego tak się dzieje. Operacji na plikach dokonuję tylko w jednej klasie, każda instancja tej klasy zajmuje się jednym plikiem. FileStream jest zmienną prywatną, więc nic z zewnątrz nie może jej "zamknąć", a w ramach klasy na 100% jej przedwcześnie nie zamykam. Plik otwieram z parametrem " FileShare.None" co w teorii powinno powstrzymać inne procesy przed używaniem tego pliku na czas kiedy go modyfikuję.
Całość dzieje się pozornie losowo. Czasem działa ok, czasem wcale, czasem plik zapisany jest w połowie.

Ma ktoś jakiś pomysł co tu może być problemem?

0

Bez całego kodu można zgadywać. Masz pewność, że nie wywołujesz ten funkcji równolegle z kilku wątków?

0

Nie próbujesz zapisać w trakcie jak jeszcze pierwszy zapis trwa?
Może lepiej było by robić sobie bufor i zapisywać co 10 tranzakcję i co jakiś okres czasu.

0
mlody_d napisał(a):

Nie próbujesz zapisać w trakcie jak jeszcze pierwszy zapis trwa?

Twoja teoria jest bardzo prawdopodobna, chociaż nie do końca wiem dlaczego tak by to mogło działać. Na załączonym kodzie widać, że używam konstrukcji await przy WriteAsync. Czyli, jeśli dobrze rozumiem, dalszy kod nie wykona się, dopóki partia danych nie zostanie zapisana w pliku? Funkcja WritePartToFileAsync w zostaje z kolei wywoływana synchronicznie, z użyciem .Wait()
Wygląda że jednak się wykona. Zrobiłem w paru miejscach wywołanie synchroniczne i tak jakby coś ruszyło się w dobrą stronę, ale jeszcze to muszę potestować.

1 użytkowników online, w tym zalogowanych: 0, gości: 1