Przechowywanie pliku w programie.

0

Czy jest jakaś opcja żeby przechowywac plik w programie? i jesli to możliwe wgrać go do pamięci lub mieć dostęp tam gdzie jest przechowywany. Chce żeby ten plik był razem z programem.

1

To zależy do czego Ci on potrzebny;

Jeżeli plik potrzebny jest tylko do odczytu danych, możesz go umieścić w zasobach pliku wykonywalnego oraz ładować do programu na podstawie jego nazwy lub identyfikatora liczbowego; Więcej na ten temat możesz wyczytać w dokumentacji i w materiałach w sieci;

Jeżeli plik ma służyć także do zapisu danych (modyfikacji) to zasoby odpadają, bo póki proces aplikacji działa, blokuje możliwość modyfikacji pliku wykonywalnego, który ten proces uruchomił; W takim przypadku dane będziesz musiał trzymać w zewnętrznym pliku dyskowym i taszczyć go za plikiem exe; Nie jest to złe rozwiązanie, o ile weźmiesz pod uwagę np. ograniczenia narzucone przez UAC lub typ nośnika, z którego uruchamiany jest program;

Tak więc jeśli potrzebujesz konkretnej porady to podaj więcej szczegółów na temat tego programu.

0

Plik ma służyć tylko do odczytu. Są to pewne dane do których muszę mieć dostęp. Jak załądować taki pik za pomocą identyfikatora liczbowego? oraz jak go załączyć.

0

Poczytaj o klasie TResourceStream. W Google jak wspominał @babubabu jest mnóśtwo przykładów. Jeżeli chodzi o identyfikator liczbowy, to za pewne chodzi Ci o konstruktor CreateFromID tej klasy.

1

@piter2004 - w dalszym ciągu nie podałeś jaki to plik, więc nie wiadomo którą klasę wykorzystać; Poza tym, jeżeli ładowanie na podstawie ID zasobu nie jest wymagane to skorzystaj z ładowania na podstawie nazwy (czyli TResourceStream.Create) - będzie czytelniej; Nie wiemy też której wersji Delphi używasz, bo tego też nie podałeś; A różne wersje środowiska posiadają różne RTL i VCL, więc i różne klasy z różną ilością metod są możliwe do wykorzystania;

Niektóre klasy do obsługi plików mogą posiadać w sobie metody ładujące kontent z zasobów; Gdybyś używał Free Pascala, a tym plikiem był konfig w formacie TreeStructInfo, zawartość mógłbyś załadować jedną metodą, bez zbędnych pierdół, strumieni itd.:

var
  tsiConfig: TTSInfoTree;
begin
  tsiConfig := TTSInfoTree.Create();
  try
    tsiConfig.LoadFromResource(HInstance, 'ResConfig', 'RT_TSINFO');  // tyle wystarczy

{..}

Ale nie korzystasz ani z jednego, ani z drugiego, więc albo podaj bardziej szczegółowe informacje na temat środowiska i tego magicznego pliku, albo sam poszukaj odpowiedniej klasy i sposobu na załadowanie zawartości pliku z zasobu.

0

Używam delphi 2009. Plik to zwykły plik binarny gdzie sa zapisane tylko dane hexadecymalnie. Ma on rozmiar $22000 bajtów.

1

Nie ma czegoś takiego jak "zwykły plik binarny" - każdy plik to plik binarny, Twój co najwyżej jest amorficzny;

Podaj strukturę tego pliku i typy danych, które wymagane są do odczytu informacji.

0

Plik jest typem amorficznym. Jest to program wsadowy do układu scalonego który programuje przez usb. Czyli jak go odczytam musze go załadowaywac do pamięci skąd go wyśle poprzez usb.

1

Nie, plik jest amorficzny lub jego zawartość - nie typ :]

W takim razie dane w postaci końcowej jakiego mają być typu? Chodzi o to, jaki typ danych ma być wykorzystany do transmisji; Jeżeli ma to być po prostu ogólny bufor danych (po prostu przesyłasz oryginalną zawartość pliku) to skorzystaj z klasy TResourceStream oraz jej właściwości Memory - ona zwróci wskaźnik na bufor.

0

To jest ogólny bufor danych. Tylko zastanawiam się jak ja mam połaczyć ten plik z moim plikiem wynikowym exe.

2

No to najpierw poczytaj na ten temat, bo wszystko jest w kursach; Nie wiem czy Delphi w wersji którą posiadasz, ma jakieś do tego narzędzie - pod Delphi7 można zrobić to w ten sposób (sposob uniwersalny dla Delphi i Lazarusa):

  • tworzysz plik .rc z informacjami dla kompilatora zasobów (sprawdź w sieci jak wygląda składnia tych plików),
  • odpalasz z konsoli kompilator brcc32.exe, podając w argumencie przygotowany plik .rc, w wyniku czego kompilator zasobów tworzy plik z rozszerzeniem .res,
  • ten plik (.res) dołączasz w kodzie któregoś modułu, przykład: {$RESOURCE MyResource.res};
    Ja to robiłem w ten sposób, ale Delphi które posiadasz może mieć do tego lepsze mechanizmy, niż ręczne tworzenie takich plików; Być może można od razu dołączyć plik .rc, a Delphi go skompiluje i dołączy do programu - nie wiem, FPC posiada taką funkcję (autokompilacji plików .rc przy kompilowaniu całego projektu).
0

No faktycznie jest taka opcja projekt/resources...

0

Jeszcze muszę się dowiedzieć jak skopiować plik pod określony adres w pamięci lub jak odczytać plik odczytujac jak zwykły bajt po bajcie.

0

Zrobiłem :)

         RS := TResourceStream.Create(HInstance,'Resource_1', RT_RCDATA);
         RS.Read(MemoryPointer^,rs.Size);
         RS.Free;
 

Polecam link do tematu resources:
http://lukashp.pl/Artykul/Programowanie/Delphi/delphi-strumienie-tresourcestream

Dziekuję szczególnie furious programming za zaangażowanie w pomoc początkowo byłem przerażony dołaczonym zdjęciem ale faktycznie masz dużą wiedze i chętnie się z nia dzielisz:).

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.