Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   API de Windows (https://www.clubdelphi.com/foros/forumdisplay.php?f=7)
-   -   Copiar Archivos de carpetas compartidas (https://www.clubdelphi.com/foros/showthread.php?t=88680)

noobdelphi5 14-07-2015 23:51:45

Copiar Archivos de carpetas compartidas
 
Buen día

Intento hacer un service que copie archivos de carpetas compartidas en cierto tiempo, no me funciona con carpetas compartidas.

Utilizo Delphi 7, el servicio sería para Win XP y 7 y tomaré el numero de archivos para hacer unas validaciones. También quisiera poder tomar las fechas pero no se de que manera hacerlo, he buscado cómo hacerle pero no me resulta.

Aquí pegó el código de lo que llevo:

Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs,
  ExtCtrls, ShellAPI, Variants, Forms;

type
  TPasarFacturas = class(TService)
    temporizador: TTimer;
    procedure ServiceExecute(Sender: TService);
    procedure temporizadorTimer(Sender: TObject);
  private
    { Private declarations }
  public
    function GetServiceController: TServiceController; override;
    { Public declarations }
  end;

var
  PasarFacturas: TPasarFacturas;

implementation

{$R *.DFM}

//Funcion Contar Archivos -SysUtils
function CuentaArchivos(const Ruta: string): Integer;
var
  SRec: TSearchRec;
  Attr, re: Integer;
begin
  Result:= 0;
  Attr:= faSysFile + faAnyFile + faArchive + faHidden; // No me funciona faReadOnly
  re:= FindFirst(Ruta , Attr, SRec);
  while re = 0 do
  begin
    Inc(Result);
    re:= FindNext(Srec);
  end;
end;

//Funcion Copiar -ShellApi -Forms -> Wnd
function CopiaTodo(Origen,Destino : String) :
  LongInt;
  var
    F : TShFileOpStruct;
    sOrigen, sDestino : String;
  begin
    Result := 0;
    sOrigen := Origen + #0;
    sDestino := Destino + #0;

    with F do
    begin
      Wnd   := Application.Handle;
      wFunc := FO_COPY;
      pFrom := @sOrigen[1];
      pTo   := @sDestino[1];
      fFlags := FOF_ALLOWUNDO or FOF_NOCONFIRMATION or FOF_SILENT
    end;
    Result := ShFileOperation(F);
end;

//Procedimientos default service

procedure ServiceController(CtrlCode: DWord); stdcall;
begin
  PasarFacturas.Controller(CtrlCode);
end;

function TPasarFacturas.GetServiceController: TServiceController;
begin
  Result := ServiceController;
end;

procedure TPasarFacturas.ServiceExecute(Sender: TService);
begin
  //Se ejecuta el codigo de manera indefinida
  temporizador.Enabled := True;
  while not Terminated do
    ServiceThread.ProcessRequests(True);
    temporizador.Enabled := False;
end;

//Proceso que se ejecutará
procedure TPasarFacturas.temporizadorTimer(Sender: TObject);
  var
  fichero : TStringList;
  filesOrigen,filesDestino: Integer;
const
  rutaFichero = 'C:\statusFacturas.txt';
  rutaOrigen =  '\\Facturas\2015\*.*';
  rutaDestino = 'C:\Documents and Settings\Propietario\Escritorio\Copia';
begin
  filesOrigen:=cuentaArchivos(rutaOrigen);
  filesDestino:=cuentaArchivos(rutaDestino+'\*.*');
  {
  Aqui estará un codigo para validar que archivos se copiarán
  }
  try
  //Copiar Archivos
  CopiaTodo(rutaOrigen, rutaDestino);
  fichero := TStringList.Create;
  if FileExists(rutaFichero) then
    fichero.LoadFromFile(rutaFichero);
    fichero.Add(DateTimeToStr(Now) + ' Se han copiado los archivos. No. de Archivos en origen: '+IntToStr(filesOrigen)+ ' No. de Archivos en destino: '+IntToStr(filesDestino));
    fichero.SaveToFile(rutaFichero);
  Except
  fichero := TStringList.Create;
  if FileExists(rutaFichero) then
    fichero.LoadFromFile(rutaFichero);
    fichero.Add(DateTimeToStr(Now) + ' Ha ocurrido un error al copiar.');
    fichero.SaveToFile(rutaFichero);
  end;
end;

end.

¿Cómo puedo copiar archivos de carpetas compartidas?, En el caso de que tuviera que ingresar con una credencial a la carpeta ¿Cómo lo consigo?

Les agradecería mucho su ayuda.

Ñuño Martínez 15-07-2015 09:56:22

No te deja, vale, pero, ¿te devuelve un error?

El problema de Windows es que cambian la ruta de los subdirectorios de sistema de vez en cuando. Por eso, en lugar de decirle tú la ruta, lo mejor es preguntarle al propio Windows dónde están. Sé que el WinAPI tiene una función para eso, pero ahora no recuerdo cual.

Free Pascal incluye funciones para obtener algunos de estos directorios en la unidad "sysutils", pero no sé si Delphi también las tiene. Concretamente, las funciones son GetAppConfigDir, GetTempDir y GetUserDir. También existen GetEnvironmentString y GetEnvironmentVariable, claro que en este caso hay que saber qué variable del sistema es la que define el directorio que buscas.

Por otro lado, asegurate de que tu usuario tiene los permisos adecuados para acceder a los directorios.

noobdelphi5 20-07-2015 19:54:58

Ñuño Martínez
 
Gracias por tu ayuda

El servicio si me funciono al pasar información del equipo que quería hacia un disco duro en red como quería; No se porque no me dejo copiar los archivos en las pruebas que hice entre los equipos de la red, a lo mejor por sería por los privilegios de la carpeta. Para la fecha de los archivos encontré una función aquí mismo, pero no puedo poner enlaces.

Pero ahora tengo otro problema, no se de que manera hacer una consulta mysql en el servicio, ya que cuando coloco los objetos ADOConnection, ADOQuery y DataSource que son los que utilizo, si me compila el programa pero al momento de iniciar el servicio me marca el siguiente error: 1053 el servicio no ha respondido a la petición o inicio del control en un tiempo adecuado.

¿Que objetos debo usar o de que manera puedo realizar una consulta mysql en el servicio?

Casimiro Notevi 20-07-2015 20:14:45

Solo se permite una pregunta por hilo, es una cuestión de simplicidad y objetividad en las respuestas y facilita las búsquedas.
http://www.clubdelphi.com/foros/guiaestilo.php

noobdelphi5 20-07-2015 20:29:02

Casimiro Notevi
 
Disculpa, abriré un nuevo tema con mi pregunta.


La franja horaria es GMT +2. Ahora son las 15:47:05.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi