• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Synchronizacja plików (Wspólna edycja) C# Winforms

VPS Starter Arubacloud
0 głosów
273 wizyt
pytanie zadane 19 maja 2023 w C# przez mateusz45 Gaduła (3,240 p.)
Hej, Chcę zbudować program, którego założenie jest proste: ma działał coś jak live share czyli mamy textbox1, który wyświetla tekst pliku plik1.txt no i teraz chce aby po uruchomieniu 2 razy tego programu można było "na żywo edytować plik" czyli edytuje w jednym oknie widzę w drugim edytuję w drugim widzę w pierwszym czyli klasycznie zapis odczyt itp itd. problem pojawia się w tym, że próbuję się do tego zabrać od miesięcy i nie mam pojęcia jak zgrać ze sobą zapis odczyt i to wszystko aby uniknąć: Problemów z zbieganiem się zapisu z odczytem oraz zbiegania się edycji pola tekstowego z wczytywaniem pliku ponadto problemy z uciekaniem kursora na początek itp itd
Wiem że pewnie źle to wytłumaczyłem ale chodzi mi o to że chce zrobić coś w stylu prosty live share taki jak np vs2022 czy vscode ma tylko, że całkowicie na jednej jednostce (komputerze) i na jednym pliku.
komentarz 22 maja 2023 przez Pawel1995 Gaduła (3,810 p.)
Pomijając kwestie kursora, to jak w bocznym wątku odczytujesz plik na bieżąco, to na czym polega problem?

Generalnie kolizje mogą być i samo to w sobie nie jest tragedią.

 

Takim "pseudokodem" to ja bym to zrobił tak:

1. Na starcie programu odpalił osobny wątek na ManagerPliku.

Jakieś dwie zmienne, jedna na kopie odczytanego pliku(np, KOPIA), druga na obecny stan który edytujesz w fromsie(np STAN_OBECNY).

W tym wątku pętla w której jest:

1.1 Odczyt pliku:

1.1.1 Jeżeli odczyt sie uda, to zapis do zmiennej 'KOPIA'

(Jak sie nie uda to trudno świat sie nie wali po prostu nic nie robisz. try{}catch{} sie kłania)

1.2 Porównanie KOPIA do STAN_OBECNY

1.2.1 Jeżeli sie różni to zapisać:

 - albo zapisujesz STAN_OBECNY do pliku(czyli drugi program zaraz go odczyta) oraz KOPIA

- albo z KOPIA do STAN_OBECNY (kiedy to na drugim programie zrobiłeś zmiane)

1.2.2 kiedy zapis do pliku sie nie uda, to nic sie nie dzieje spróbuj ponownie(try{}catch{} itp)

1.3 Jakiś delay, programy raczej nie zostaną uruchomione co do sekundy tak samo. A nawet jeśli to wątki też żyją swoim życiem. Dałbym 500ms na starcie i zobaczył jak działa.

A w programie głównym bieżąca synchronizacja z STAN_OBECNY.

Wstępnie tak bym to zrobił. Naturalnie to jest szkic na kolanie, w praktyce mogłoby być to bardziej złożone. Bardziej mam pytanie czy na pewno pojedyncze nieudane próby odczyt/zapis to problem, jeżeli byś robił je cyklicznie.

 

Innym pomysłem mogłaby być zmienna na potrzeby synchronizacji, jakiś token czy coś.
komentarz 24 maja 2023 przez MikDal Mądrala (5,660 p.)

@mateusz45, jeśli możesz to dodaj kod, który już masz, łatwiej będzie coś zaproponować :). 

komentarz 25 maja 2023 przez mateusz45 Gaduła (3,240 p.)
nie mam żadnego dosłownie okienko z polem tekstowym ale jeśli chodzi o pisanie kodu to ogarniam pętle zmienne if'y biblie do odczytu zapisu itp itd
komentarz 25 maja 2023 przez mateusz45 Gaduła (3,240 p.)

@Pawel1995, wszystko super problem polega na tym że nie wiemy czy zmiana jest dla tego że ktoś w okienku zmienił zawartość (w tedy powinien zapisać) czy dlatego że zmieniła się zawartość pliku (w tedy powinien wczytać do okienka)

komentarz 25 maja 2023 przez MikDal Mądrala (5,660 p.)

nie mam żadnego dosłownie okienko z polem tekstowym ale jeśli chodzi o pisanie kodu to ogarniam pętle zmienne if'y biblie do odczytu zapisu itp itd

@mateusz45, jeżeli faktycznie tak jest, to lepiej jakbyś podzielił swoje pytania na mniejsze. Myślę, że to, co zaproponował @Pawel1995, będzie na początek jak najbardziej ok. Spróbuj poszukać czegoś w Google, a jak się nie uda to na forum :). 

Program, który próbujesz napisać, wydaje się z pozoru prosty, ale zawiera wiele pułapek, które pochodzą ze sposobu obsługi plików przez system operacyjny. Także można się dzięki niemu nauczyć kilku ciekawych rzeczy. Będą to na przykład: blokada pliku do zapisu, którą musi zakład i zdejmować na przemian raz jeden, raz drugi klient. Różne typy otwierania pliku "Read", "Write", "ReadWrite". Synchronizacja tego i łapanie wyjątków, które się pojawią. 

komentarz 26 maja 2023 przez mateusz45 Gaduła (3,240 p.)

Problem polega na tym że to co on napisał robię bez problemu bez pomocy i no zwieszam się na tym że nie wiem jak odróżnić treść zmienioną w polu tekstowym od treści zmienionej w pliku bo jak wiadomo if'y zwracają tylko czy się różni a nie które się różni względem wcześniejszej treści smiley 

komentarz 26 maja 2023 przez MikDal Mądrala (5,660 p.)
Tym bardziej w takim przypadku przydałby się twój kod. Jeśli potrzebujesz takiego rozróżnienia, to jednym z najprostszych rozwiązań będzie trzymanie treści pliku w jednej zmiennej a treść z pola tekstowego w innym. Wtedy za pomocą prostego ifa możesz uzyskać informację, skąd te dane pochodzą. Można również spróbować też bardziej efektywnych metod, jak sprawdzenie daty ostatniej modyfikacji pliku (i porównanie tej ze zmianą przez nas) jak i trzymanie sumy kontrolnej danych w pliku i w polu tekstowym. Takie usprawnienia mogą być potrzebne, gdy program będzie miał do czynienia z dużą ilością danych.
komentarz 26 maja 2023 przez Pawel1995 Gaduła (3,810 p.)

@mateusz45, Tak jak pisał @MikDal "Jeśli potrzebujesz takiego rozróżnienia, to jednym z najprostszych rozwiązań będzie trzymanie treści pliku w jednej zmiennej a treść z pola tekstowego w innym. " a do tego trzecia zmienna np. POPRZEDNI_STAN.

 

Wtedy ustalasz priorytety, co sprawdzasz najpierw. I to wymuszasz, a jeżeli będzie konflikt, wyjątki, itp. to wtedy masz pole do popisu nad managerem obsługi plików ;)

 

Przykład:

if(STAN_Z_FORMSA != POPRZEDNI_STAN)
{
   ManagerPlikow.Zapis = STAN_Z_FORMSA;
   POPRZEDNI_STAN = STAN_Z_FORMSA;
}
else
{
   if(ManagerPlikow.Odczyt != POPRZEDNI_STAN)
   {
      STAN_Z_FORMSA = ManagerPlikow.Odczyt;
      POPRZEDNI_STAN = ManagerPlikow.Odczyt;
   }
}

 

komentarz 31 maja 2023 przez mateusz45 Gaduła (3,240 p.)
Super, Dzięki tego potrzebowałem!

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

+1 głos
1 odpowiedź 196 wizyt
pytanie zadane 26 stycznia 2022 w C# przez mateusz45 Gaduła (3,240 p.)
+1 głos
1 odpowiedź 346 wizyt
pytanie zadane 10 października 2021 w C# przez mateusz45 Gaduła (3,240 p.)
+1 głos
1 odpowiedź 663 wizyt

92,775 zapytań

141,703 odpowiedzi

320,571 komentarzy

62,110 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...