Moving files & folders

I have the following code in my app:

with FOS do
   begin
   Wnd := Self.Handle;
   wFunc := FO_MOVE;
   pFrom := PChar(UserDrive);
   pTo := PChar(Archive);
   fFlags :=  FOF_ALLOWUNDO;
   end;
SHFileOperation(FOS);

The variable UserDrive points to a network folder (ie. \\server1\users\testuser) and Archive points to a local folder (ie D:\Archive). This procedure fails whatever is in the source folder with the error message "Cannot move I: Cannot find the file specified"

Needless to say, there isn't a file called I. Can anyone help?
riccohbAsked:
Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

MotazCommented:
dir you try to use it for files instead of folders?

0
TOndrejCommented:
pFrom and pTo must be double-null terminated strings (multiple filenames separated by null character, the whole string terminated by two null characters).

If you want to pass only single file names they must still be terminated by two nulls.
0

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
MotazCommented:
I test it using real PCHar and it works:

procedure TForm1.Button1Click(Sender: TObject);
var
  FOS: _SHFILEOPSTRUCTA;
  UserDrive, Archive: PChar;
begin
  UserDrive:= StrAlloc(200);
  Archive:= StrAlloc(200);
  StrCopy(Archive, 'C:\Motaz\Temp');
  StrCopy(UserDrive, 'd:\test');
with FOS do
  begin
  Wnd := Self.Handle;
  wFunc := FO_MOVE;
  pFrom := UserDrive;
  pTo := Archive;
  fFlags :=  FOF_ALLOWUNDO;
  end;
SHFileOperation(FOS);
end;
0
Upgrade your Question Security!

Your question, your audience. Choose who sees your identity—and your question—with question security.

TOndrejCommented:
I read this in MSDN documentation for SHFileOperation... I could have made a mistake, sorry. I'm quite busy at the moment, perhaps I didn't read carefully
0
riccohbAuthor Commented:
I think it might be something to do with the fact that I'm copying from a network drive specified by \\servername\d$\foldername. If I manually map a drive to this address and run SHFileOperation via the mapped drive letter it works.

I've used Motaz's amended code without using a mapped drive letter, and the error comes back.
0
geobulCommented:
Hi,
There are two possible reasons at least:
1. You do not write the correct path '\\server\path'.
2 You do not have permisions on that folder.

The code works fine with such syntax.

Regards, Geo
0
riccohbAuthor Commented:
It's definitely the correct path, and I have Domain Admin permissions. Domain Admins have full control of the folder. The code works in so far that it successfully moves all the files and folders from the source to the destination - it's just that once it's done that it looks like it tries to copy one extra file with a nonsense filename (eg |A?).
0
pedeCommented:
TOndrej is right about the double termination. Often your string will be followed by zeros because of uninitialized memory, but you really should add that extra #0.
0
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
Delphi

From novice to tech pro — start learning today.

Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.