Kopiowanie i usuwanie pliku ze spacją w nazwie

Odpowiedz Nowy wątek
2018-07-11 14:39
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!


Nienawidzę snobizmu, hate'rów... i dzieci NEO
edytowany 2x, ostatnio: furious programming, 2018-07-11 15:50

Pozostało 580 znaków

2018-07-11 15:10
Testuser
0

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

Pozostało 580 znaków

2018-07-11 15:53
1

Które delphi? Dla nowszego, spróbuj tego:

http://docwiki.embarcadero.co[...]n/System.IOUtils.TFile.Delete

Pozostało 580 znaków

2018-07-11 16:10
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:.


edytowany 5x, ostatnio: furious programming, 2018-07-11 18:15

Pozostało 580 znaków

2018-07-13 08:24
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 :)


Nienawidzę snobizmu, hate'rów... i dzieci NEO

Pozostało 580 znaków

2018-07-13 08:57
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

To był tylko szybki test, czy faktycznie plik jest kopiowany. Ale ok – przykład powinien być prawidłowy. - furious programming 2018-07-13 18:05

Pozostało 580 znaków

2018-07-13 09:46
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 :)


Nienawidzę snobizmu, hate'rów... i dzieci NEO
edytowany 2x, ostatnio: furious programming, 2018-07-13 18:05

Pozostało 580 znaków

2018-07-13 18:12
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.


edytowany 1x, ostatnio: furious programming, 2018-07-13 18:13

Pozostało 580 znaków

2018-07-17 09:31
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.


Nienawidzę snobizmu, hate'rów... i dzieci NEO

Pozostało 580 znaków

2018-07-17 10:51
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.

edytowany 1x, ostatnio: vpiotr, 2018-07-17 10:51

Pozostało 580 znaków

2018-07-17 11:42
0

OK dzięki za info :)


Nienawidzę snobizmu, hate'rów... i dzieci NEO

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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