Ir para conteúdo
Fórum Script Brasil
  • 0

Api Para Mover Arquivo


Arlon

Pergunta

Function ProcessArquivo(const Origem, Destino : string; Operacao, Modo:Integer) : Boolean;
  // Requer a unit ShellApi na clausula uses da unit
  Const
  Aborted : Boolean = False;
  var
  shfo : TSHFileOpStruct;
  begin
  FillChar(shfo,SizeOf(shfo),$0);
  with shfo do
  begin
  if Operacao > 2 then
  begin
  operacao := 2;
  end;
  if Modo > 5 then
  begin
  modo := 1;
  end;
  case operacao of
  1: wFunc := FO_MOVE;
  2: wFunc := FO_COPY;
  end;
  pFrom := Pchar(Origem);
  pTo := Pchar(Destino);
  case Modo of
  1: fFlags := FOF_SILENT;
  2: fFlags := FOF_ALLOWUNDO or FOF_FILESONLY;
  3: fFlags := FOF_RENAMEONCOLLISION;
  4: fFlags := FOF_NOCONFIRMATION;
  5: fFlags := FOF_SIMPLEPROGRESS;
  end;
  end;
  Result := (SHFileOperation(shfo)= 0) and (not Aborted);
  end;

O código acima é usado para copiar ou mover arquivos (bem, era isso que tava dizendo lá onde eu o peguei --> www.delphi.eti.br).

Minha situação é a seguinte:

eu tenho uma pasta chamada Pedidos e duas subpastas (Pendentes e Enviados). Gero um relatório e salvo em .doc no caminho ('C:\Pedidos\Pendentes\Ordem de serviço.doc'), daí após isso eu envio o arquivo .doc por email através da própria aplicação. Após enviar eu quero mover esse arquivo para ('C:\Pedidos\Enviados\Ordem de serviço.doc').

Pra criar a função é só ir no Public Declarations e escrever "Function ProcessArquivo(const Origem, Destino : string; Operacao, Modo:Integer) : Boolean;" (certo??) e dar Ctrl + Shift + C e depois colar o código acima. Mas aí como eu faria pra "executar", ou seja, chamar essa função?? Ou se alguém tiver, pode mandar pra mim um código que ao invés de ser uma função eu possa colocar num botão.

Valeu mesmo galera.

Link para o comentário
Compartilhar em outros sites

13 respostass a esta questão

Posts Recomendados

  • 0

entendendo uma função:

Function ProcessArquivo(const Origem, Destino : string; Operacao, Modo:Integer) : Boolean;

Function NomeFuncao(dados de entrada): Resultado;

então para utilizar:

if ProcessArquivo('c:\origem\', 'd:\destino', 1, 2) = true then ShowMessage('Copia concluida com Sucesso')

Voce pode ver os valores de modo e operacao na funcao nos dois CASE

Link para o comentário
Compartilhar em outros sites

  • 0

Eu coloquei o seguinte:

function TFormPrincipal.ProcessArquivo(const Origem, Destino: string;
  Operacao, Modo: Integer): Boolean;
  Const
  Aborted : Boolean = False;
  var
  shfo : TSHFileOpStruct;
  begin
  FillChar(shfo,SizeOf(shfo),$0);
  with shfo do
  begin
  if Operacao > 2 then
  begin
  operacao := 2;
  end;
  if Modo > 5 then
  begin
  modo := 1;
  end;
  case operacao of
  1: wFunc := FO_MOVE;
  2: wFunc := FO_COPY;
  end;
  pFrom := Pchar('C:\Pedidos\Pendentes\'+'OS - '+DM.QrRelatPedidosOS.Value+'.doc');
  pTo := Pchar('C:\Pedidos\Enviados\'+'OS - '+DM.QrRelatPedidosOS.Value+'.doc');
  case Modo of
  1: fFlags := FOF_SILENT;
  2: fFlags := FOF_ALLOWUNDO or FOF_FILESONLY;
  3: fFlags := FOF_RENAMEONCOLLISION;
  4: fFlags := FOF_NOCONFIRMATION;
  5: fFlags := FOF_SIMPLEPROGRESS;
  end;
  end;
  Result := (SHFileOperation(shfo)= 0) and (not Aborted);
end;
procedure TFormPrincipal.BtnMoverClick(Sender: TObject);
begin
ProcessArquivo('C:\Pedidos\Pendentes\'+'OS - '+DM.QrRelatPedidosOS.Value+'.doc', 'C:\Pedidos\Enviados\'+'OS - '+DM.QrRelatPedidosOS.Value+'.doc', 1, 5);
end;
end.

Por acaso aqueles números de 1 a 5 são mensagens (ou coisas do tipo) que aparecerão quando eu for mover ou copiar o arquivo?

e o windows me rrtornou uma mensagem dizendo que não pode mover o arquivo porque ele já pode ter sido excluido ou movido, mas o estranho é que o arquivo tá la na origem. Valeu Corposemalma, vou continuar tentando.

Link para o comentário
Compartilhar em outros sites

  • 0

Olá Arlon,

Eu tentei utilizar esta função e ela não moveu o arquivo (CorpoSemAlma, vc. chegou utilizá-la? Deu certo?).

Porque você não usa os comandos MOVEFILE ou COPYFILE? Exemplo:

procedure TForm1.Button1Click(Sender: TObject);
begin
MoveFile('C:\origem\teste.doc','C:\destino\teste.doc');
end;
ou
procedure TForm1.Button1Click(Sender: TObject);
begin
CopyFile('C:\origem\teste.doc','C:\destino\teste.doc',false);
end;

São simples e funcionam.

Link para o comentário
Compartilhar em outros sites

  • 0

He he.. esse modificação no código que o s3c passou funciona mesmo!!

Aí Capablanca, apesar de nem ter usado esse que você me passou (que eu também nem conhecia huh.gif ), valeu tua ajuda tb.

uow... como eu estou feliz agora!!!!

Link para o comentário
Compartilhar em outros sites

  • 0

Na verdade o parâmetro pFrom é um ponteiro para diversos filenames.

Quando você define PChar(String), seu último caracter é #0.

Como pFrom é um PChar p/ várias Strings, a api tenta ler próximo nome de filename após o #0; é por isso que é adicionado outro #0 dizendo que não há mais Strings para ler.

Link para o comentário
Compartilhar em outros sites

  • 0
Na verdade o parâmetro pFrom é um ponteiro para diversos filenames.

Quando você define PChar(String), seu último caracter é #0.

Como pFrom é um PChar p/ várias Strings, a api tenta ler próximo nome de filename após o #0; é por isso que é adicionado outro #0 dizendo que não há mais Strings para ler.

Valeu pelos esclarecimentos, S3C.

Link para o comentário
Compartilhar em outros sites

  • 0

Aí Capablanca, eu usei o código que você passou...

MoveFile('C:\origem\teste.doc','C:\destino\teste.doc');

...e deu o seguinte erro:

[Error] PrincipalForm.pas(353): Incompatible types: 'String' and 'PChar'

como fazer a conversão?

Link para o comentário
Compartilhar em outros sites

  • 0

Aí Capablanca, eu usei o código que você passou...

MoveFile('C:\origem\teste.doc','C:\destino\teste.doc');
...e deu o seguinte erro: [Error] PrincipalForm.pas(353): Incompatible types: 'String' and 'PChar' como fazer a conversão?
Olá ARLON, Não é necessário fazer nenhuma conversão. Eu apenas coloco o código que eu mencionei e funciona (acabei de fazer o teste novamente, e o o arquivo foi movido da pasta de origem para a pasta de destino normalmente). Veja a minha UNIT completa:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
MoveFile('C:\origem\teste.doc','C:\destino\teste.doc');
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
CopyFile('C:\origem\teste.doc','C:\destino\teste.doc',false);
end;

end.

Não sei te explicar por qual razão está dando esta mensagem. Com certeza você não está utilizando um exemplo tão simples quanto o que eu postei. Logo, acredito que seja algo relacionado às peculiaridades do seu código. Tente fazer um exemplo simples e veja se funciona e depois tente implementar novamente em seu código.

Link para o comentário
Compartilhar em outros sites

  • 0

Sei lá que maluquice é essa então.

Mas deixa pra lá, eu estou usando aquela função mesmo. Depois eu dou uma olhada com mais calma e vejo se eu estou errando alguma coisa.

Link para o comentário
Compartilhar em outros sites

  • 0

Teria que dar certo quando você utiliza as Strings explícitas.

Por exemplo:

MoveFile('C:\origem\teste.doc','C:\destino\teste.doc'); //Não deveria dar erro de conversão.
Agora, se for utilizado:
MoveFile(sOrigem, sDestino); // erro de conversão, o certo seria:
MoveFile(PChar(sOrigem), PChar(sDestino));

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,2k
    • Posts
      651,9k
×
×
  • Criar Novo...