logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[delphi] nie mogę skopiować kalalogu o nazwie "kopiowan

prokopcio 13 Sty 2009 10:12 1304 5
REKLAMA
  • #1 5991628
    prokopcio
    Poziom 29  
    Posty: 2027
    Pomógł: 39
    Ocena: 143
    Witam.
    Mam bardzo nietypowy problem.... mianowicie piszę aplikację do backupu katalogów w firmie i testowo utworzyłem kilka katalogów i wszystko działa poprawnie z małym wyjątkiem - procedura nie potrafi skopiować folderu jeśli nazywa się "kopiowany" - o co tutaj chodzi ? Jeśli to coś zmienia to jest on w katalogu C:\ANIMEX i kopiowany do katalogu "C:\ANIMEX_ARCH" wszystkie katalogi o innych nazwach kopiują się bezproblemowo np. kopiowany1, kopiowany2 inny1 inny2 - jeśli usunąłem katalog o nazwie "kopiowany" i zmieniłem nazwę któregokolwiek "prawidłowo kopiowanego" na "kopiowany" to windows wywala odrazu błąd, że nie może czytać z pliku lub dysku źródłowego.

    procedure TSDIAppForm.kopiuj(Katalog_zrodlowy,Katalog_docelowy:PChar);
    var R: TSHFileOpStruct;
    begin
    ZeroMemory(@R, sizeof(R));
    with R do
      begin
      Wnd:=GetDesktopWindow();  //oznaczenie uchwytu
      wFunc:=FO_COPY;           //rodzaj operacji
      pFrom:=Katalog_zrodlowy;       //katalog zrodlowy
      pTo:=Katalog_docelowy;    //katalog docelowy
      fFlags:=FOF_NOCONFIRMMKDIR;
      end;
    Try
      SHFileOperation(R)
    Except
      ShowMessage('Błąd podczas kopiowania');
    End;
    end;
  • REKLAMA
  • REKLAMA
  • #3 5993820
    elektryk
    Poziom 42  
    Posty: 11029
    Pomógł: 439
    Ocena: 241
    A jaki błąd zwraca windows? Może kod błędu coś podpowie.
  • REKLAMA
  • #4 5995557
    prokopcio
    Poziom 29  
    Posty: 2027
    Pomógł: 39
    Ocena: 143
    Dzięki za podpowiedzi - błąd znalazłem tzn może nie tyle błąd co rozwiązałem problem jak na innych forach - do każdego łańcucha ścieżki dostępu należy na końcu dodawać #0#0 w innym przypadku potrafią się dziać cyrki - dlaczego ? nie będę wnikał ponieważ już aplikacja działa bez zarzutów.
  • REKLAMA
  • #5 5998422
    Dżyszla
    Poziom 42  
    Posty: 7077
    Pomógł: 1095
    Ocena: 226
    Przekazując parametr PChar, to z samej jego natury wynika, że kończy się #0 (null-terminated string). W jaki więc sposób wywoływałeś funkcję?
  • #6 5999609
    prokopcio
    Poziom 29  
    Posty: 2027
    Pomógł: 39
    Ocena: 143
    tak, kończy się #0 a "ponoć" potrzene jest #0#0 cytat z 4programmers.net :

    Jak w typowych operacjach ShellAPI, ścieżki katalogów (pFrom, pTo) muszą być zakończone podwójnym znakiem o kodzie #0 (własnie dlatego dopisany jest dodatkowy znak #0). Można dokonywać także operacji na wielu plikach jednocześnie, wtedy kolejne sieżki oddziela się znakiem #0.


    Problemu związanego z dodatkowym znakiem #0 nie należy lekcaważyć (wiele razy pojawiał się post na forum - SHFileOperation nie działa) dla przykładu podaje kod powodujący błąd (to, że zazwyczaj w pamięci po ostatnim zerze, jest zazwyczaj następne to tylko zbieg okoliczności) :

    
    procedure Kopiuj();
    var
     R: TSHFileOpStruct;
    const
    // dup:pchar = 'c:\w\1.txt'#0#0'cos dalej w pamieci'; //tak bedzie dzialalo
      dup:pchar = 'c:\w\1.txt'#0'cos dalej w pamieci';  //a tak nie bedzie dzialalo
    begin
    ZeroMemory(@R, sizeof(R));
    with R do
      begin
      Wnd:=GetDesktopWindow();  //oznaczenie uchwytu
      wFunc:=FO_COPY;           //rodzaj operacji
      pFrom:=dup;       //plik-katalog zrodlowy
      pTo:='c:\w\2.txt';    //plik-katalog docelowy
      fFlags:=FOF_NOCONFIRMMKDIR;
      end;
    if (SHFileOperation(R)<>0) then
      ShowMessage('Błąd podczas kopiowania')
    end;
REKLAMA