Solved

Moving files & folders

Posted on 2001-09-18
8
192 Views
Last Modified: 2012-05-04
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?
0
Comment
Question by:riccohb
  • 2
  • 2
  • 2
  • +2
8 Comments
 
LVL 7

Expert Comment

by:Motaz
ID: 6489834
dir you try to use it for files instead of folders?

0
 
LVL 8

Accepted Solution

by:
TOndrej earned 85 total points
ID: 6489842
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
 
LVL 7

Expert Comment

by:Motaz
ID: 6489869
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
Ransomware: The New Cyber Threat & How to Stop It

This infographic explains ransomware, type of malware that blocks access to your files or your systems and holds them hostage until a ransom is paid. It also examines the different types of ransomware and explains what you can do to thwart this sinister online threat.  

 
LVL 8

Expert Comment

by:TOndrej
ID: 6489925
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
 

Author Comment

by:riccohb
ID: 6489971
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
 
LVL 17

Expert Comment

by:geobul
ID: 6490046
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
 

Author Comment

by:riccohb
ID: 6490075
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
 
LVL 1

Expert Comment

by:pede
ID: 6490530
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

Featured Post

PRTG Network Monitor: Intuitive Network Monitoring

Network Monitoring is essential to ensure that computer systems and network devices are running. Use PRTG to monitor LANs, servers, websites, applications and devices, bandwidth, virtual environments, remote systems, IoT, and many more. PRTG is easy to set up & use.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

This article explains how to create forms/units independent of other forms/units object names in a delphi project. Have you ever created a form for user input in a Delphi project and then had the need to have that same form in a other Delphi proj…
Hello everybody This Article will show you how to validate number with TEdit control, What's the TEdit control? TEdit is a standard Windows edit control on a form, it allows to user to write, read and copy/paste single line of text. Usua…
This Micro Tutorial hows how you can integrate  Mac OSX to a Windows Active Directory Domain. Apple has made it easy to allow users to bind their macs to a windows domain with relative ease. The following video show how to bind OSX Mavericks to …
With Secure Portal Encryption, the recipient is sent a link to their email address directing them to the email laundry delivery page. From there, the recipient will be required to enter a user name and password to enter the page. Once the recipient …

777 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question