Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > API de Windows
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 14-07-2015
noobdelphi5 noobdelphi5 is offline
Miembro
NULL
 
Registrado: ene 2015
Posts: 22
Poder: 0
noobdelphi5 Va por buen camino
Smile 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.

Última edición por Casimiro Notevi fecha: 14-07-2015 a las 23:55:48.
Responder Con Cita
  #2  
Antiguo 15-07-2015
Avatar de Ñuño Martínez
Ñuño Martínez Ñuño Martínez is offline
Moderador
 
Registrado: jul 2006
Ubicación: Ciudad Catedral, Españistán
Posts: 6.000
Poder: 25
Ñuño Martínez Tiene un aura espectacularÑuño Martínez Tiene un aura espectacular
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.
__________________
Proyectos actuales --> Allegro 5 Pascal ¡y Delphi!|MinGRo Game Engine
Responder Con Cita
  #3  
Antiguo 20-07-2015
noobdelphi5 noobdelphi5 is offline
Miembro
NULL
 
Registrado: ene 2015
Posts: 22
Poder: 0
noobdelphi5 Va por buen camino
Post Ñ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?
Responder Con Cita
  #4  
Antiguo 20-07-2015
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.039
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
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
Responder Con Cita
  #5  
Antiguo 20-07-2015
noobdelphi5 noobdelphi5 is offline
Miembro
NULL
 
Registrado: ene 2015
Posts: 22
Poder: 0
noobdelphi5 Va por buen camino
Post Casimiro Notevi

Disculpa, abriré un nuevo tema con mi pregunta.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Acceder a carpetas compartidas Yaco API de Windows 0 04-04-2012 15:54:54
Copiar archivos y carpetas con atributos. darkone2k4 Varios 2 15-06-2010 16:41:25
Sincronización de carpetas de archivos Ivr API de Windows 2 21-04-2007 01:34:01
Copiar carpetas??Leer nombres?? samame .NET 5 15-11-2005 23:19:35
Carpetas compartidas en Windows 2000 a2jcf Varios 1 09-07-2003 09:39:14


La franja horaria es GMT +2. Ahora son las 07:24:00.


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
Copyright 1996-2007 Club Delphi