String & Strumień

0

Pochwalony! Mam problemika. Piszę programa, który pakuje kilka plików do jednego pliku :). Na początklu potrzebne mi jest dopisanie jakiegoś tekstu do pliku wyjściowego (tego archiwa). Jeżeli próbuje za pomocą strumieni to zrobić (a dodaje String'a) to w moim archiwym są only połamane znaczki :(. Trzeba to zrobić niestety za pomącą array[0....] of Char; :(:(:(. Czy istnieje spobób na pisanie String'ami w Strumieniu? PS. Nawet jeżeli się uda coś takiego zrobić, jakoś zapisać, nie chce potem kopiować w podobny sposów całych exeków do takiego archiwa... obcina je... ;(;(;(
Pytanie2: Jeżeli ze strumienia odczytuje jakieś dane do zmiennej typu jakiegoś mojego, np. TMajne (0..$FFFF) to taka zmiena dostaje jakąś wartość cyfrową (jest to zapis kilku liter). Jak są one pozapisywane?? Jak to z programu odczytać do np. Label'a?? Z góry wielkie thx z podpowiedzi.

0

A nie lepiej TFileStream'em ?

0

Ale kombinacji.
Po pierwsze: najprostrzy sposób łączenia plików:

  1. Zapisujesz nagłówek pliku (najlepiej jakiś rekord z liczbą zapisanych plików, nazwami plików oraz przesunięciem do miejsca, gdzie się zaczynają w archiwum. Na liczbę plików spokojnie wystarczy Cardinal, na długość pliku Int64. Na nazwę pliku wraz z ew. ścieżką wystarczy ci ShortString. I tak nie może być więcej niż 260 znaków. To 5 mniej nie robi wielkiej różnicy, a ShortString jest normalnie zapisywane).
  2. Zapisujesz po kolei pliki (używasz dowolnego bufora) do archiwum i na koniec aktualizujesz nagłówek, żeby były właściwe przesunięcia (chyba, że wyliczysz to już przed zapisaniem nagłówka).

Co do drugiego, to nie bardzo rozumiem o co chodzi.

0

Pochwalony! Tak nie zabardzo wiem, jak takie archiwum jak Dryobates powiedział zrobić. Ja doszedłem do wniosku, iż na początku pliku, jest napisany jakiś wylosowany numerek. Potem tylko są dawane nazwy pliku i ten właśnie numerek (żeby nie wyszło że w pliku coś źle jest napisane). Mniejsza o to. W tym drugim chodzi o to, że z TFileStream, można czytać do zmiennych liczbowych (literowych oczywiście też), czyli np. Integer. I jeżeli coś odczytam to w Integer'ze jest napisane to w postaci lczbowej, i jak to odczytać do np. Label'a?? :) Dzięki za wszystkie podpowiedzi

0

Co do pierwszego:

type
TNaglowek = record
//Tutaj można ew. jakie
LiczbaPlikow: Cardinal;
end;
TInfo = record
Dlugosc: Cardinal;
Nazwa: ShortString;
Offset: Int64;
end;

implementation

procedure UtworzArchiwum(Pliki: TStrings; Nazwa: string);
var
Archiwum, Plik: TFileStream;
Naglowek: TNaglowek;
Info: TInfo;
i: Integer;
begin
Naglowek.LiczbaPlikow := Pliki.Count;
Archiwum := TFileStream.Create(Nazwa, fmCreate);
Archiwum.WriteBuffer(Naglowek, SizeOf(Naglowek));
// Uzupełnianie nagłówków
for i := 0 to Pliki.Count-1 do
begin
Plik := TFileStream.Create(Pliki.Strings[i], fmOpenRead);
Info.Nazwa := Pliki.Strings[i];
Info.Dlugosc := Plik.Size;
Plik.Free;
Info.Offset := (Pliki.Count-i)*SizeOf(Info);
Archiwum.WriteBuffer(Info, SizeOf(Info));
end;
// Zapis plików
for i := 0 to Pliki.Count-1 do
begin
Plik := TFileStream.Create(Pliki.Strings[i], fmOpenRead);
Archiwum.CopyFrom(Plik, Plik.Size);
Plik.Free;
end;
Archiwum.Free;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
if OpenDialog1.Execute then
begin
ListBox1.Items.Assign(OpenDialog1.Files);
UtworzArchiwum(ListBox1.Items, 'c:\archiwum.ar');
end;
end;

Co do drugiego to po prostu trzeba konwertować.

0

Pochwalony! OK, dzięki Dryobates. Mam jeszcze jedno pytanko, jak zapisywać String'i do TFileStream (niestety nie są one widoczne normalnym pismem tylko znaczkami :(, a chodzi mi o normalne pismo)

0

Musisz przepisywać do tablicy array [0..n] of Char i dopiero zapisywać

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