SHFileOperation - not displaying existing filename on copy

Using W2K, when I use SHFileOperation to copy a file to a floppy, if the file exists, the window displays '' instead of 'filename'.
I am using the TFlyingOp component from Eric Pedrazzi, and need to copy all the zip files from one directory to a:\.

Other windows apps show the duplicate filename OK.

Any ideas anyone?
nigeltoddAsked:
Who is Participating?
 
geobulConnect With a Mentor Commented:
Add FOF_NOCONFIRMATION or FOF_NOERRORUI in fFlags. Not tested, just an idea.

Regards, Geo
0
 
CynnaCommented:
Try this:

procedure CopyFile(FileName, Destination: String);
var buffer: Array [0..1000] of Char;
    p: PChar;
    Fo: TSHFileOpStruct;
begin
  FillChar(Buffer, sizeof(Buffer), #0);
  p := @buffer;
  p := StrECopy(p, Pchar(FileName)) + 1;
  FillChar(Fo, sizeof(Fo), #0);
  With Fo do begin
       Wnd    := Application.Handle;
       wFunc  := FO_COPY;
       pFrom  := @Buffer;
       pTo    := Pchar(Destination);
       fFlags := FOF_NOCONFIRMATION or FOF_RENAMEONCOLLISION;
  end;
  SHFileOperation(Fo);
end;

// DEMO
// -------

procedure TForm1.Button1Click(Sender: TObject);
begin
  CopyFile(ExtractFilepath(Application.ExeName)+'unit1.pas', 'A:\');
end;


It will show you everything during a copy process, regardless of whether the file exist or not on A:\
0
 
CynnaCommented:
geobul was faster - if it works, he gets the points.
0
Free Tool: IP Lookup

Get more info about an IP address or domain name, such as organization, abuse contacts and geolocation.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

 
geobulCommented:
Have you edited the text of the question? It sounds changed to me. You may also post a comment. It's actually the preferred (right?) way.

What is TFlyingOp component supposed to do?

If there is a name collision during the copy what will you want your app to do? Replacing the file without asking, ask the user what to do or something else?

Regards, Geo
0
 
nigeltoddAuthor Commented:
Yes, I have edited the question. TFlyingOp is a wrapper for ShFileOperation, which allows multiple files to be copied. I wish the program to ask what to do if a file exists.

The component is available from : http://www.delphi32.com/vcl/2632/download,xid,2632.asp



0
 
geobulCommented:
The TFlyingOp component uses FOF_ALLOWUNDO or FOF_MULTIDESTFILES (or FOF_NOCONFIRMMKDIR if needed) flags and a list of source files which means that a windows standard 'File Replace Dialog' should be popped up. My Win2K Pro behaves that way. Renaming is not available.

You can modify 'procedure TFlyingOp.FExecuteOp(idOp : UINT);' or write some code yourself if you want another behaviour. For example:

// single file copy with dialogs for replacing and renaming
uses ShellApi;

procedure CopyFile(FileName, Destination: String);
var
  Fo: TSHFileOpStruct;
  NewFileName: string;
  sFrom, sTo: AnsiString;
  CopyYes: boolean;
begin
  NewFileName := Destination + ExtractFileName(FileName);
  CopyYes := true;
  while FileExists(NewFileName) do begin
    if MessageDlg('File '+ NewFileName + ' exists! Replace it?', mtConfirmation, [mbYes, mbNo], 0) = mrNo then begin
      if MessageDlg('Rename the file?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then begin
        NewFileName := InputBox('Renaming file','Enter new filename:',NewFileName);
      end else begin
        CopyYes := false;
        Break;
      end;
    end else begin
      Break;
    end;
  end;
  if CopyYes then begin
    sFrom := FileName + #0;
    sTo := NewFileName + #0;
    With Fo do begin
      Wnd    := Application.Handle;
      wFunc  := FO_COPY;
      pFrom  := PChar(sFrom);
      pTo    := PChar(sTo);
      fFlags := FOF_NOCONFIRMATION;
    end;
    SHFileOperation(Fo);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  CopyFile('c:\test.out', 'A:\');
end;

Regards, Geo
0
 
nigeltoddAuthor Commented:
I have double checked everyhting, and I still lose the actual; duplicate filename. Everything else is exactly as I would expect(and want!).

I think I may have to try another component, as the author has not responded to my email.

Regards,
Nigel
0
 
nigeltoddAuthor Commented:
I have double checked everyhting, and I still lose the actual; duplicate filename. Everything else is exactly as I would expect(and want!).

I think I may have to try another component, as the author has not responded to my email.

Regards,
Nigel
0
 
nigeltoddAuthor Commented:
I have rewritten a bit of code, and used the ShFileOperation function myself. It works fine for the copy(including showing dupe filenames), but if I use following code to delete the files, it always asks if I wiant ot delete files in Recycle Bin!

Any thoughts.


var bk1 : string;
    F : TShFileOpStruct;
begin
  bk1 := extractfilepath(application.exename) + 'Archives';
  fillchar(F, sizeof(F),0);
  F.Wnd := GetActiveWindow;
  F.wFunc := FO_DELETE;
  F.pFrom := PChar(bk1 + '\*.zip' + #0#0);
  F.fFlags := FOF_FILESONLY;
  if ShFileOperation(F) <> 0 then
    if F.fAnyOperationsAborted then
      MessageBox(F.Wnd,Pchar('Operation cancelled by      user'),nil,ID_OK)
    else
      MessageBox(F.Wnd,Pchar('The operation was unsuccessful'),nil,ID_OK);
end;
0
 
geobulCommented:
Hi,

I'm sorry for the delay but I haven't received e-mail notifications.

try:
F.fFlags := FOF_FILESONLY or FOF_NOCONFIRMATION;

Regards, Geo
0
 
nigeltoddAuthor Commented:
adding FOF_NOCONFIRMATION does delete, without the flying window. Without NOCONFIRMATION, it asks "if I want to delete all files from the Recycle Bin?"

Seems weird. This is Win2K Professional, with D5.
0
 
geobulCommented:
That's right. It asks but doesn't put the files in the Recycle Bin actually because there isn't FOF_ALLOWUNDO in the flags.

I'm not able to disable that stupid question and show the progress window in the same time. Sorry.

Regards, Geo
0
 
nigeltoddAuthor Commented:
What a &&^%#@%^A pain!!!

Thanks for your help anyway. If I do find out how to solve it, I'll let you know.
0
 
CleanupPingCommented:
nigeltodd:
This old question needs to be finalized -- accept an answer, split points, or get a refund.  For information on your options, please click here-> http:/help/closing.jsp#1 
EXPERTS:
Post your closing recommendations!  No comment means you don't care.
0
 
geobulCommented:
There was one question in the beginning (answered by me). The question was changed and I answered the second one also: there was no way.
0
 
Lukasz LachCommented:
nigeltodd,
No comment has been added lately (15 days), so it's time to clean up this TA.
I will leave a recommendation in the Cleanup topic area for this question:

RECOMMENDATION: Award points to geobul http:#7171524

Please leave any comments here within 7 days.

-- Please DO NOT accept this comment as an answer ! --

Thanks,

anAKiN
EE Cleanup Volunteer
0
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.

All Courses

From novice to tech pro — start learning today.