Wczytywanie pliku XML otwartego w innym programie skutkuje błędem "Sharing violation"

0

Chciałbym w swojej aplikacji wczytać plik XML. Robię tak:

XmlDocument doc = new XmlDocument();
doc.Load(xmlFilePath);

To normalnie działa jeśli plik XML nie jest otwarty w innym programie.

Jeśli jednak ten plik XML w momencie wywołania doc.Load() jest otwarty w LibreOffice Calc (bo to jest plik typu *.fods - czyli *.ods bez kompresji), to otrzymuję błąd:

IOException: Sharing violation on path E:\GitHub\...\file.fods

Natomiast inna aplikacja (Geany oraz komenda type file.fods w terminalu) nie ma problemu, żeby wczytać ten plik w postaci tekstowej, nawet jeśli plik jest tak samo, aktualnie otwarty w LibreOffice Calc.

Czy jest w C# jakiś inny sposób wczytania pliku *.fods, bez konieczności zamykania tego pliku w LibreOffice Calc?

Próbowałem (z tym samym skutkiem):

using (FileStream xmlFile = File.Open(xmlFilePath, FileMode.Open, FileAccess.Read))
{
    doc.Load(xmlFile);
}

oraz

doc.Load(File.ReadAllText(xmlFilePath));

Tak jakby wszystkie metody wczytywania tekstu w C# nie mogły się wyluzować i pozwolić na odczyt pliku otwartego w innej aplikacji...

0

zgaduje: parametr FileShare ?

0

@Adamek Adam: Niestety nie pomogło:

        using (FileStream xmlFile = File.Open(xmlFilePath, FileMode.Open, FileAccess.Read, FileShare.Read))
        {
            doc.Load(xmlFile);
        }

Dalej Sharing violation.

1
Spine napisał(a):

Tak jakby wszystkie metody wczytywania tekstu w C# nie mogły się wyluzować i pozwolić na odczyt pliku otwartego w innej aplikacji...

W jakiej apliakcji (co nie jest najważniejsze) i w jakim trybie
jeśli tamto otwarcie jest do zapisu, to jest wyłączne, i to jest słuszne *) Np dobrze zaimplementowane edytory jak Notepad ++ tak robią.
Gdyby było do odczytytu, powinno być kompatybilne i z twoim otwarciem do odczytu..

*) są bardziej hardcorowe tryby, używane w plikowych dzielonych baz danych, ale one mówiac koncepcjami C nie są dostępne z stdio.h a tylko z niskopoziomowego io.h . To tak dla poszerzenia teorii, nikt rozsądny po "tamtej" tronie nie będzie stawał na głowę, zmieniał i testował niuanse współbieżności.

1

Wymyśliłem takie obejście i działa :]

string xmlFileClonePath = System.IO.Path.GetTempFileName();
System.IO.File.Copy(xmlFilePath, xmlFileClonePath, true);

XmlDocument doc = new XmlDocument();
doc.Load(xmlFileClonePath);

Kopiowanie pliku nie robi Sharing violation.

0

@Spine:

Coś mi nie gra w tym lekarstwie.
Po pierwsze, że bez diagnozy.
w kilka minut znalałżem toola - nie mam na jego temat głębszego zdania - https://learn.microsoft.com/en-us/sysinternals/downloads/procmon

Po drugie, przypomniałeś mi, że copy chyba rzeczywiście pozwalało kopiowac plik niedostępny legitnymi metodami - co nie gwarantowało jego integralności, można było mieć część bazy plikowej czasowo starszej, część nowszej, bez żadnej informacji

0

@ZrobieDobrze: ten plik XML nie ma więcej niż 100kB.
Jest otwarty w arkuszu kalkulacyjnym tylko podczas pracy nad aplikacją. Normalni użytkownicy nie będą otwierać tego pliku. Apka ładuje sobie jego zawartość tylko raz przy uruchomieniu. Nie martwiłbym się tutaj o integralność itp. W LibreOffice Calc edytujesz komórkę, zapisujesz plik i odpalasz apkę, żeby zobaczyć jak tam się prezentują dane z arkusza. Konieczność zamykania arkusza, żeby zrobić taki prosty test, jest niezasadna.

Jeszcze dodam sprawdzanie, czy trzeba robić tymczasowego klona i będzie OK.

https://stackoverflow.com/questions/876473/is-there-a-way-to-check-if-a-file-is-in-use

0

@Spine:

Zasady ogóle - ja je uważam za słuszne - wypowiedziałem. Chcesz od nich odchodzić, wierząc w prawidłowość metody w danym kontekście - twoja sprawa, może działać, może kopnąć za 2 lata.

Jaką rzeczywistośc biznesową reprezentuje to, że jest długotrwale otwarty w excellu ?
a) albo z pustego konserwatyzmu
b) albo sam siebie lekko okłamujesz, bo jest to "ciągle żywe" otwarcie

0

Plik językowy gry. Jak ktoś będzie uzupełniał języki to chcę wykluczyć błąd wczytywania pliku ze względu na jego otwarcie.

0
Spine napisał(a):

Plik językowy gry. Jak ktoś będzie uzupełniał języki to chcę wykluczyć błąd wczytywania pliku ze względu na jego otwarcie.

Zjeść ciastko i mieć ciastko. Kopiesz się wyłącznie ze swoimi własnymi założeniami, to da się zaplanować po bożemu.

0

@Spine:

Punkty czasowe odczytu i zapisu pliku są wyraźnie określone (start gry, czyjaś decyzja tam gdzie zachodzi edycja) i prawdopodobnie będą zwięzłe w czasie, przy niewygórowanej jak na 2023 objętości

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