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

Scalanie plików w Borland

dział ogólny

Scalanie plików w Borland

Nowy postprzez TheAmatorPL » środa, 19 listopada 2014, 20:23

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-)
Avatar użytkownika
TheAmatorPL
Bladawiec
Bladawiec
 
Posty: 28
Dołączył(a): wtorek, 18 listopada 2014, 18:44
Podziękował : 10
Otrzymał podziękowań: 0
System operacyjny: windows 7
Kompilator: C++ Builder 2007
Gadu Gadu: 0
    Windows 7Chrome

Re: Scalanie plików w Borland

Nowy postprzez Mironas » środa, 19 listopada 2014, 20:43

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;
 

Za ten post autor Mironas otrzymał podziękowanie od:
TheAmatorPL
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 427
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 17
Otrzymał podziękowań: 61
System operacyjny: Windows 10
Kompilator: C++Builder 10.3 Rio
TMS Components Pack
Gadu Gadu: 0
    Windows XPChrome

Re: Scalanie plików w Borland

Nowy postprzez TheAmatorPL » czwartek, 20 listopada 2014, 18:42

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
Avatar użytkownika
TheAmatorPL
Bladawiec
Bladawiec
 
Posty: 28
Dołączył(a): wtorek, 18 listopada 2014, 18:44
Podziękował : 10
Otrzymał podziękowań: 0
System operacyjny: windows 7
Kompilator: C++ Builder 2007
Gadu Gadu: 0
    Windows 7Chrome

Re: Scalanie plików w Borland

Nowy postprzez Mironas » czwartek, 20 listopada 2014, 19:45

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.
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 427
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 17
Otrzymał podziękowań: 61
System operacyjny: Windows 10
Kompilator: C++Builder 10.3 Rio
TMS Components Pack
Gadu Gadu: 0
    Windows XPChrome

Re: Scalanie plików w Borland

Nowy postprzez TheAmatorPL » czwartek, 20 listopada 2014, 20:20

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 :(
Avatar użytkownika
TheAmatorPL
Bladawiec
Bladawiec
 
Posty: 28
Dołączył(a): wtorek, 18 listopada 2014, 18:44
Podziękował : 10
Otrzymał podziękowań: 0
System operacyjny: windows 7
Kompilator: C++ Builder 2007
Gadu Gadu: 0
    Windows 7Chrome

Re: Scalanie plików w Borland

Nowy postprzez Mironas » czwartek, 20 listopada 2014, 20:26

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.

Za ten post autor Mironas otrzymał podziękowanie od:
TheAmatorPL
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 427
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 17
Otrzymał podziękowań: 61
System operacyjny: Windows 10
Kompilator: C++Builder 10.3 Rio
TMS Components Pack
Gadu Gadu: 0
    Windows XPChrome

Re: Scalanie plików w Borland

Nowy postprzez polymorphism » piątek, 21 listopada 2014, 14:52

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 ;)
C++ Reference - opis wszystkich klas STL-a i funkcji C.

Za ten post autor polymorphism otrzymał podziękowanie od:
TheAmatorPL
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows 7Firefox

Re: Scalanie plików w Borland

Nowy postprzez Mironas » piątek, 21 listopada 2014, 15:25

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.
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 427
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 17
Otrzymał podziękowań: 61
System operacyjny: Windows 10
Kompilator: C++Builder 10.3 Rio
TMS Components Pack
Gadu Gadu: 0
    Windows XPChrome

Re: Scalanie plików w Borland

Nowy postprzez TheAmatorPL » piątek, 21 listopada 2014, 18:54

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 ?
Avatar użytkownika
TheAmatorPL
Bladawiec
Bladawiec
 
Posty: 28
Dołączył(a): wtorek, 18 listopada 2014, 18:44
Podziękował : 10
Otrzymał podziękowań: 0
System operacyjny: windows 7
Kompilator: C++ Builder 2007
Gadu Gadu: 0
    Windows 7Chrome

Re: Scalanie plików w Borland

Nowy postprzez polymorphism » piątek, 21 listopada 2014, 19:30

To forum generalnie dotyczy tylko C++ (ze wskazaniem na środowisko C++ Buildera).
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows 7Firefox

Re: Scalanie plików w Borland

Nowy postprzez TheAmatorPL » poniedziałek, 15 grudnia 2014, 17:35

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.
Avatar użytkownika
TheAmatorPL
Bladawiec
Bladawiec
 
Posty: 28
Dołączył(a): wtorek, 18 listopada 2014, 18:44
Podziękował : 10
Otrzymał podziękowań: 0
System operacyjny: windows 7
Kompilator: C++ Builder 2007
Gadu Gadu: 0
    Windows 7Chrome

Re: Scalanie plików w Borland

Nowy postprzez polymorphism » poniedziałek, 15 grudnia 2014, 18:33

A z czym konkretnie masz problem?
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows 7Firefox

Re: Scalanie plików w Borland

Nowy postprzez Mironas » środa, 17 grudnia 2014, 12:58

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;
 

Za ten post autor Mironas otrzymał podziękowanie od:
TheAmatorPL
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 427
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 17
Otrzymał podziękowań: 61
System operacyjny: Windows 10
Kompilator: C++Builder 10.3 Rio
TMS Components Pack
Gadu Gadu: 0
    Windows XPChrome

Re: Scalanie plików w Borland

Nowy postprzez TheAmatorPL » piątek, 19 grudnia 2014, 19:40

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;
Avatar użytkownika
TheAmatorPL
Bladawiec
Bladawiec
 
Posty: 28
Dołączył(a): wtorek, 18 listopada 2014, 18:44
Podziękował : 10
Otrzymał podziękowań: 0
System operacyjny: windows 7
Kompilator: C++ Builder 2007
Gadu Gadu: 0
    Windows 7Chrome

Re: Scalanie plików w Borland

Nowy postprzez polymorphism » piątek, 19 grudnia 2014, 20:02

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?
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows 7Firefox


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 63 gości

cron