Kopiowanie i usuwanie pliku ze spacją w nazwie

0

Cześć,

używam takiego oto zapisu do kopiowania pliku:

if CopyFile(PChar(zrodlo), PChar(cel), false) = true then

gdzie zrodlo i cel to dwie zmienne string oznaczające odpowiednio ścieżki wraz z plikiem (cp d:\plik.txt). Problem zaczyna się gdy trzeba skopiować plik i nazwie ze spacjami (np CopyFile('c:\jakis tam plik1.txt', 'c:\jakis tam plik2.txt'), false). Kopiowanie pliku nie dochodzi do skutku. W jaki sposób można to przeskoczyć? Podobna sytuacja jest gdy stosuję metodę DeleteFile():

DeleteFile(zrodlo);

Również gdy w nazwie pliku jest spacja to nie mogę usunąć pliku. W jaki sposób mogę to wykonać?

Pozdrawiam!

0

Spróbuj dodać nazwy w apostrofy "zrodlo" i "cel"

3

Sprawdziłem pod Lazarusem taki kod:

program copytest;
uses
  Windows;
var
  SourceFileName: String = 'C:\some folder\some file.txt';
  DestFileName: String = 'C:\other folder\some file.txt';
begin
  Windows.CopyFile(PChar(SourceFileName), PChar(DestFileName), False);
  WriteLn('Error code: ', GetLastError());
end.

I działa prawidłowo – plik jest kopiowany, w konsoli wyświetla kod 0 (czyli błąd nie wystąpił).

Możliwe, że program nie posiada uprawnień do modyfikacji w lokalizacji docelowej, przez co CopyFile i DeleteFile nie dają żadnego efektu. A jeśli nie ma podwyższonych uprawnień, to na pewno nie może usuwać plików z dysku C:.

0

Dziękuje za odpowiedzi :)
@Testuser - po co zmienną dodać w apostrofy?
@furious programming - spróbuję ale po kodzie widze że to raczej to samo co mój kod. Dam znać jak poszło.

Bądźcie pozdrowieni :)

0

W tym kodzie:

if CopyFile(PChar(zrodlo), PChar(cel), false) = true then

please, nie dodawaj = true (niepotrzebne).

W tym kodzie:

  Windows.CopyFile(PChar(SourceFileName), PChar(DestFileName), False);
  WriteLn('Error code: ', GetLastError());

brakuje kontroli błędu i GetLastError() jest wywołany w niepoprawny sposób.
Cytuję dokumentację: some functions set the last-error code to 0 on success and others do not.
Czyli w szczególności trzeba by wiedzieć czy CopyFile w przypadku sukcesu ustawia last-error.

A najlepiej napisać (pseudo-kod, bo nie chce mi się odpalać Windows):

if CopyFile(..) then Writeln('Success')
else WriteLn('Error code: ', GetLastError());

Można też spróbować użyć fileutil:
http://wiki.lazarus.freepascal.org/CopyFile

0

W tym kodzie:

if CopyFile(PChar(zrodlo), PChar(cel), false) = true then

please, nie dodawaj = true (niepotrzebne).

To tylko część kodu którą napisałeś poniżej :)

if CopyFile(..) then Writeln('Success')
else WriteLn('Error code: ', GetLastError());

Generalnie kod faktycznie się sprawdza więc problem prawdopodobnie występuje gdzie indziej. Nic - będę szukała dalej. Dzięki za porady :)

0

@Kaska1988: ogólnie chodziło o to, aby odpowiednio zareagować na wartość wzracaną przez CopyFile:

if CopyFile(PChar(Zrodlo), PChar(Cel), False) then
  Write('success')
else
  Write('error: ', GetLastError());

Jeszcze raz sprawdź dokładnie czy parametry są prawidłowe, a plik do skopiowania i katalog docelowy istnieją. Uruchom program i sprawdź, czy skopiowano plik. Jeśli nie skopiowano, uruchom aplikację z prawami administratora i ponów test – jeżeli dane wejściowe są prawidłowe, to plik powinien zostać skopiowany.

W razie czego sprawdź jaki kod zwraca GetLastError i sprawdź w dokumentacji co on oznacza.

0

Hello, okazuje się że chodziło o uprawnienia, np pliki z pulpitu były kopiowane bez problemu ale np z Program Files już nie. Swoją drogą dziwi mnie to, bo skoro mam program uruchomiony na koncie Administratora to powinno wszystko działać bez zarzutu.

0

Mozliwe ze musisz w programie "wystapic o uprawnienia administratora" nawet jesli uruchamiasz jako admin. Jakie api do tego sluzy to trzeba wyguglac - najlepiej od konkretny wybrany katalog.

0

OK dzięki za info :)

1
Kaska1988 napisał(a):

Hello, okazuje się że chodziło o uprawnienia, np pliki z pulpitu były kopiowane bez problemu […]

Katalog zawierający dane z pulpitu fizycznie znajduje się wewnątrz katalogu bieżącego użytkownika, w którym zawsze można modyfikować zawartość.

ale np z Program Files już nie.

A ten katalog nie jest katalogiem użytkownika, dlatego domyślnie nie ma uprawnień do zapisu.

Swoją drogą dziwi mnie to, bo skoro mam program uruchomiony na koncie Administratora to powinno wszystko działać bez zarzutu.

Tak z założenia działa usługa kontroli użytkownika – poczytaj sobie o niej w dokumentacji na msdn.

1

Znalezione hasla pomocnicze do guglowania: UAC, Manifest.

0

Można by było ustawić projekt tak, aby po otwierciu pliku wykonywalnego wyskakiwało okienko do podnoszenia uprawnień. Minusem jest to, że program nie uruchomi się w ogóle, jeśli nie poda się hasełka admina. Tak więc albo będzie działać z najwyższymi uprawnieniami, albo wcale.

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