Avatar billede alexbp Nybegynder
08. april 2003 - 20:03 Der er 4 kommentarer og
1 løsning

'CopyFile' og 'CopyFileEx' - Error: 2 ved GetLastError ???

CopyFile vil ikke kopiere filer ??? - Se følgende, evt. hele proceduren i context nederst !

Denne kode er i en unit, uden TForm

<Snip>

FOR idx := 0 TO NumOfAttFiles-1 DO
      Begin
        SourceFile := OutAttFileNames[idx];  // => er en TStrings fra en TOpenDialog på en Form
        //TargetFile := OutAttachmentSavePath + '*.*';
        TargetFile := OutAttachmentSavePath + ExtractFileName(SourceFile);
----------------------------------------------------------------------------
--------------------------------------------------------------------------->
>>>>>>
        //CopyFile(PChar(SourceFile),PChar(TargetFile),FALSE);
      IF not
Windows.CopyFileEx(PChar(SourceFile),PChar(TargetFile),dummyPointer,dummyPoi
nter,pCancel,dwCopyFlags) then
          Log('Copy file failed, error ' + IntToStr (GetLastError));

<snip>

Mvh

Alex

----------------------------------------------------->>>

Det er meningen, at nogle filer, som udpeges i anden unit, via TOpenDialog,
giver en "TStrings" som jeg itererer gennem, og vil så kopiere fra den
fil-navn, til en lokal temp folder under Prog-run-time.
Kompilerer og kører fint, men ingen filer kopieres ???

----------------------

Procedure
TTeleEmail.PackReplyEmlAttachments(SubFolder,EmlFileNameAndExt:String;VAR
ChilkatEmailObj:ChilkatEmail;OutAttFileNames:TStrings;VAR
NumOfAttFiles:Byte);
VAR
  idx:Byte;

OutAttachmentSavePath,NewTempAttachmentDir,SourceFile,TargetFile:WideString;
  pCancel,dummyPointer:Pointer;
  dwCopyFlags:Word;
  debugDummy1:String;
  searchResult:TSearchRec;
  sRes:Integer;
  resCopyFile:LongBool;
Begin
  idx := 0;
  NewTempAttachmentDir := CurrentDir + '\' + TempFileFolder + '\' +
SubFolder + '\' + OutAttachmentsSubFolder;
  NumOfAttFiles := OutAttFileNames.Count;
  ChilkatEmailObj.Mailer := DefaultXMailerTag;
  try
    MkDir(NewTempAttachmentDir);
    if IOResult <> 0 then
      Log('Cannot create directory ... - '+NewTempAttachmentDir)
    else
      Log('New directory created ... - '+NewTempAttachmentDir);
  except
    Log('Cannot create directory ... - '+NewTempAttachmentDir);
  end;

  OutAttachmentSavePath := CurrentDir + '\' + TempFileFolder + '\' +
SubFolder + '\' + OutAttachmentsSubFolder + '\';
  //pCancel:=Addr(Cancel);
  dwCopyFlags := COPY_FILE_RESTARTABLE;

  IF (NumOfAttFiles > 0) THEN
  try
    // Copy file(s)
    //CopyFileEx(SourceFile,TargetFile,NULL,NULL,pCancel,dwCopyFlags);
    FOR idx := 0 TO NumOfAttFiles-1 DO
      Begin
        SourceFile := OutAttFileNames[idx];
        //TargetFile := OutAttachmentSavePath + '*.*';
        TargetFile := OutAttachmentSavePath + ExtractFileName(SourceFile);
----------------------------------------------------------------------------
--------------------------------------------------------------------------->
>>>>>>
        //CopyFile(PChar(SourceFile),PChar(TargetFile),FALSE);
      IF not
Windows.CopyFileEx(PChar(SourceFile),PChar(TargetFile),dummyPointer,dummyPoi
nter,pCancel,dwCopyFlags) then
          Log('Copy file failed, error ' + IntToStr (GetLastError));
----------------------------------------------------------------------------
--------------------------------------------------------------------------<<
<<<<<
        debugDummy1 := 'pause';
      end;
  except
    // Handles copy error(s)
    Log('TeleEmail01.PackReplyEmlAttachments-> Error: OutAttachmentFile
could was not copied correctly/not found');
  end; // try .. except

  sRes := FindFirst(OutAttachmentSavePath + '*.*',faAnyFile,searchResult);
  IF sRes = 0 THEN // = = Result was success, files found
    try // try (2)
      While sRes = 0 DO
        Begin
          //IF (searchResult.Attr and faDirectory) <> faDirectory THEN
            Begin
              if (searchResult.Name <> '') THEN
                ChilkatEmailObj.AddFileAttachment(OutAttachmentSavePath +
searchResult.Name);
            end;
        sRes := FindNext(searchResult);
        end;
    //except
      //Handle exception
    finally
      FindClose(searchResult);
    end; // end ... try (2)
    ChilkatEmailObj.SaveEml(CurrentDir + '\' + TempFileFolder + '\' +
SubFolder + '\' + ReplyEmailNameInZip);

end;

-------------------------->>>
Her kaldes proceduren med relevante parametre

function TTeleEmail.AddAttToReplyEmail(ContactRespID:String;VAR
OutAttachmentFileNames:TStrings):Integer;
VAR
  NumOfAttachments:Byte;
Begin
  NumOfAttachments := 0;

TeleEmail.PackReplyEmlAttachments(ContactRespID,ReplyEmailNameInZip,ChilkatE
mailOut,OutAttachmentFileNames,NumOfAttachments);

//TeleEmail.PackReplyEmlAttachments2(ContactRespID,ReplyEmailNameInZip,Chilk
atEmailOut,OutAttachmentFileNames,NumOfAttachments,ReplyAttShellListView);
  Log('NumOfOutBound attachments: ' + IntToStr(NumOfAttachments));
end;
Avatar billede martinlind Nybegynder
08. april 2003 - 22:03 #1
prøv at sætte dit dwCopyflag til noget fornuftigt !
Avatar billede borrisholt Novice
09. april 2003 - 08:31 #2
Error 2 betyder :

The system cannot find the file specified

brug

  SysErrorMessage(2)

Jens B
Avatar billede alexbp Nybegynder
10. april 2003 - 10:21 #3
<snip>
dwCopyFlags := COPY_FILE_RESTARTABLE;
<snip>

Hvad er der galt med det ? - Der er 2 muligheder, jeg har valgt en af dem !!!
Avatar billede alexbp Nybegynder
14. april 2003 - 16:29 #4
Helt simpelt test-prog med denne CopyFile virker heller ikke - Hvorfor ??

procedure TForm1.Button1Click(Sender: TObject);
begin
  SourceFile := Form1.Edit1.Text;
  TargetFile := Form1.Edit2.Text;
    if FileExists(SourceFile) then
      Begin
        CopyFile(PChar(SourceFile),PChar(TargetFile),FALSE);
        ShowMessage('Filen er fundet ....., og forsøgt kopieret');
      end
    else
      ShowMessage('Filen er ikke fundet ..... en fejl opstod');
end;
Avatar billede alexbp Nybegynder
14. april 2003 - 17:30 #5
Løsning på CopyFile - fejl fundet: -> Lukker selv !

Det er ved en CAST'ing af WideString -> PChar, der åbenbart sker en fejl-ref.

Jeg skiftede WideString VAR'en ud med alm. String som et sidste desperat/tilfældigt forsøgt, og så virkede alt pludseligt.

Jeg må så nøjes p.t. med path + filnavn på max: 255 bytes + 1 byte til length.

Ny 'sovs', der kører:
-------------------------->>>
Procedure TTeleEmail.PackReplyEmlAttachments(SubFolder,EmlFileNameAndExt:String;VAR ChilkatEmailObj:ChilkatEmail;OutAttFileNames:TStrings;VAR NumOfAttFiles:Byte);
VAR
  idx:Byte;
  OutAttachmentSavePath,NewTempAttachmentDir,SourceFile,TargetFile:String;
  pCancel,dummyPointer:Pointer;
  dwCopyFlags:Word;
  debugDummy1:String;
  searchResult:TSearchRec;
  sRes:Integer;
  resCopyFile:LongBool;
Begin
//  Result := 0;
  idx := 0;
  NewTempAttachmentDir := CurrentDir + '\' + TempFileFolder + '\' + SubFolder + '\' + OutAttachmentsSubFolder;
  NumOfAttFiles := OutAttFileNames.Count;
  ChilkatEmailObj.Mailer := DefaultXMailerTag;
  try
    if not DirectoryExists(NewTempAttachmentDir) then
      MkDir(NewTempAttachmentDir);
    if IOResult <> 0 then
      Log('Cannot create directory ... - '+NewTempAttachmentDir)
    else
      Log('New directory created ... - '+NewTempAttachmentDir);
  except
    Log('Cannot create directory ... - '+NewTempAttachmentDir);
  end;

  OutAttachmentSavePath := CurrentDir + '\' + TempFileFolder + '\' + SubFolder + '\' + OutAttachmentsSubFolder + '\';
  //pCancel:=Addr(Cancel);
  dwCopyFlags := COPY_FILE_RESTARTABLE;

  IF (NumOfAttFiles > 0) THEN
  try
    // Copy file(s)
    //CopyFileEx(SourceFile,TargetFile,NULL,NULL,pCancel,dwCopyFlags);
    FOR idx := 0 TO NumOfAttFiles-1 DO
      Begin
        SourceFile := OutAttFileNames[idx];
        //TargetFile := OutAttachmentSavePath + '*.*';
        TargetFile := OutAttachmentSavePath + ExtractFileName(SourceFile); // Virker ikke sådan ...??
        //if FileExists(SourceFile) then
        //  CopyFile(PChar(SourceFile),PChar(TargetFile),FALSE);
        IF not Windows.CopyFileEx(PChar(SourceFile),PChar(TargetFile),dummyPointer,dummyPointer,pCancel,dwCopyFlags) then
          Log('Copy file failed, error ' + IntToStr (GetLastError));

        debugDummy1 := 'pause';
      end;
  except
    // Handles copy error(s)
    Log('TeleEmail01.PackReplyEmlAttachments-> Error: OutAttachmentFile could was not copied correctly/not found');
  end; // try .. except

  sRes := FindFirst(OutAttachmentSavePath + '*.*',faAnyFile,searchResult);
  IF sRes = 0 THEN // = = Result was success, files found
    try // try (2)
      While sRes = 0 DO
        Begin
          IF (searchResult.Attr and faDirectory) <> faDirectory THEN
            Begin
              if (searchResult.Name <> '') THEN
                ChilkatEmailObj.AddFileAttachment(OutAttachmentSavePath + searchResult.Name);
            end;
        sRes := FindNext(searchResult);
        end;
    //except
      //Handle exception
    finally
      FindClose(searchResult);
    end; // end ... try (2)
    ChilkatEmailObj.SaveEml(CurrentDir + '\' + TempFileFolder + '\' + SubFolder + '\' + ReplyEmailNameInZip);

    TeleEmail.DynamicOutAttachmentsRoot := OutAttachmentSavePath;
end;
------------------->>>

Mvh  -> Alex
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester