ProgressBar, TMemo, FTP

0

Witam. Dwa pytania.

  1. ProgressBar - Przez ShellExecute odpalam plik np. test.bat który wywołuje skrypt odpowiadający za spakowanie zipem jakiegoś katalogu. Jak do tego podpiąć ProgressBar. Czyli chce aby progressbar się ładował zgodnie z działaniem pliku *.bat. Raczej pewnie tego nie wychwycimy to może drugi sposób, może program niech sprawdzi czy dalej jest odpalony plik *.bat, jak nie to uzupełni progressbar. Jak sprawdzić czy coś jest jeszcze odpalone.
  2. TMemo - jak wylistować do TMEMO zawartość katalogu. Chce widzień w tmemo lub jakimś innym kompnencie zawartość katalogu
  3. I ostatnie. Po utworzeniu pliku zip czyli takowego backupu chce dany plik wysłać na serwer poprzez FTP. To akurat proste, z tym że za każdym razem tworzy się plik o innej nazwie na podstawie daty. Tak więc dzisiaj plik nazywa się 02.02.2020.zip a jutro będzie to plik 03.02.2020. Jak teraz zautomatyzować procedurę wysyłania pliku przez ftp aby program wiedział który plik wysłać. Nie chce słać całego katalogu i nie chce aby cały czas plik zapisywał się w jednej nazwie bo chcę mieć co dziennie archiwizację.

Dzięki z góry za pomoc.

3
lukaszwasz napisał(a):
  1. ProgressBar - Przez ShellExecute odpalam plik np. test.bat który wywołuje skrypt odpowiadający za spakowanie zipem jakiegoś katalogu. Jak do tego podpiąć ProgressBar. Czyli chce aby progressbar się ładował zgodnie z działaniem pliku *.bat. Raczej pewnie tego nie wychwycimy to może drugi sposób, może program niech sprawdzi czy dalej jest odpalony plik *.bat, jak nie to uzupełni progressbar. Jak sprawdzić czy coś jest jeszcze odpalone.

No dobrze, ale który program jest odpowiedzialny za pakowanie zipów? Być może on sam ma jakieś API, dzięki któremu zwraca procesowi-rodzicowi informacje o postępie. Problem tylko jest taki, że używasz skryptu, a nie programu archiwizującego bezpośrednio.

Ogólnie to nie za bardzo jest możliwość wygodnego podłączenia progressbara pod Twój proces pakowania. Możesz skorzystać z pipe'ów i przechwycić output konsoli, następnie go przeparsować, wyłuskać postęp (jeśli jest na bieżąco wyświetlany w konsoli) i na tej podstawie odpowiednio ustawić wartość paska postępu.

A najlepiej to zamiast korzystać z zewnętrznego programu do pakowania, użyj w swoim programie komponentu/klasy do obsługi archiwów. Wszystkie Twoje problemy rozwiążą się samoistnie, bo będziesz miał kontrolę nad całym procesem archiwizowania.

  1. TMemo - jak wylistować do TMEMO zawartość katalogu. Chce widzień w tmemo lub jakimś innym kompnencie zawartość katalogu

W sieci bez problemu znajdziesz gotowce – poszukaj.

  1. I ostatnie. Po utworzeniu pliku zip czyli takowego backupu chce dany plik wysłać na serwer poprzez FTP. To akurat proste, z tym że za każdym razem tworzy się plik o innej nazwie na podstawie daty. Tak więc dzisiaj plik nazywa się 02.02.2020.zip a jutro będzie to plik 03.02.2020. Jak teraz zautomatyzować procedurę wysyłania pliku przez ftp aby program wiedział który plik wysłać. Nie chce słać całego katalogu i nie chce aby cały czas plik zapisywał się w jednej nazwie bo chcę mieć co dziennie archiwizację.

To proste – najpierw określ docelową nazwę pliku na podstawie systemowej daty i zapisz ją do zmiennej pomocniczej, następnie stwórz archiwum, a na koniec wyślij plik na serwer. Podczas wykonywania dwóch ostatnich czynności – tworzenia archiwum i wysyłania pliku na serwer – użyj nazwy ze zminnej. Nic skomplikowanego.

2
  1. Ja ze swojej strony mogę zaproponować zdecydować się na kompresję ZIP (nie 7Zip), która jest natywnie obsługiwana w nowych wersjach Delphi po prostu użyć TZipFile w zdarzeniu OnProgressobsłużyć TProgressBar i nie kombinować z zaprzęganiem zewnętrznych programów. http://docwiki.embarcadero.com/Libraries/Rio/en/System.Zip.TZipFile
  2. Wylistować pliki http://docwiki.embarcadero.com/Libraries/Rio/en/System.IOUtils.TDirectory.GetFiles
    a dla leniwych jeżeli trzeba pokazać listę plików wystarczy TFileListBox http://docwiki.embarcadero.com/Libraries/Rio/en/Vcl.FileCtrl.TFileListBox
  3. Na FTP to w Indy za pomocą TIdFTP wyślesz kilkoma linijkami kodu (też łatwo podpiąć progress bar jeżeli potrzebujesz). W demkach jest przykład (nie wiem dokłanie co tam pokazali) https://github.com/tinydew4/indy-project-demos/tree/master/Indy10
3

Odnośnie kompresji - możesz (jak sugerował powyżej @kAzek) korzystać z wbudowanego w Delphi ZIP'a, ale wcale nie musisz rezygnować z 7zip.

https://code.google.com/archive/p/d7zip/downloads - tutaj jest wrapper do Delphi na 7zip. Ma nawet wsparcie dla progressbara - więc powinno to mieć wszystko, czego Ci do szczęścia potrzeba.

Progress bar

 function ProgressCallback(sender: Pointer; total: boolean; value: int64): HRESULT; stdcall;
 begin
   if total then
     Mainform.ProgressBar.Max := value else
     Mainform.ProgressBar.Position := value;
   Result := S_OK;
 end;

 procedure TMainForm.ExtractClick(Sender: TObject);
 begin
   with CreateInArchive(CLSID_CFormatZip) do
   begin
     OpenFile('c:\test.zip');
     SetProgressCallback(nil, ProgressCallback);
     ...
   end;
 end;
0

Używam zewnętrznego *.bat bo program bedzie działał u 4 różnych ludzi i za każdym razem coś innego będzie zipował ale procedura taka sama wysyła na ten sam serwer. Bat łatwiej zmienić niż kompilować dla każdego soft. Chyba że użyć tzipa z tym że listę plików by wziął z jakiegoś ini.

1
lukaszwasz napisał(a):

Chyba że użyć tzipa z tym że listę plików by wziął z jakiegoś ini.

Zrób sobie prosty konfigurator backupów w postaci okna dialogowego, w którym użytkownik stworzy listę/drzewo plików do archiwizacji. Zawartość zapisz do konfiga (np. XML) i wykorzystaj podczas procesu archiwizacji.

W każdym razie daj użytkownikowi wybrać co ma być umieszczane w backupie.

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