PasjaGSM.pl
  Jesteś w: Forum > Metody tworzenia nowych plików


Metody tworzenia nowych plików

Forum.PasjaGSM.pl » ...:Sprzęt:... » Nokia » DCT-3 » [DCT3] Modyfikacje HW i SW » NokiX » Programowanie » Metody tworzenia nowych plików
Poprzedni temat «» Następny temat
Autor Wiadomość
 
yak 
Starszyzna



Telefon: Kilka DCT3
Operator: Vodafone
Pomógł: 20 razy
Wiek: 37
Dołączył: 21 Gru 2004
Posty: 774
Skąd: Bochum / Niemcy
Wysłany: 2006-06-01, 13:50   Metody tworzenia nowych plików

Witam.

Na prośbę druidbartka przedstawię dziś krótko różne metody tworzenia plików w file systemie dodawanym przez NokiX'a (TFS).

Różne podejścia podzielić możemy na 3 metody.

1. Obsługa w stylu funkcji biblioteki C.

Programujecie w C, znacie więc pewnie funkcje fopen(), fwrite(), fclose(). TFS również ma takie funkcje. Różnią się troche nazwami oraz parametrami ale główne założenia są te same. Przykładowy kod tworzący plik wygląda tak:

Kod:
static void zapisz_w_stylu_fopen(void)
{
   // deskryptor pliku, jest to zwykla liczba
   int fd;
   
   // otwieramy plik, TFS_CREATERM oznacza ze plik
   // tworzymy, a gdy taki juz istnieje to nadpisujemy
   fd = tfsopen( "test.txt", TFS_CREATERM );

   // prawidlowy deskryptor jest wiekszy od zera
   if( fd>0 )
   {
      char *text = "To jest plik tekstowy.";
     
      // zapisujemy napis do otworzonego pliku
      tfswrite( fd, text, strlen(text) );
     
      // zamykamy plik; to jest najbardziej newralgiczne miejsce
      // bo dopiero tu dane zostaja zapisane do FLASHa; tfswrite()
      // kopiuje je tylko do bufora w RAMie;
      // tfserror() wyswietli komunikat o bledzie gdyby cos
      // poszlo nie tak
      tfserror( tfsclose( fd ) );
   }
   // jesli tfsopen() zwroci wartosc mniejsza od zera to oznacza to
   // blad, tu wyswietlamy komunikat o nim za pomoca tfserror()
   else tfserror( fd );
}


Zaletą tej metody jest to, że jest "znana i lubiana". Sam jednak użyłem jej chyba tylko w jednym miejscu. Główną wadą jest to że zapisywane dane kopiowane są do bufora w RAMie, jeszcze gorsze jest to, że ten bufor jest powiększany w miarę jak zapisujemy więcej danych. Oznacza to więc rezerwację większego obszaru, skopiowanie danych i zwolnienie starego. Przy dużym pliku łatwo zabraknie nam pamięci.

2. Na szybko.

Tak naprawdę jednak plik możemy stworzyć jedną funkcją:

Kod:
static void zapisz_szybko(void)
{
   char *text = "To jest plik tekstowy.";

   // bezposrednie wywolanie funkcji tfsadd() (w przykładzie
   // zapisz_w_stylu_fopen() wywolywana jest ona przez tfsclose())
   // nie mozna tu podawac flag z tfsopen() typu TFS_CREATERM;
   // funkcja zawsze nadpisuje plik, jesli istnieje
   tfserror( tfsadd( "test.txt", 0, text, strlen(text) ) );
}


tfsadd zarezerwuje miejsce w systemie plików, stworzy plik i zapisze podane dane bezpośrednio do pamięci FLASH. Nie ma tu żadnych buforów pośrednich. Szybko i efektywnie. To zero w parametrach to flagi. Generalnie jest to to samo co w tfsopen z wyjątkiem flag typowych dla tfsopen jak TFS_CREATE czy TFS_RDONLY. Można natomiast podać tu TFS_IPMOD (patrz niżej) czy TFS_HIDDEN.

3. Z opóźnieniem.

Bardzo ciekawa jest ta ostatnia metoda. Przypomina ona drugą ale pozwala rozdzielić proces rezerwowania miejsca od faktycznego zapisu danych. Wygląda to mniej więcej tak:

Kod:
static void zapisz_z_opoznieniem(void)
{
   char *text = "To jest plik tekstowy.";

   // tworzymy plik i rezerwujemy miejsce w systemie plikow
   tfserror( tfsadd( "test.txt", TFS_IPMOD, NULL, strlen(text) ) );
   
   // zapisujemy dane bezposrednio do pliku
   tfsipmod( "test.txt", text, 0, strlen(text) );

   // zamykamy plik; uwaga, po zamknieciu pliku nie beda juz
   // mozliwe dalsze modyfikacje
   tfsipclose( "test.txt" );
}


W tym przykładzie zapisaliśmy cały plik jednym wywołaniem tfsipmod. Ale nie jest to konieczne. Plik można zapisywać kawałkami, oczywiście raz zapisane dane już tam zostaną i nie mogą być nadpisywane.

Metody tej używa menadżer plików podczas odbierania. Najpierw przesyłana jest informacja o nazwie pliku i jego wielkości przez co może on wyświetlić pytanie o akceptację oraz stworzyć plik IPMOD (patrz wywołania tfsadd w przykładzie). Następnie dane przesyłane są kawałkami, po kilkaset bajtów. Te kolejne paczki zapisywane są funkcją tfsipmod. Dzięki temu można przesłać bardzo duże pliki bez względu na dostępną ilość RAMu.

We wszystkich przykładach używałem funkcji tfserror. Jako jedynego parametru oczekuje ona kodu błędu zwracanego przez większość funkcji TFS. Jeśli kod rozpozna jako błąd to wyświetli komunikat na ekranie. Jeśli nie to nie robi nic. Sam kod jest jednocześnie zwracany przez tą funkcję także jest ona jakby przezroczysta.

Narazie to tyle. Omówienia wymaga jeszcze czytanie plików które też może być zrobine na kilka sposobów i w którym trzeba na pewne rzeczy uważać.

Piszcie komentarze niżej, będę odpowiadał na pytania które ten krótki tekst (mam nadzieję) zrodzi.

Acha, no i czytajcie dokumentację. Oparłem ją na oficjalnej dokumentacji TFS'a więc jest dość obszerna.

http://nokix.pasjagsm.pl/...lude/tfs-h.html

Pozdrawiam
[Yak]
_________________
NokiX Ci się podoba? Kliknij i wyraź to!
^
 
 
 
     
AdSense


cieszak 
Starszy Użytkownik
100% Cieszaka



Telefon: HTC HD7
Operator: Orange
Pomógł: 17 razy
Wiek: 33
Dołączył: 01 Mar 2005
Posty: 247
Skąd: Olsztyn
Wysłany: 2006-07-17, 02:12   

Witam

Czy będą (kiedyś) jakies wbudowane funkcje obsługi plików tekstowych? Np. ile jest wierszy w pliku, wczytanie konkretnego wiersza, zapisanie wiersza... Sam zacząłem już cos takiego pisać, ale może już ktoś coś takiego napisał?
_________________
http://cieszak.eu
CrystalCode Studio - aplikacje, strony www, urządzenia elektroniczne, pomoc techniczna, konsultacje
^
 
 
  Skype
     
yak 
Starszyzna



Telefon: Kilka DCT3
Operator: Vodafone
Pomógł: 20 razy
Wiek: 37
Dołączył: 21 Gru 2004
Posty: 774
Skąd: Bochum / Niemcy
Wysłany: 2006-08-05, 20:55   

cieszak, narazie nic takiego nie planowalem. Jeśli jednak coś takiego napiszesz to łatwo możemy dorzucić to potem do skryptu LOCATE_OWN.rx aby bylo automatycznie wstawiane do flasha w razie potrzeby.
_________________
NokiX Ci się podoba? Kliknij i wyraź to!
^
 
 
 
     
cieszak 
Starszy Użytkownik
100% Cieszaka



Telefon: HTC HD7
Operator: Orange
Pomógł: 17 razy
Wiek: 33
Dołączył: 01 Mar 2005
Posty: 247
Skąd: Olsztyn
Wysłany: 2006-08-12, 12:36   

w skrypcie keys mam plik tfstext.c z kilkoma funkcjami, narazie jest tylko odczyt, i dopisywanie na końcu pliku. Zrobiłem już zapisywanie i wstawianie, ale narazie musze wyeliminować wszystkie błędy, no i sprawić żeby działało poprawnie :)

[ Dodano: 2006-08-12, 13:29 ]
Mam taki problem. Mam funkcję tfstextappendln(TFILE *fp, char *text); która dopisuje jedną linię do pliku tekstowego. Z tym że po wywołaniu jej (po dopisaniu czegoś do pliku) pierwotna wartość TFILE *fp jest tracona (tzn nie wskazuje już na ten plik). Dokładniej wartość ta tracona jest w miejscu zamykania pliku:
Kod:

tfstextappendln(TFILE *fp; char *text)
{
   int fd=tfsopen(name, TFS_APPEND|TFS_CREATE);
(...)
   tfswrite(fd, text, strlen(text));
(...)
//tu tfspath(fp)=/nazwa_pliku
   tfsclose(fd);
//tu tfspath(fp)=<NULL>
(...)
}


Czy jest możliwość jakiegoś odtworzenia wskaźnika na ten plik to po jego zamknięciu (oprócz zapamiętania jego nazwy a później odczytania wskaźnika przez tfsstat) ?
_________________
http://cieszak.eu
CrystalCode Studio - aplikacje, strony www, urządzenia elektroniczne, pomoc techniczna, konsultacje
^
 
 
  Skype
     
yak 
Starszyzna



Telefon: Kilka DCT3
Operator: Vodafone
Pomógł: 20 razy
Wiek: 37
Dołączył: 21 Gru 2004
Posty: 774
Skąd: Bochum / Niemcy
Wysłany: 2006-08-12, 13:42   

cieszak, hmm, nie, tfsstat() jest wlasnie do tego.

Unieważnienie wskaźnika jest czymś jak najbardziej naturalnym. Plik został zmieniony a więc (ze względu na zasadę działania flash-a) musi zostać przeniesiony w nowe miejsce. Moim zdaniem wskaźniki nie powinny być używane w funkcjach, które zmieniają plik. Lepiej podawać ścieżkę. Nie będzie takich problemów.

Chciałbym jednak coś zauważyć. Takie dodawanie po jednej lini może być troche problematyczne dla systemu plików. Dla każdego wywołania tej funkcji we flashu zostanie stworzona kopia całego pliku ale z dopisaną linią. System plików bowiem zawsze gwarantuje, że plik znajduje się w nim w jednym bloku (nigdy nie jest dzielony). Po kilku takich operacjach dopisania linii może zostać wywołana defragmentacja. Po następnych kilku ponownie. Dobrze byłoby zastosować jakiś cache'ing w RAMie aby jak najwięcej informacji było zapisywane do flasha za jednym razem.
_________________
NokiX Ci się podoba? Kliknij i wyraź to!
^
 
 
 
     
cieszak 
Starszy Użytkownik
100% Cieszaka



Telefon: HTC HD7
Operator: Orange
Pomógł: 17 razy
Wiek: 33
Dołączył: 01 Mar 2005
Posty: 247
Skąd: Olsztyn
Wysłany: 2006-08-12, 14:00   

W sumie w keys, to linia jest dodawana tylko przy dodawaniu aplikacji, więc i tak to będzie tylko otwarcie dopisanie i zamknięcie. Więc może na początku w INIT otworzyć plik, i przy wyjściu zamknąć. Chyba nie będzie żadnych problemów?

No to mam dylemat:) na początku te funkcje miały jako argumenty właśnie ścieżki do plików, ale myślałem że moze lepiej by było na TFILE* (bo nie będzie problemy za alokacją pamięci na nazwy - chociaż właśnie sobie przejrzałem jak wygląda struct tfshdr i tam jest też nazwa pliku trzymana). No to chyba najlepszym rozwiązaniem tych funkcji było by żeby argumentem był deskryptor otwartego już pliku. I chyba w tym kierunku się skieruję :)
_________________
http://cieszak.eu
CrystalCode Studio - aplikacje, strony www, urządzenia elektroniczne, pomoc techniczna, konsultacje
^
 
 
  Skype
     
yak 
Starszyzna



Telefon: Kilka DCT3
Operator: Vodafone
Pomógł: 20 razy
Wiek: 37
Dołączył: 21 Gru 2004
Posty: 774
Skąd: Bochum / Niemcy
Wysłany: 2006-08-12, 16:28   

cieszak, deskryptor ma właśnie tę zaletę, że podczas defragmentacji wszystkie otwarte deskryptory są uaktualniane (jeśli pozycja otwartego pliku w systemie plików uległa zmianie). Dlatego będzie to chyba dobry pomysł. Z drugiej jednak strony tfswrite() jest dość pamięciożerna (kopiuje cały plik do RAMu).

[ Dodano: 2006-08-24, 04:50 ]
W nowej wersji systemu plików funkcje operujące na plikach za pomocą deskryptorów zostaną wzbogacone o specjalny, pamięciooszczędny system buforowania operacji zapisu. Dzięki temu będzie można spokojnie operować nawet na plikach przekraczających rozmiarem dostępną pamięć RAM. System sam zadba o to, aby w razie braku pamięci zapisać zgromadzone dane w pamięci flash. Operację tę będzie można także wymusić nową funkcją tfsflush().

Narazie jestem w fazie testów tego algorytmu.
_________________
NokiX Ci się podoba? Kliknij i wyraź to!
^
 
 
 
     
cieszak 
Starszy Użytkownik
100% Cieszaka



Telefon: HTC HD7
Operator: Orange
Pomógł: 17 razy
Wiek: 33
Dołączył: 01 Mar 2005
Posty: 247
Skąd: Olsztyn
Wysłany: 2007-01-15, 01:47   

Właśnie wróciłem trochę do programowania mojej 3330 i znowu jest problem, czy TFS_CREATERM aby na pewno działa tak jak powinno, tzn jeśli plik istnieje to go usuwa?
U mnie aktualnie działa tak że go nie usuwa a to co zapisuje jest dopisywane na koniec pliku. Czy ktoś spotkał się z czymś takim czy to tylko moja wina? :D
_________________
http://cieszak.eu
CrystalCode Studio - aplikacje, strony www, urządzenia elektroniczne, pomoc techniczna, konsultacje
^
 
 
  Skype
     
Wyświetl posty z ostatnich:   
Odpowiedz do tematu
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Nie możesz załączać plików na tym forum
Nie możesz ściągać załączników na tym forum
Dodaj temat do Ulubionych
Wersja do druku

Skocz do: