CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Multi - kopiowanie

Multi - kopiowanie

dział ogólny

Multi - kopiowanie

Nowy postprzez cezarrek » piątek, 27 lutego 2015, 10:49

Cześć
Poniższy przykład robi to, co powinien jednak nie tak jak trzeba. Może ktoś podpowie jak to uporządkować

KOD cpp:     UKRYJ  
     for(int i = ListBox1->Items->Count-1; i >= 0; i--)
     {
     if (ListBox1->Selected[i])
         ListBox2->Items->Add(pathto + ExtractFileName(ListBox1->Items->Strings[i]));

         for(int j=0; j<ListBox2->Items->Count; j++)
         if(CopyFile(ListBox1->Items->Strings[i].c_str(), ListBox2->Items->Strings[j].c_str(),true))
           {
            ShowMessage(L"Plik został skopiowany");
           }
         else ShowMessage(SysErrorMessage(GetLastError()));
      }
 


Dzięki
Avatar użytkownika
cezarrek
Bladawiec
Bladawiec
 
Posty: 14
Dołączył(a): poniedziałek, 12 marca 2012, 15:07
Podziękował : 1
Otrzymał podziękowań: 0
System operacyjny: XP 2002 SP3
Kompilator: BCB 6 Personal
Gadu Gadu: 0
    Windows 7Firefox

Re: Multi - kopiowanie

Nowy postprzez Mironas » piątek, 27 lutego 2015, 11:56

A co powinie robić ten kod?
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: Multi - kopiowanie

Nowy postprzez cezarrek » piątek, 27 lutego 2015, 12:30

Do ListBox1 wczytuję wyszukane pliki w danym katalogu z pełnymi ścieżkami. W tym, że ListBox1 chce zaznaczyć np. 3 pozycje i przekopiować do innego katalogu a wynik tej operacji ma się pojawiać w ListBox2.
Oczywiście chodzi mi kopiowanie tylko tych zaznaczonych i przykład to wykonuje, ale nie mogę dojść do ładu z pętlą.

Rozwiązałem to dodając warunek, ale chyba sposób całej tej mojej metody kopiowania jest jakiś mglisty.

KOD cpp:     UKRYJ  
     for(int i=0;i<ListBox1->Items->Count;i++)
     {
     if (ListBox1->Selected[i])
         ListBox2->Items->Add(pathto + ExtractFileName(ListBox1->Items->Strings[i]));

         for(int j=0; j<ListBox2->Items->Count; j++)
         if(CopyFile(ListBox1->Items->Strings[i].c_str(), ListBox2->Items->Strings[j].c_str(),true))
        if(CopyFile==0)  // <-----------
           {
            ShowMessage(L"Plik został skopiowany");
           return;  // <----------
           }
         else ShowMessage(SysErrorMessage(GetLastError()));
      }
 
Ostatnio edytowano piątek, 27 lutego 2015, 14:16 przez polymorphism, łącznie edytowano 1 raz
Powód: Kod wstawiaj w znaczniki CPP!
Avatar użytkownika
cezarrek
Bladawiec
Bladawiec
 
Posty: 14
Dołączył(a): poniedziałek, 12 marca 2012, 15:07
Podziękował : 1
Otrzymał podziękowań: 0
System operacyjny: XP 2002 SP3
Kompilator: BCB 6 Personal
Gadu Gadu: 0
    Windows 7Firefox

Re: Multi - kopiowanie

Nowy postprzez polymorphism » piątek, 27 lutego 2015, 14:25

KOD cpp:     UKRYJ  
if(CopyFile(...))
        if(CopyFile == 0)  // <--- ???
        { ... }
 

A co to za konstrukcja?
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2157
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 19
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows 7Firefox

Re: Multi - kopiowanie

Nowy postprzez cezarrek » piątek, 27 lutego 2015, 14:43

Też się nad tym zastanawiam no, ale jakoś działa.
Za zadanie ma sprawdzić czy znaczone pliki zostały skopiowane, po czym zatrzymać działanie pętli.
Nic sensownego nie mogę wymyślić
Avatar użytkownika
cezarrek
Bladawiec
Bladawiec
 
Posty: 14
Dołączył(a): poniedziałek, 12 marca 2012, 15:07
Podziękował : 1
Otrzymał podziękowań: 0
System operacyjny: XP 2002 SP3
Kompilator: BCB 6 Personal
Gadu Gadu: 0
    Windows 7Firefox

Re: Multi - kopiowanie

Nowy postprzez Mironas » piątek, 27 lutego 2015, 14:44

Strasznie to skomplikowałeś.
I co to jest if ( CopyFile==0 )?

Zrób tak:
  1. Utwórz 2 zmienne (plik1, plik2) czyli pełne ścieżki do pliku źródłowego i docelowego
  2. Pętla FOR po wszystkich wpisach na ListBox1.
  3. Jeśli wpis jest zaznaczony to:
    1. Przypisz wartości do zmiennych plik1, plik2.
    2. Następnie CopyFile(...)
    3. Jeśli operacja się powiedzie to dodaj wpis plik2 na ListBox2.
    4. Jeśli nie to wyświetl błąd.
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: Multi - kopiowanie

Nowy postprzez polymorphism » piątek, 27 lutego 2015, 14:45

Za zadanie ma sprawdzić czy znaczone pliki zostały skopiowane, po czym zatrzymać działanie pętli.

W takim razie po co ten wcześniejszy warunek (z wywołaniem CopyFile)?
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2157
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 19
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows 7Firefox

Re: Multi - kopiowanie

Nowy postprzez cezarrek » piątek, 27 lutego 2015, 14:58

Próbuję robić coś jak radzi Miranos i nie mogę tego zrobić w jakiś normalny sposób
Avatar użytkownika
cezarrek
Bladawiec
Bladawiec
 
Posty: 14
Dołączył(a): poniedziałek, 12 marca 2012, 15:07
Podziękował : 1
Otrzymał podziękowań: 0
System operacyjny: XP 2002 SP3
Kompilator: BCB 6 Personal
Gadu Gadu: 0
    Windows 7Firefox

Re: Multi - kopiowanie

Nowy postprzez Mironas » piątek, 27 lutego 2015, 15:08

Pokaż kod.
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: Multi - kopiowanie

Nowy postprzez cezarrek » piątek, 27 lutego 2015, 15:32

Ścieżki z plikami źródłowymi są w obiekcie ListBox1 gdzie źródła mogą być oczywiści różne natomiast miejsce docelowe docelowe wyświetlam w ListBox2. Ścieżkę do katalogu pobieram poprzez SelectDirectory + nazwy plików źródłowych.

KOD cpp:     UKRYJ  
     for(int i=0;i<ListBox1->Items->Count;i++)
     {
     if (ListBox1->Selected[i])                                    //pliki źródłowe
         ListBox2->Items->Add(pathto + ExtractFileName(ListBox1->Items->Strings[i]));          //miejsca docelowe

         for(int j=0; j<ListBox2->Items->Count; j++)
         if(CopyFile(ListBox1->Items->Strings[i].c_str(), ListBox2->Items->Strings[j].c_str(),true))       //no i kopiowanie
           {
            ShowMessage(L"Plik został skopiowany");
           }
         else ShowMessage(SysErrorMessage(GetLastError()));
      }
 
Ostatnio edytowano piątek, 27 lutego 2015, 15:38 przez polymorphism, łącznie edytowano 1 raz
Powód: Pisałem, żebyś używał znaczników CPP!
Avatar użytkownika
cezarrek
Bladawiec
Bladawiec
 
Posty: 14
Dołączył(a): poniedziałek, 12 marca 2012, 15:07
Podziękował : 1
Otrzymał podziękowań: 0
System operacyjny: XP 2002 SP3
Kompilator: BCB 6 Personal
Gadu Gadu: 0
    Windows 7Firefox

Re: Multi - kopiowanie

Nowy postprzez Mironas » piątek, 27 lutego 2015, 15:39

Nie robisz tak jak napisałem.

Po co Ci druga, wewnętrzna pętla FOR? To błąd, bo za każdym razem (przy każdej iteracji tej pętli) kopiujesz plik żródłowy na wszystkie już zapisane na ListBox2 pliki.
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: Multi - kopiowanie

Nowy postprzez cezarrek » piątek, 27 lutego 2015, 15:45

No druga pętla jest dla ListBox2 gdyż tam są pliki z miejscem docelowym.
Chodzi jeszcze o to, że tym sposobem następuje próba kopiowania wszystkich plików z ListBox1. Pętla sprawdza każdą pozycję w ListBox1 i Wyrzuca komunikat, że taki plik już istnieje
Avatar użytkownika
cezarrek
Bladawiec
Bladawiec
 
Posty: 14
Dołączył(a): poniedziałek, 12 marca 2012, 15:07
Podziękował : 1
Otrzymał podziękowań: 0
System operacyjny: XP 2002 SP3
Kompilator: BCB 6 Personal
Gadu Gadu: 0
    Windows 7Firefox

Re: Multi - kopiowanie

Nowy postprzez Mironas » piątek, 27 lutego 2015, 16:18

Ale w drugiej pętli nie masz sprawdzania, czy taki plik już był skopiowany czy nie.
Jedyne co ta pętla robi, to powoduje, że każdy pojedynczy plik źródłowy zostaje skopiowany na WSZYSTKIE istniejące już pliki docelowe!

Zrób tak jak proponowałem, a jeśli chcesz sprawdzać czy plik docelowy już istnieje to pomiędzy punktami A i B dodaj:
albo sprawdzenie czy plik docelowy istnieje - funkcją FileExists(...)
albo sprawdzanie czy plik docelowy jest dopisany na ListBox2
... i w zależności od wyniku kopiuj plik lub nie.
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: Multi - kopiowanie

Nowy postprzez cezarrek » piątek, 27 lutego 2015, 22:37

KOD cpp:     UKRYJ  
      for(int i=0;i<ListBox1->Items->Count;i++)
         {
          if(ListBox1->Selected[i])
            {
             String to = pathto + ExtractFileName(ListBox1->Items->Strings[i]);
             if(CopyFile(ListBox1->Items->Strings[i].c_str(), to.c_str(),true))
               {
                ShowMessage(L"Plik został skopiowany");
               }
             else ShowMessage(SysErrorMessage(GetLastError()));
            }
         }
 
Avatar użytkownika
cezarrek
Bladawiec
Bladawiec
 
Posty: 14
Dołączył(a): poniedziałek, 12 marca 2012, 15:07
Podziękował : 1
Otrzymał podziękowań: 0
System operacyjny: XP 2002 SP3
Kompilator: BCB 6 Personal
Gadu Gadu: 0
    Windows 7Firefox

Re: Multi - kopiowanie

Nowy postprzez Mironas » poniedziałek, 2 marca 2015, 10:34

Nie testowałem, ale wygląda dobrze.
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

Następna strona

  • 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 13 gości

cron