SHFileOperation truncate filename

Hello all,

Is-it normal that SHFileOperation truncate filename when I use it to copy a directory and all his content ?

Ex. : Transactions.DB => Transact.DB
      TempTransac.DB => TempTran.DB

This is the procedure I use to copy the files :

procedure WorkOnFiles(Sender : TForm; xFrom, xTo, xProc : String);
var
  FPath : String;
  fileOp:  TShFileOpStruct;
  fromDir, toDir : Array[0..1000] of Char;
  Proc : UINT;
begin
  FPath := ExtractFilePath(Application.ExeName);
  FillChar(fileOp,SizeOf(fileOp),#0);
  FillChar(fromDir,SizeOf(fromDir),#0);
  FillChar(toDir,SizeOf(toDir),#0);
  StrPCopy(fromDir,xFrom);
  StrPCopy(toDir,xTo);

  Proc := FO_COPY;
  if xProc = 'FO_DELETE' then
    Proc := FO_DELETE
  else
    if xProc = 'FO_COPY' then
      Proc := FO_COPY
    else
      if xProc = 'FO_MOVE' then
        Proc := FO_MOVE
      else
        if xProc = 'FO_RENAME' then
          Proc := FO_RENAME;

  with fileOp do begin
    wnd     := Sender.Handle;
    wfunc   := Proc;
    pFrom   := @fromDir;
    pTo     := @toDir;
    fFlags  := FOF_ALLOWUNDO or FOF_NOCONFIRMATION or FOF_NOCONFIRMMKDIR;
    fAnyOperationsAborted := false;
    hNameMappings         := nil;
    lpszProgressTitle     := nil;
  end;
  SHFileOperation(fileOp);
end;

And here is how I call my procedure :

WorkOnFiles(Self, 'G:\GescomWin\Data\*.*', 'G:\GescomWin\Backup Data\', 'FO_COPY');

Help needed !
Thanks in advance
Oteau
oteauAsked:
Who is Participating?
 
mikepjConnect With a Mentor Commented:
I now see others have also provided new versions but I wanted to see SHFileOperation for myself also.  No file name truncation here (NT4).

type
  TWorkType=(wofCopy,wofDelete,wofMove,wofRename);

procedure WorkOnFiles(Sender : TForm; xFrom, xTo:string; optype:TWorkType);
var
 fileOp:  TShFileOpStruct;
 iProc : UINT;
begin
  case optype of
    wofCopy:iProc:=FO_COPY;
    wofDelete:iProc:=FO_DELETE;
    wofMove:iProc:=FO_MOVE;
    wofRename:iProc:=FO_RENAME;
    else Raise Exception.Create('Unhandled operation');
    end;

 with fileOp do begin
   wnd     := Sender.Handle;
   wfunc   := iProc;
   pFrom   := PChar(xFrom);
   pTo     := PChar(xTo);
   fFlags  := FOF_ALLOWUNDO or FOF_NOCONFIRMATION or FOF_NOCONFIRMMKDIR;
   fAnyOperationsAborted := false;
   hNameMappings         := nil;
   lpszProgressTitle     := nil;
 end;

 SHFileOperation(fileOp);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  WorkOnFiles(self,'c:\tmp\t3\*.*','d:\tmp\t3',wofCopy);
end;

0
 
intheCommented:
hi,
this seems a win9* problem as its fine on nt/2000.

try it like this:

uses shellapi;
procedure WorkOnFiles(Sender : TForm; xFrom, xTo, xProc : String);
var
 FPath : String;
 fileOp:  TShFileOpStruct;
 fromDir, toDir : string;
 Proc : UINT;
begin
 FPath := ExtractFilePath(Application.ExeName);
 FillChar(fileOp,SizeOf(fileOp),#0);
 fromdir := xFrom + #0;
 toDir := xTo + #0;
 if xProc = 'FO_DELETE' then
   Proc := FO_DELETE
 else
   if xProc = 'FO_COPY' then
     Proc := FO_COPY
   else
     if xProc = 'FO_MOVE' then
       Proc := FO_MOVE
     else
       if xProc = 'FO_RENAME' then
         Proc := FO_RENAME;
 with fileOp do begin
   wnd     := Sender.Handle;
   wfunc   := Proc;
   pFrom   := pchar(fromDir);
   pTo     := pchar(toDir);
   fFlags  := FOF_ALLOWUNDO or FOF_NOCONFIRMATION or FOF_NOCONFIRMMKDIR;
   fAnyOperationsAborted := false;
 end;
 SHFileOperation(fileOp);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
WorkOnFiles(Self, 'D:\cvs\*.*', 'D:\CVSBACKUP\', 'FO_COPY');
end;


Regards Barry

ps,
what operating system are you testing this on?
0
 
Slick812Commented:
it seems like you code is OK, here's my version that does not truncate filenames


procedure TForm1.sbut_CopyFilesClick(Sender: TObject);

function CopyIt(Sender : TForm; sFrom, sTo: String; Opp:Integer):Boolean;
const
     ksTitle = 'The Title';
var
shFileOpRec : TSHFileOpStruct ;

begin
sFrom := sFrom+#0;
with shFileOpRec do
         begin
            Wnd    := Sender.Handle ;
            wFunc  := Opp;
            pFrom  := PAnsiChar(sFrom) ;
            pTo    := PAnsiChar(sTo) ;
            fFlags := FOF_ALLOWUNDO or FOF_NOCONFIRMATION or FOF_NOCONFIRMMKDIR;
            hNameMappings:= nil;
            fAnyOperationsAborted:= false;
            lpszProgressTitle:= ksTitle;
          end;
if (SHFileOperation (shFileOpRec) = 0 ) then result:=True else result := False;
if ( shFileOpRec.fAnyOperationsAborted = true ) then
  begin
  Result := False;
   MessageBox(Sender.Handle,'Copy CANCELED',
    'Copy CANCELED',MB_OK or MB_ICONERROR);
  end;
end;

begin
CopyIt(Form1, 'C:\Stuff\*.*', 'E:\Temp Back', FO_COPY)
end;

- - - - - - - - - - - - -
I don't think including
hNameMappings  := nil;
will make a difference? But this works for me on win9x
0
Upgrade your Question Security!

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

 
oteauAuthor Commented:
I'll try all of your version. Thanks a lot.

I run my prog on winnt4 sp6a.

I'll give you news as soon as possible.

Thanks again.
0
 
oteauAuthor Commented:
Another thing : I run those program from a network share.
My server run on Terminal Server.

Does the network drive can cause this problem ??
0
 
mikepjCommented:
Some network OS systems shorten file names.  I have heard of Novell doing this.
0
 
oteauAuthor Commented:
I have tried all of your versions, but nothing work. I'm going to test it locally.

I really don't understand....
0
 
mikepjCommented:
Someone may have said this already but try it on a local (non-network) drive.  I think it's your network OS causing this problem.
0
 
oteauAuthor Commented:
Something really strange is happening :

On test machine, the program truncate filename. But, on client side, all of my instance works perfectly !!!! I have the same configuration on both side, except for service pack (On my machine : sp6a Client : sp4). Is the service pack the reason why it's not working in my developpement environement ????

For the moment, I have no idea. But it works in production. So, I will check later on my netwotk. Project must go on !!!!

Thanks all for your comment.
Oteau
0
 
mikepjCommented:
Maybe.  Most likely your network client software version is the reason for this.

0
All Courses

From novice to tech pro — start learning today.