Witam, piszę gdyż nie mogę sobie poradzić z (pozornie błahym) problemem.
Chcę przeprowadzić prostą operację na pliku tekstowym: wczytać go do pamięci, odnaleźć konkretną wartość, zmodyfikować i zapisać. I tu zaczynają się schody, bo okazało się że plik jest dosyć specyficzny.
Żeby zobrazować:
Stwórzcie u siebie plik tekstowy (txt). Otwórzcie go, wklejcie do środka te 2 znaki: '˙ţ' (oczywiście bez cudzysłowy), zapiszcie i zamknijcie. Otwórzcie ponownie i co się okazuje? Plik jest pusty... Nie do końca jednak, jego rozmiar to 2 bajty (czyli te znaki nadal tam są, choć niewidoczne dla systemowego notatnika). Ponadto plik zyskał "ciekawą" właściwość. Wpiszcie do niego dajmy na to wyraz PRZYKŁAD i zapiszcie. Otwórzcie - Nic się nie zmieniło. Jednak jest pewna różnica, rozmiar pliku to 18 bajtów - dziwne bo normalnie powinien zajmować 8! Sprawa wyjaśnia się gdy otworzymy go dowolnym edytorem hex. Okazuje się że przy takim "kodowaniu", między każdy wprowadzony przez nas bajt (czyli literkę), automatycznie wciskany jest pusty bajt (czyli w hexach 00), więc w rzeczywistości wygląda to tak: P R Z Y K Ł A D (+ oczywiście 2 znaki na początku, które są niewidoczne), czego jednak nie widać, gdyż edytory tekstu opuszczają puste bajty.
Teraz do rzeczy (opis problemu):
Jak pisałem chcę ten plik zmodyfikować, ale nie mogę sobie z tym poradzić. Próba wczytania do Memo, RichEdit czy ListBox kończy się niepowodzeniem. Wprawdzie pojawia się kilka znaków (nawet te początkowe '˙ţ' które dla normalnego edytora są niewidoczne). Jednak gdy program natrafia na pierwszy, pusty bajt, przerywa (więc tak na prawdę odczytuje tylko pierwsze 3 bajty!).
Podjęte próby:
Wymyśliłem że otworzę sobie plik jako FileStream, a potem odczytam go w hexach i wtedy zmodyfikuję wedle uznania. Wszystko poszło gładko, tylko że nie wiem jak mam teraz odwrócić proces. Nie mogę po prostu przekonwertować hexów na stringi, gdyż pusty bajt nie ma swojego odpowiednika jako znak garficzny! Taka zamiana może zostać przeprowadzona, ale wtedy puste bajty zostaną opuszczone (widać po sprawdzeniu edytorem hex i znacznie zmniejszonym rozmiarze pliku) - czyli odpada...
Pomysł:
Jest dziwny i "chałupniczy", ale może zadziałać. Mógłbym stworzyć nowy plik i zakodować go (dodając te 2 znaki). Potem otworzyć ten plik edytorem w stylu notatnika (tylko że z poziomu mojego programu), wkleić tekst pochodzący z zakodowanego pliku (lecz pozbawiony pustych bajtów - żebym mógł go normalnie obrabiać w edytorach z Delphi) i zapisać. Wtedy automatycznie zostaną wprowadzone puste bajty. Problem w tym że z edytorami z Delphi to nie działa, bo one nie odczytują tego '˙ţ' jak kodu, tylko jak zwykłe znaki. Jeżeli więc użyję np.
Memo1.Lines.SaveToFile(plik.txt)
Wtedy owszem zawartość zostanie tak zapisana, ale wcześniejszy kod (czy 2 pierwsze bajty) po prostu zniknie, bo zostanie przez Memo nadpisany... Próbowałem też łączyć, to znaczy wrzucałem do memo kod + resztę tekstu, ale ie działa - musi to zostać wykonane stopniowo. Najpierw kod, a gdy zostanie "wchłonięty" do pliku przy jego zapisie - wtedy reszta. No i warunek że musi to być edytor który respektuje te znaki jako kod, a nie zwykłe szlaczki (czy jakiś komponent z Delphi to potrafi?).
Prośba:
Proszę pomóżcie mi to jakoś rozwiązać, może macie inne pomysły jak mógłbym pracować na tym pliku, a później zapisać gotowe zmiany, bez naruszania jego struktury?