CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Scalanie plików w Borland
Strona 1 z 1

Scalanie plików w Borland

Nowy postNapisane: środa, 19 listopada 2014, 20:23
przez TheAmatorPL
Witam serdecznie, mam takie amatorskie pytanie:
posiadam np. 3 pliki binarne w jakims tam jednym folderze , 1.bin / 2.bin / 3.bin i chciałbym je zcalić w jeden plik, zachowując oczywiscie dane z tych plików
oraz kolejność . Może ktoś sie znajdzię , kto wie jak napisać taka aplikację w Borland? Z góry dziękuję za pomoc. 8-)

Re: Scalanie plików w Borland

Nowy postNapisane: środa, 19 listopada 2014, 20:43
przez Mironas
Tak w skrócie to:
1. Tworzysz strumień
2. Zapisujesz do strumienia:
* informacje o długości pliku
* plik
3. Punkt 2 powtarzasz dla każdego pliku.
4. Zapisujesz strumień do pliku.
5. Kasujesz strumień.

Będziesz potrzebował np.:
KOD cpp:     UKRYJ  
  // utworzenie strumienia
  TMemoryStream* strm = new TMemoryStream();

  // zapis czegoś do strumienia
  strm->Write(...);

  // zapis strumienia do pliku
  strm->SaveToFile(plik);

  // kasowanie strumienia
  delete strm;
 

Re: Scalanie plików w Borland

Nowy postNapisane: czwartek, 20 listopada 2014, 18:42
przez TheAmatorPL
Hmmm, tutaj problemem może być wielkość plików, poniewaz jest rozna , za kazdym razem.
Inaczej to opisze: Mam jakiś tam plik "A", wypakowywuje z niego np 30 plikow binarnych , ponumerowanych od 1 do 30.
Kasuje np. 10 plikow. Zostaje 20 plikow binarnych.
Chcialbym zrobic aplikacje .exe , ktora podczas uruchamiania w folderze z tymi plikami binarnymi ,scali mi te 20 plikow w jeden , z zachowaniem kolejnosci
oraz zawartosci tych 20 plikow binarnych . Oraz co najwazniejsze , jak wypakuje z pliku głównego "B" , tam bedzie inna ilość plików oraz inne wielkości.
Chodzi mi o to , aby programik , odpalany w folderze scalal mi wszystkie pliki binarne w 1 glowny, niezaleznie od ilosci tych plikow oraz wielkosci.
Poprostu nie mam pojecia jak cos takiego zrobic, ucze sie dopiero C++ :o

Re: Scalanie plików w Borland

Nowy postNapisane: czwartek, 20 listopada 2014, 19:45
przez Mironas
W swojej poradzie uwzględniłem, że każdy plik ma inny rozmiar. Właśnie w tym celu w pkt. 2 jest:
Zapisujesz do strumienia informacje o długości pliku.

Najlepiej aby "pole" do zapisu długości pliku miało zawsze ten sam rozmiar (odpowiednio duży).
Możesz też na samym początku zapisywać informację o ilości plików w strumieniu.

Nie da się 'wypakować' pliku ze strumienia (z megapliku). Musisz:
1. Wczytać megaplik do strumienia A.
2. Przepisać strumień A -> B z pominięciem zbędnych plików.
3. Zapisać strumień B do megapliku.

Re: Scalanie plików w Borland

Nowy postNapisane: czwartek, 20 listopada 2014, 20:20
przez TheAmatorPL
Hmmm, ok, ale za kazdym razem ilośc plików tez się zmienia, np. raz jest ich 30 a nastepnym razem 1200.
Chodzi o to , aby aplikacja wykrywala pliki od pierwszego do ostatniego ( kiedy jest ostatni plik ) , i zapisala jako calosc w jednym pliku,
uwzgledniajac numerację , czyli np. od 1 do 1200. Jest jakiś w miare gotowy source code do tego?
Szukałem na necie ale nie mogę znależć do Borlanda :(

Re: Scalanie plików w Borland

Nowy postNapisane: czwartek, 20 listopada 2014, 20:26
przez Mironas
Gotowca nie mam.
Ilość plików też nie ma znaczenia - po to sugerowałem aby zapisywać ilość plików jako pierwsza wartość. Co najwyżej dłużej potrwa zapisywanie tego megapliku.

Re: Scalanie plików w Borland

Nowy postNapisane: piątek, 21 listopada 2014, 14:52
przez polymorphism
Do wyliczania zawartości katalogu możesz użyć funkcji FindFirstFile, FindNextFile i FindClose.

Mironas napisał(a):2. Zapisujesz do strumienia:
* informacje o długości pliku
* plik

Jeszcze przydałoby się zapisać nazwę pliku ;)

Re: Scalanie plików w Borland

Nowy postNapisane: piątek, 21 listopada 2014, 15:25
przez Mironas
polymorphism napisał(a):Jeszcze przydałoby się zapisać nazwę pliku ;)

Słuszna uwaga.
O ile ta nazwa do czegoś będzie potrzebna. Np jeśli pliki będą wypakowywane z megapliku z powrotem na dysk.

Re: Scalanie plików w Borland

Nowy postNapisane: piątek, 21 listopada 2014, 18:54
przez TheAmatorPL
Dziękuję serdecznie za pomoc . 8-)
Na koniec mam jeszcze jedno pytanie ( nie chce zaśmiecać forum nowym wątkiem ):
Czy gdzieś na forum znajdują się również porady dotyczące języka C# , np. pod Visual 2008 ?

Re: Scalanie plików w Borland

Nowy postNapisane: piątek, 21 listopada 2014, 19:30
przez polymorphism
To forum generalnie dotyczy tylko C++ (ze wskazaniem na środowisko C++ Buildera).

Re: Scalanie plików w Borland

Nowy postNapisane: poniedziałek, 15 grudnia 2014, 17:35
przez TheAmatorPL
Nadal mam problem z tym programikiem, nie wiem jak to zrobić :( , szukałem na Forach przykładów,ale ciągle wywala mi błędy.
Jesli ktoś z doświadczonych programistów moglby mi pomoc , bylbym bardzo wdzieczny.
Link: http://www35.zippyshare.com/v/5671294/file.html
Chodzi o to , ze chce zrobic program , aby mi po uruchomieniu w jakikmkolwiek katalogu , łączyl pliki binarne ( 1.bin , 2.bin,itd. w jeden glowny binarny, pod nazwa np. NOWY.bin. Np., to co podałem w linku, tam sa 2 pliki, chcialbym aby je po uruchomieniu aplikacji polaczyc , zachowujac
ich kolejnosc ( aby dodawac do pierwszego drugi , do pierwszego i drugiego trzeci itd.) i zapisac jako NOWY.bin w tymze folderze.
Te pliki wypakowywuje sobie extractorem , i za kazdym razem nazwa folderu sie zmienia ( dlatego chcialem aby mi program wyszukiwal tylko w folderze pliki bin i je łaczyl ), wiec nie mozna podac stalej sciezki do folderu gdzie sa pliki bin. Druga sprawa , to ilosci i wielkosci tych plikow sa rozne, raz jest 30 plikow , raz 1200 plikow , dlatego programik powinien wczytywac od pierwszego do ostatniego wedlug nazwy (kolejnosci ).
Mam nadzieje , ze znajdzie się chętny i mi pomoze, DZIEKUJE BARDZO i POZDRAWIAM SERDECZNIE.

Re: Scalanie plików w Borland

Nowy postNapisane: poniedziałek, 15 grudnia 2014, 18:33
przez polymorphism
A z czym konkretnie masz problem?

Re: Scalanie plików w Borland

Nowy postNapisane: środa, 17 grudnia 2014, 12:58
przez Mironas
TheAmatorPL napisał(a):za kazdym razem nazwa folderu sie zmienia [...] wiec nie mozna podac stalej sciezki

Możesz albo ...
Uruchomić program w odpowiednim katalogu i odczytać ścieżkę do katalogu uruchomieniowego:
KOD cpp:     UKRYJ  
  String katalog = ExtractFilePath(ParamStr(0));
 

albo ...
Uruchomić program w dowolnym katalogu i wybrać odpowiedni katalog za pomocą funkcji SelectDirectory:
KOD cpp:     UKRYJ  
// Unit1.h
#include <FileCtrl.hpp>

// Unit1.cpp
  String katalog;
  SelectDirectory("Wybierz katalog", "", katalog);
 


TheAmatorPL napisał(a):Druga sprawa , to ilosci i wielkosci tych plikow

Pliki w katalogi możesz wyszukać posługując się funkcjami o których wyżej pisał polymorphism lub posłużyć się komponentem TFileListBox:
KOD cpp:     UKRYJ  
  String katalog = ExtractFilePath(ParamStr(0));

  FileListBox1->Mask = "*.bin";  // to możesz ustawić na stałe w Inspektorze Objektów
  FileListBox1->Directory = katalog;
  FileListBox1->Refresh();

  String plik;
  for (int i=0 ; i<FileListBox1->Count ; i++ )
  {
    plik = katalog + FileListBox1->Items->Strings[i];
    [...]
  }
 


Mając nazwę pliku wczytujesz go do strumienia TMemoryStream.

Dodatkowo tworzysz jeden 'megastrumień' do którego będziesz przepisywał dane o wczytanym pliku (nazwa, rozmiar, zawartość). Zawartość przepisujesz z jednego strumienia do drugiego.
Tutaj masz jak się tworzy strumień i kilka jego właściwości i metod jakich będziesz potrzebował:
KOD cpp:     UKRYJ  
  // tworzenie strumienia
  TMemoryStream* stream = new TMemoryStream();

  // najważniejsz metody
  stream->LoadFromFile(...);    // Wczytanie pliku do strumienia
  stream->SaveToFile(...);      // Zapisanie strumienia do pliku
  stream->LoadFromStream(...);  // Wczytanie danych z innego strumienia
  stream->SaveToStream(...);    // Zpisanie danych do innego strumienia
  stream->Clear();              // Wyczyszczenie zawartości strumienia

  // najaważniejsz właściwości
  stream->Size;       // Rozmiar strumienia (czyli np rozmiar wczytaniego pliku)
  stream->Position;   // Pozycja wskaźnika strumienia.
  // czasem aby jakaś operacja wykonała się poprawnie należy przesunąć
  // wskaźnik na początek strumienia:
  stream->Position = 0;

  // usuwanie z pamięci
  delete stream;
 

Re: Scalanie plików w Borland

Nowy postNapisane: piątek, 19 grudnia 2014, 19:40
przez TheAmatorPL
Mironas dziękuje bardzo za pomoc, jak na razie mam programik , który wczytuje 1 plik do strumienia , oraz zapisuje pozniej ze strumienia do katalogu.

KOD cpp:     UKRYJ  
TMemoryStream *ms = new TMemoryStream();
 ms->Position = 0;

 ms->LoadFromFile("C:\\test\\BLOCK.2.bin");
 ms->Position = 0;


  int x = ms->Size;

 TMemoryStream *tmp = new TMemoryStream();
 tmp->Position = 0;
 tmp->CopyFrom(ms, x);
 tmp->SaveToFile("C:\\test\\NOWY.bin");



 delete ms, tmp;

Re: Scalanie plików w Borland

Nowy postNapisane: piątek, 19 grudnia 2014, 20:02
przez polymorphism
Mała uwaga:
KOD cpp:     UKRYJ  
delete ms, tmp;

Ten zapis nie jest tym, czym myślisz, że jest. tmp wcale nie jest usuwane, a to oznacza, że masz wyciek pamięci.


Zamiast zabaw ze strumieniami pamięciowymi od razu użyj strumieni plikowych TFileStream. Po co ładować wszystko do pamięci, jeśli można działać na plikach?