TShFileOpStruct - dlaczego błąd?

0

Witam,

Kod poniżej. Mam dwa FileListBoxy (lbSrcFiles i lbDestFiles). Oba maja własciwość MultiSelect na True. Chcę skopiować to, co zaznaczone z okienka lbSrcFiles do lbDestFiles. Czasem działa, nie ma reguły, ale na 80% przypadków dostaję błąd:
"Nie można skopiować plik: Nie można odczytać z pliku lub dysku źródłowego". Pliki nie są zabezpieczone, ani ukryte, czy systemowe. Na komputerze jestem administratorem. Gdzie popełniam błąd?

Delphi 7 PE, Windows XP Pro.

Jacek

{
 Procedura kopiuje wszystkie pliki wybrane na liście plików lbSrcFiles
  (TFileListBox), do lokalizacji wyświetlanej w lbDestFiles (TFileListBox)
}
procedure TMain.btnSrcDestCopyClick(Sender: TObject);
var
  source, destination: PChar;
  i: Integer;
  Sh: TShFileOpStruct;
begin
  if lbSrcFiles.Items.Count = 0 then Exit;
  for i := 0 to lbSrcFiles.Items.Count - 1 do
  begin
    if not lbSrcFiles.Selected[i] then Continue; // element nie jest zaznaczony
    // Kopiowanie
    Sh.Wnd := Handle;
    Sh.wFunc := FO_Copy;
    { Jezeli plik znajduje sie w glownym drzewie to nazwa pliku do skopiowania
      jest tworzona przez dodanie nazwy pozycji do wlasciwosci Directory, jezlie
      nazwa jest w podkatalogu miedzy nazwe katalogu a nazwe pliku wstawiany jest
      backslash; podobnie przy nazwie docelowej
    }
    if Length(lbSrcFiles.Directory) = 3 then
      source := PChar(lbSrcFiles.Directory + lbSrcFiles.Items.Strings[i])
    else
      source := PChar(lbSrcFiles.Directory + '\' + lbSrcFiles.Items.Strings[i]);
    Sh.pFrom := source;

    if Length(lbDestFiles.Directory) = 3 then
      destination := PChar(lbDestFiles.Directory + ExtractFileName(lbSrcFiles.Items.Strings[i]))
    else
      destination := PChar(lbDestFiles.Directory + '\' + ExtractFileName(lbSrcFiles.Items.Strings[i]));
    Sh.pTo := PChar(destination);

    Sh.fFlags := FOF_SIMPLEPROGRESS + FOF_FILESONLY;
    Sh.fAnyOperationsAborted := True;
    Sh.lpszProgressTitle := 'Kopiowanie...';
    // Wykonaj kopiowanie
    SHFileOperation(Sh);
    // Aktualizuj liste plikow
    lbDestFiles.Update;
  end;
end;
0

Chyba najczestszy blad w stosunku do tej funkcji !! Trzeba dokladnie helpa czytac !

Sh.pFrom := PChar(source+#0);
Sh.pTo := PChar(destination+#0); !!

nazwy plikow zakonczone #0 i sama zmienna przechowujaca tez zakonczona #0 !

czyli

plik1#0plik2#0#0

itd !

PS. DO ludzi tworzacych to forum!
loguje sie jest ok (moge "chodzic" zalogowany po forum) jednak po wcisnieciu odpowiedz juz proszony jestem opodanie nicka !?

0

Helpa trzeba czytać, ale tego nie doczytałem, a generalnie opierałem się na przykładach A.Boducha z jego książki, potem przejrzałem to forum i też nie znalazłem przykładu,w którym na końcu byłoby #0. Dlaczego więc wszystkim to działało? Dlaczego u mnie to czasem działało, czasem nie - i to nawet dla tego samego pliku?

Jacek

0

Che che ! no czemu dzialalo a czemu nie to juz zagadka np. u mnie dzialalo na project1.exe ale nie na unit1.dcu (pozwolilem sobie uruchomic i sprawdzic to)

powinno byc gdzies na forum (bo chyba juz o tym wspominalem)! i bardzo czesto widze zle przyklady !!! nawet w profesjonalnych opracowaniach ! (a czytalem o tym jeszcze za czasow win95!! moze wlasnie dlatego ze wprost z MS a nie innych -> a pozniej mowia ze sie windows wiesza ! che che !)

PS. aby sprawdzic co jest nie tak trzeba by bardzo glepoko poszperac po pamieci - ale nie widze sensu chyba ze hobbystycznie (raczej sadystycznie!)

pozdrawiam

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.