Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Coloboración Paypal con ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 30-09-2014
gdlrinfo gdlrinfo is offline
Miembro
 
Registrado: may 2007
Posts: 131
Poder: 20
gdlrinfo Va por buen camino
Buenas

Buenas nlsgarcia como estas quisiera hacerte una consulta, en la búsqueda cuando copio hay algunos archivos que tienen unas siglas que no me interesa copiar, esos archivos son puntuales por ejemplo 4878-rib-jij.rft --> este tiene la sigla RIB y no me interesa copiarlo, el tema es que estuve pensando como evitar copiarlo y lo único que se me ocurre es que a medida que va buscando lo archivos lee una el nombre repasándolo como una cadena de texto y compare, si existe la palabra rib o cam o cac, que son las que no tengo que copiar, pero me da la sensación que se haría extremadamente lento el copiado, crees que puede haber otra forma de hacerlo ? desde ya muchas gracias como siempre !!!!!
Responder Con Cita
  #2  
Antiguo 30-09-2014
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Poder: 23
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
gdlrinfo,

Cita:
Empezado por gdlrinfo
...en la búsqueda cuando copio...hay algunos archivos que tienen unas siglas que no me interesa copiar...esos archivos son puntuales...se me ocurre es que a medida que va buscando lo archivos...compare...si existe la palabra...pero me da la sensación que se haría extremadamente lento el copiado...¿Crees que puede haber otra forma de hacerlo?...


Pregunto:

1- ¿En que tipo de aplicación esta instalada esta rutina?, ¿Cual es el objetivo de la aplicación?.

2- ¿La aplicación en cuestión es de índole comercial o académica?, ¿En que país es utilizada?.

3- ¿Cual es el promedio de archivos copiados normalmente?, ¿Cual es la frecuencia de uso de la aplicación?.

4- ¿Cual es el tamaño promedio de los archivos a copiar?, ¿Cual es el tiempo promedio de copia de todos los archivos?.

5- La máquina donde se ejecuta la aplicación ¿Es Servidor o Standalone?, ¿Cuales son las características técnicas de la máquina en cuestión a nivel de Procesador, Disco y Memoria?.

6- Si se discrimina los archivos a ser copiados, ¿Cuantas siglas a excluir de la copia deberían ser consideradas?.

Espero sea útil

Nelson.

Última edición por nlsgarcia fecha: 30-09-2014 a las 05:32:43.
Responder Con Cita
  #3  
Antiguo 30-09-2014
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.941
Poder: 27
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
Cita:
Empezado por gdlrinfo Ver Mensaje
el tema es que estuve pensando como evitar copiarlo y lo único que se me ocurre es que a medida que va buscando lo archivos lee una el nombre repasándolo como una cadena de texto y compare .... pero me da la sensación que se haría extremadamente lento el copiado
En vez de "sensaciones" haz la prueba, mide y compara. NUNCA hagas cambios de desempeño basados en sensaciones, suposiciones y demas, y menos implementes las sensaciones que otros tienen de tus sensaciones!. Siempre se debe hacer profiling. Osea, porque supones que va a ser lento? Y si te *parece*, sabes realmente que es *rapido*?.

Por ejemplo, si no sabes a que tasa de MB/s se puede saturar el disco, no sabes si lo que haces es o no rapido. Una vez que sabes cual es el techo de desempeño, puedes realmenten empezar a tomar decisiones.

En especial, porque la mayor parte del tiempo las rutinas/subsistemas que uses son ya suficientemente rapidos y el problema esta principalmente en la eleccion de las estructuras de datos y algoritmos globales (no locales).

Con respecto a tu pregunta:

En vez de filtrar lo "invalido", filtro lo *valido*. Como sabes que algo es el dato correcto? Chequea contra eso y no al revez (lo invalido tiene una tendencia hacia el infinito!)

Puede ser con una mascara, una expresion regular o contra una BD en memoria (quizas usando un hashtable). Ya que el I/O (todo lo que sea manejo de archivos, sockets, BD, etc) tiende a ser lo mas lento, veraz que lo que sea que hagas en codigo tiene un impacto minimo.
__________________
El malabarista.
Responder Con Cita
  #4  
Antiguo 08-10-2014
gdlrinfo gdlrinfo is offline
Miembro
 
Registrado: may 2007
Posts: 131
Poder: 20
gdlrinfo Va por buen camino
Buenas

Que tal Nelson:

En cuanto a tus preguntas la primera:

1.- El objetivo del programa es hacer una copia de archivos guardados de un disco a otro no es gran cosa pero si están en varias carpetas y esto antes se hacia a mano simplemente es por simplificar trabajo que nos hacia perder mucho tiempo nada mas .

2.- La aplicación la uso para tareas personales y se usa en argentina. (repito lo anterior solo es para facilitar algunos procesos que a mano son engorrosos)

3.- los archivos promedio son 6.000 a 10.000 la frecuencia es 3 veces a la semana.

4.- los archivos son solo RTF que pesan al rededor de 1mb cada uno, todos los archivos los esta copiando en un promedio de 7 minutos si son al rededor de 10.000 sino no dura mas de 5 minutos..

5.- La maquina donde de ejecutan son varias y casi todas tienen las mismas prestaciones la mayoría tiene 6gb de ram, micro de 6 núcleos, y discos de 1tb.

6.- si discriminamos hay 5 tipos que no copiaría por ejemplo (rib- cac - cam - rgi - rg) estas, están en el nombre del archivo es decir los archivos que tienen estas siglas no hay que copiarlos por ejemplo un nombre seria algo asi CCO-P-10015-RIB-1880810.RTF ---> este casualmente no es necesario copiarlo.

Gracias por tu interés y te agradezco!!! un abrazo
Responder Con Cita
  #5  
Antiguo 08-10-2014
gdlrinfo gdlrinfo is offline
Miembro
 
Registrado: may 2007
Posts: 131
Poder: 20
gdlrinfo Va por buen camino
mamcx

Hola mamcx:

Por lo que dices he probado hacer el proceso de leer la cadena de texto del nombre y es 5 veces mas lento el copiado, quizás a veces no hay que probar algo para saber que no iva a andar, hay cosas que están a la vista.

Tampoco podemos hacer una relación de saturación del disco en copia de MB/s cuando los archivos no pasan mas de 1mb cada uno no es un manejo de volumen en MB importante sino en cantidad de archivos, que no es lo mismo copiar 6.000 archivos de 1 MB que copiar 6.000 de 400 MB en relación no es comparable.

Simplemente contesto a lo que me preguntas porque me parece que hay cosas que son comparables solo cuando son significativas y requieren realmente un análisis especifico, pero si hablamos de copiar un simple puñado de archivos y lee nombre de cada uno no va a ser lo mismo si no los lee obviamente tardara mas, quizás no logre expresarme para que pudieras comprenderlo un saludo !!!
Responder Con Cita
  #6  
Antiguo 10-10-2014
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Poder: 23
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
gdlrinfo,

Cita:
Empezado por gdlrinfo
...si discriminamos hay 5 tipos que no copiaría...


Voy a hacer una nueva versión que te permita discriminar los archivos que no quieras copiar, en lo que la tenga disponible la publico

Saludos,

Nelson.
Responder Con Cita
  #7  
Antiguo 10-10-2014
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 38
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola gdIrinfo

Ayer pude comprobar que del modo que te sugerí en el mensaje #9, funciona correctamente en Delphi XE.

Cita:
Empezado por gdlrinfo Ver Mensaje
...este tiene la sigla RIB y no me interesa copiarlo, el tema es que estuve pensando como evitar copiarlo y lo único que se me ocurre es que a medida que va buscando lo archivos lee una el nombre repasándolo como una cadena de texto y compare, si existe la palabra rib o cam o cac, que son las que no tengo que copiar, pero me da la sensación que se haría extremadamente lento el copiado, crees que puede haber otra forma de hacerlo ?
Lo que solicitas ahora requiere el análisis del nombre del archivo, no hay otro modo de hacerlo que revisar si los monemas a excluir se encuentran en el nombre del archivo. Y si... claro, esa verificación inflinge un retardo en el proceso aunque en el contexto de la copia no es el principal actor. El copiado de archivos es una operación lenta per se, como lo es cualquier acción que requiera accesos a disco.

Sumando que comentas que son muchos los archivos a todo lo anterior, se justifica el uso de hilos. No por que redunde en un incremento de la velocidad sino por que libera al usuario de la espera.

Código Delphi [-]
(* VERSION PARA DELPHI XE *)
unit uCopyAll;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes;

type
  TCopyAllFiles = class(TThread)
  private
    FFiles, FExclude: TStrings;
    FSource, FTarget, FExtension: string;
    procedure FindFiles(Folder: string);
    procedure CopyFiles;
    function IsSameExt(FileName: string): Boolean;
    function IsBeCopied(FileName: string): Boolean;
    function GetExclude: string;
    procedure SetExclude(const Value: string);
    procedure SetExtension(Value: string);
    procedure SetSource(const Value: string);
    procedure SetTarget(const Value: string);
  protected
    procedure Execute; override;
  public
    constructor Create; reintroduce; overload;  
    procedure BeginCopy;
    destructor Destroy; override;
    property Source: string read FSource write SetSource;
    property Target: string read FTarget write SetTarget;
    property Exclude: string read GetExclude write SetExclude;
    property Extension: string read FExtension write SetExtension;
  end;

implementation

uses Forms, Dialogs, ShellApi;

// Constructor
constructor TCopyAllFiles.Create;
begin
  inherited Create(True);
  Priority:= tpNormal;
  FreeOnTerminate:= True;
  FFiles:= TStringList.Create;
  FExclude:= TStringList.Create;
end;

// Devuelve verdadero si coincide la extensión
function TCopyAllFiles.IsSameExt(FileName: string): Boolean;
begin
  Result:= UpperCase(ExtractFileExt(FileName)) = FExtension;
end;

// Devuelve verdadero si encuentra una máscara en el nombre
function TCopyAllFiles.IsBeCopied(FileName: string): Boolean;
var
  i: Integer;
  Name: string;
begin
  Result:= True;
  if FExclude.Count > 0 then
    Name:= UpperCase(ChangeFileExt(ExtractFileName(FileName), ''));
    for i:= 0 to FExclude.Count-1 do
      if AnsiPos(UpperCase(FExclude[i]), Name) <> 0 then
      begin
        Result:= False;
        Exit;
      end;
end;

// Devuelve mascara
function TCopyAllFiles.GetExclude: string;
begin
  Result:= FExclude.Text;
end;

// Asigna mascara
procedure TCopyAllFiles.SetExclude(const Value: string);
begin
  ExtractStrings([';'],[], PWideChar(Value), FExclude);
end;

// Asigna extensión
procedure TCopyAllFiles.SetExtension(Value: string);
begin
  if Value = EmptyStr then
    raise Exception.Create('Falta ingresar extensión');
  if AnsiPos('.', Value) = 0 then
    Value:= '.' + Value;
  FExtension := UpperCase(Value);
end;

// Asigna ruta origen
procedure TCopyAllFiles.SetSource(const Value: string);
begin
  FSource:= IncludeTrailingPathDelimiter(Value);
  if not DirectoryExists(FSource) then
    raise Exception.Create('Ruta al orígen inexistente. Operación abortada.');
end;

// Asigna ruta destino
procedure TCopyAllFiles.SetTarget(const Value: string);
const
  MSG = 'Carpeta destino inexistente.'+#10#13+'¿ Desea crearla ?';
begin
  FTarget:= IncludeTrailingPathDelimiter(Value);
  if not DirectoryExists(Value) then
  begin
    if MessageDlg(MSG,mtConfirmation,[mbYes, mbNo],0) = IDNO then
      raise Exception.Create('Operación abortada.');
    CreateDirectory(PWideChar(FTarget),nil);
  end;
end;

// Obtiene archivos de determinada extensión en carpeta y subcarpetas
procedure TCopyAllFiles.FindFiles(Folder: string);
var
  SR: TSearchRec;
begin
  Folder:= IncludeTrailingPathDelimiter(Folder);
  if FindFirst(Folder + '*.*', $FF, SR) = 0 then
  repeat
    if ((SR.Attr and fadirectory) = fadirectory) then
    begin
      if(SR.Name <> '.') and (SR.Name <> '..') then
        FindFiles(Folder + SR.Name)
    end
    else if IsBeCopied(SR.Name) and IsSameExt(SR.Name) then
      FFiles.Add(Folder + SR.Name);
  until FindNext(SR) <> 0;
  FindClose(SR);
end;

// Copia todos los archivos de determinada extension
procedure TCopyAllFiles.CopyFiles;
var
  i    : Integer;
  shfos: SHFILEOPSTRUCT;
begin
  if not Terminated then
  begin
    FindFiles(FSource);
    if FFiles.Count > 1 then
      for i:= 0 to FFiles.Count-1 do
      begin
        ZeroMemory(@shfos, SizeOf(shfos));
        shfos.Wnd:= Application.Handle;
        shfos.wFunc:= FO_COPY;
        shfos.hNameMappings:= nil;
        shfos.pFrom:= PWideChar(FFiles[i]+#0+#0);
        shfos.pTo:= PWideChar(FTarget+#0+#0);
        shfos.fFlags:= FOF_NOCONFIRMATION+FOF_SILENT+FOF_RENAMEONCOLLISION;
        SHFileOperation(SHFOS);
      end;
  end;
  ShowMessage('Copia finalizada');
end;

// Execute
procedure TCopyAllFiles.Execute;
begin
  Synchronize(CopyFiles);
end;

(* Comenzar *)
procedure TCopyAllFiles.BeginCopy;
begin
  Execute;
end;

(* Destructor *)
destructor TCopyAllFiles.Destroy;
begin
  FFiles.Free;
  FExclude.Free;
end;
end.

Ejemplo de uso:
Código Delphi [-]
...
implementation
{$WARNINGS OFF}
uses FileCtrl, uCopyAll;

procedure TForm1.spdBtnSourceClick(Sender: TObject);
var
  SelDir: string;
begin
  if SelectDirectory(SelDir, [sdPrompt], 0) then
   EditSource.Text:= SelDir;
end;

procedure TForm1.spdBtnTargetClick(Sender: TObject);
var
  SelDir: string;
begin
   if SelectDirectory(SelDir, [sdPrompt], 0) then
    EditTarget.Text:= SelDir;
end;

procedure TForm1.btnStartCopyClick(Sender: TObject);
begin
  with TCopyAllFiles.Create do
  try
    Source   := Trim(EditSource.Text);
    Target   := Trim(EditTarget.Text);
    Extension:= Trim(EditExtension.Text);
    Exclude  := Trim(EditMonemes.Text);
    BeginCopy;
  finally
    Free;
  end;
end;
...
El programa copia todos los archivos de la extensión indicada desde la carpeta orígen hasta la carpeta destino, excepto aquellos cuyos nombres incluyan alguno de los monemas especificados. Si la carpeta destino no existe pregunta si se desea crearla y de acuerdo a la elección del usuario, la crea o aborta la operación.

El código fue probado bajo Windows 7 32bits en Delphi 7 y Delphi XE. Si usas el primero tenés que reemplazar las ocurrencias de PWideChar por PChar y viceversa de otro modo.
En las pruebas que realicé sobre una carpeta con 76 subcarpetas y 1857 archivos tardó un tiempo promedio de unos 20 segundos.

Creo haber expuesto el ejemplo del uso de la clase de forma entendible... Pero si tenes alguna dificultad para implementarlo no dudes en avisame y te adjunto el código fuente.

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #8  
Antiguo 10-10-2014
gdlrinfo gdlrinfo is offline
Miembro
 
Registrado: may 2007
Posts: 131
Poder: 20
gdlrinfo Va por buen camino
ecfisa: Gracias por tu respuesta ni bien lo pruebo te comento !!!!!
Responder Con Cita
  #9  
Antiguo 11-10-2014
gdlrinfo gdlrinfo is offline
Miembro
 
Registrado: may 2007
Posts: 131
Poder: 20
gdlrinfo Va por buen camino
[quote=ecfisa;482899]

Hola ecfisa te cuento que probé y funciona muy bien el único problema que hay es que no me deja poner todas las frases que quiero discriminar por ejemplo no quiero que copie nada que contenga CAC - CAM - RIB pero en el edit solo me deja poner uno ejemplo el CAC y si no lo copia la idea es poner todas las siglas juntas así no copia ninguno de esos archivos, pero la verdad que poniendo de a uno anda muy bien pero la idea es poner todas las siglas que no se quieren copiar desde ya como siempre gracias por tu ayuda
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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
Búsqueda de archivos ordenada por fecha Faust Varios 10 26-07-2010 16:43:21
Habilitar Boton de Busqueda al enfocar Objetos Especificos ---baja--- API de Windows 6 01-11-2006 15:53:11
Busqueda de archivos jdattoli OOP 1 26-08-2005 19:44:24
Busqueda de Archivos jorgito PHP 7 03-08-2005 18:50:04
Busqueda de archivos Nathan Varios 1 17-03-2004 17:27:38


La franja horaria es GMT +2. Ahora son las 16:09:34.


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