PDA

Ver la Versión Completa : Problemas con copia de archivos a la RED


edgwin
01-02-2011, 19:58:28
Que tal amigos del foro.

Estoy intentando copiar un archivo a una carpeta compartida en otro equipo, lo que intento es lo siguiente:


var
NetResource: TNetResource;
vRuta : PChar;
begin
vRuta := PChar('c:\carpetaTmp\archivo.xml');
NetResource.dwType := RESOURCETYPE_DISK;
NetResource.lpLocalName := 'X:';
NetResource.lpRemoteName := vRuta;
NetResource.lpProvider := '';
WNetAddConnection2(NetResource, 'Pass','Usuario', CONNECT_UPDATE_PROFILE);
CopyFile(PChar(vFile),PChar('X:\archivo.XML'),False);
WNetCancelConnection2('X:', CONNECT_UPDATE_PROFILE, True);


Cabe mensionar que el usuario y password es correcto, si se conecta a la unidad de red, y si cambio, en la linea "CopyFile" a una unidad local, si me copia el archivo ...

Pero no me copia nada a la unidad de RED "x", alguna sugerencia?

Saludos!

duilioisola
01-02-2011, 21:06:58
Seguramente este código te da un error al copiar. Si nos dices el error, puede que podamos ayudarte un poco más.

Yo supongo que el problema debe estar en la parte donde generas el recurso compartido (WNetAddConnection2).

WNetAddConnection2 devuelve a su vez un código de error. Si es 0 es que la carpeta compartida se generó correctamente.

Yo supongo que debe devolver algo distinto de 0.


var
NetResource: TNetResource;
vRuta : PChar;
ErrCode : integer;
begin
vRuta := PChar('c:\carpetaTmp\archivo.xml');
NetResource.dwType := RESOURCETYPE_DISK;
NetResource.lpLocalName := 'X:';
NetResource.lpRemoteName := vRuta;
NetResource.lpProvider := '';
ErrCode := WNetAddConnection2(NetResource, 'Pass','Usuario', CONNECT_UPDATE_PROFILE);
if (ErrCode=0) then
begin
CopyFile(PChar(vFile),PChar('X:\archivo.XML'),False);
WNetCancelConnection2('X:', CONNECT_UPDATE_PROFILE, True);
end else
ShowMessage('No puedo conectar la unidad de red.');

duilioisola
01-02-2011, 21:09:46
También veo el siguiente problema.

vRuta debe ser la ruta y no el archivo.
vRuta debe ser un lugar en la red y no en el C: local.


Supongo que deberías cambiarlo a algo así:

vRuta := PChar('\\EquipoRemoto\c\carpetaTmp');

edgwin
01-02-2011, 21:41:59
Gracias por responder:

Me equivoque en el codigo, voy a postear el codigo real que tengo:


procedure TfrmMain.prcCopiARed(vFile:string;vModa:string);
var
NetResource: TNetResource;
vIniFile : TIniFile;
vRuta : PChar;
begin
vIniFile := TIniFile.Create('./Config.ini');
if vModa = '' then
vRuta := PChar(vIniFile.ReadString('RUTA','RX','')) // Ruta: \\132.147.160.50\RIS (file://\\132.147.160.50\RIS)
else
vRuta := PChar(vIniFile.ReadString('RUTA','MA','')); // Ruta: \\132.147.160.51\RIS (file://\\132.147.160.51\RIS)
NetResource.dwType := RESOURCETYPE_DISK;
//Letra con la cual sera mapeado el recurso
NetResource.lpLocalName := 'X:';
//Nombre del recurso
NetResource.lpRemoteName := vRuta;
NetResource.lpProvider := '';
WNetAddConnection2(NetResource, 'Radiologia1','UPC', CONNECT_UPDATE_PROFILE);
CopyFile(PChar(vFile),PChar('X:\RIS.XML'),False);
WNetCancelConnection2('X:', CONNECT_UPDATE_PROFILE, True);
end;


Ya intente como me dice duilioisola (http://www.clubdelphi.com/foros/member.php?u=21525) (como podran ver, la ruta la saco de un archivo INI) cambiando la ruta y nada!!!

Saludos!

duilioisola
02-02-2011, 09:04:54
Seguramente este código te da un error al copiar. Si nos dices el error, puede que podamos ayudarte un poco más.

Es importante que nos cuentes "el mensaje de error que te da".

Sin ese "detallito" no sabemos qué contestarte excepto suposiciones...

Suposición 1:
Después de leer el ini vRuta = '\\132.147.160.50\RIS' o vRuta = '\\132.147.160.51\RIS'
Puede que no sea ninguna de las dos y que no esté leyendo el ini correcto.

Suposición 2:
CopyFile(PChar(vFile),PChar('X:\RIS.XML'),False);
se traduciría como
CopyFile(PChar(vFile),PChar('\\132.147.160.51\RIS\RIS.XML'),False);

Quizás te has liado y el archivo RIS.XML está en la raiz del lugar al que apunta la dirección IP y no dentro de una carpeta que se llama RIS.

Suposición 3:
Radiologia1 y UPC no son los nombres de ususario y contraseña correctos o no tiene permisos de lectura.

Seguimos suponiendo ???

edgwin
02-02-2011, 20:26:03
Gracias por contestar.

Hice una pequeña modificacion en el codigo:


...
vErr := WNetAddConnection2(NetResource, 'Agsrvc2ls','Crservice', CONNECT_UPDATE_PROFILE);
...


Es importante que nos cuentes "el mensaje de error que te da".
R.- El valor que me regresa es "0".

Sin ese "detallito" no sabemos qué contestarte excepto suposiciones...

Suposición 1:
Después de leer el ini vRuta = '\\132.147.160.50\RIS' o vRuta = '\\132.147.160.51\RIS'
Puede que no sea ninguna de las dos y que no esté leyendo el ini correcto.
R.- Claro que lo esta leyendo de manera correcta, en caso contrario no se conectaria a la unidad de red.

Suposición 2:
CopyFile(PChar(vFile),PChar('X:\RIS.XML'),False);
se traduciría como
CopyFile(PChar(vFile),PChar('\\132.147.160.51\RIS\RIS.XML'),False);
R.- No puedo hacer eso, ya que el equipo remoto esta protegido con contraseña, es por eso que me meti en este lio ...
Quizás te has liado y el archivo RIS.XML está en la raiz del lugar al que apunta la dirección IP y no dentro de una carpeta que se llama RIS.

Suposición 3:
Radiologia1 y UPC no son los nombres de ususario y contraseña correctos o no tiene permisos de lectura.
R.- Yo mismo cree la ruta y la comparti como administrador. Me asegure de tener todos los permisos necesarios, tan asi que puedo escribir sobre esa carpeta de manera remota.

El problema es que al parecer la funcion de copyFile no soporta la copia a unidades mapeadas, porque si se mapea la unidad (cuando lo corro paso a paso, abro un explorador y ahi aparece) y si hace la copia si cambio la unidad "X" por alguna unidad y carpeta local.

Alguien que me pueda ayudar!!
Gracias!

duilioisola
02-02-2011, 22:55:05
Me sigue quedando la duda: ¿No te da ningún mensaje de error?
¿O sea, pasa por la linea CopyFile(...); y no dice nada?
¿No te da una exception que diga algo? (el archivo ya existe, no tiene permiso, no existe la unidad, etc.)

Prueba poniendo a True la útima propiedad de CopyFile

CopyFile(PChar(vFile), PChar('X:\RIS.XML'), True);


Código sacado de Torry's Delphi Pages (http://www.swissdelphicenter.ch/torry/showcode.php?id=101)

{
The CopyFile function copies an existing file to a new file.


CopyFile(
lpExistingFileName : PChar, // name of an existing file
lpNewFileName : PChar, // name of new file
bFailIfExists : Boolean); // operation if file exists

bFailIfExists:
Specifies how this operation is to proceed if a file of the same name as
that specified by lpNewFileName already exists.
If this parameter is TRUE and the new file already exists, the function fails.
If this parameter is FALSE and the new file already exists,
the function overwrites the existing file and succeeds.
}

var
fileSource, fileDest: string;
begin
fileSource := 'C:\SourceFile.txt';
fileDest := 'G:\DestFile.txt';
CopyFile(PChar(fileSource), PChar(fileDest), False);
end;

edgwin
03-02-2011, 00:09:15
Gracias por responder duilioisola (http://www.clubdelphi.com/foros/member.php?u=21525)

No, no me marca ningun error. De echo el programa sigue corriendo sin problemas. Voy a optar por hacer un servidor de archivos en la maquina cliente que reciba los archivos ...

Gracias por tus respuestas

Saludos!

duilioisola
03-02-2011, 20:12:43
He hecho este pequeño programita ejemplo, para ver si puedes buscar el error.
Tiene un panel alineado alTop con un boton y un Memo para guardar un Log de todos los pasos.
En el evento del botón se llama al procedimiento que copia.
Si alguna función devuelve un error, te lo muestra en el memo.
Yo he probado con

IP que no existe
Nombre de usuario y contraseña incorrectos
Carpeta que no existe dentro de la ip

Todos estos me dan algún tipo de error.

Ya nos contarás...


unit UFMMainCopia;

interface

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

type
TFMMainCopia = class(TForm)
PNLMain: TPanel; {Panel alineado alTop}
BCopiar: TButton;
MLog: TMemo; {Memo alineado alClient}
procedure BCopiarClick(Sender: TObject);
private
procedure prcCopiARed(vOrigen, vDestino, vUser, vPassword :string);
{ Private declarations }
public
{ Public declarations }
end;

var
FMMainCopia: TFMMainCopia;

implementation

{$R *.dfm}

procedure TFMMainCopia.prcCopiARed(vOrigen, vDestino, vUser, vPassword :string);
var
NetResource: TNetResource;
vRuta : PChar;
ErrCode : integer;
ErrCode2 : LongBool;
begin
MLog.Clear;
{*****************************************}
{ IMPORTANTE: vRuta NO debe terminar en \ }
{*****************************************}
vRuta := PChar('\\192.168.152.127\Compartida');
MLog.Lines.Add('vRuta := PChar(''\\192.168.152.127\Compartida'')');

NetResource.dwType := RESOURCETYPE_DISK;
MLog.Lines.Add('NetResource.dwType := RESOURCETYPE_DISK');

//Letra con la cual sera mapeado el recurso
NetResource.lpLocalName := 'X:';
MLog.Lines.Add('NetResource.lpLocalName := ''X:''');

//Nombre del recurso
NetResource.lpRemoteName := vRuta;
MLog.Lines.Add('NetResource.lpRemoteName := vRuta');

NetResource.lpProvider := '';
MLog.Lines.Add('NetResource.lpProvider := ''''');

if (vUser = '') then
begin
ErrCode := WNetAddConnection2(NetResource, nil, nil, CONNECT_UPDATE_PROFILE);
MLog.Lines.Add('WNetAddConnection2(NetResource, nil, nil, CONNECT_UPDATE_PROFILE)');
end
else
begin
ErrCode := WNetAddConnection2(NetResource, PChar(vPassword), PChar(vUser), CONNECT_UPDATE_PROFILE);
MLog.Lines.Add('WNetAddConnection2(NetResource, PChar(' + vPassword + '), PChar(' + vUser + '), CONNECT_UPDATE_PROFILE)');
end;

MLog.Lines.Add('ErrCode: '+IntToStr(ErrCode));
if (ErrCode = ERROR_ACCESS_DENIED ) then MLog.Lines.Add('ERROR_ACCESS_DENIED') else
if (ErrCode = ERROR_ALREADY_ASSIGNED ) then MLog.Lines.Add('ERROR_ALREADY_ASSIGNED') else
if (ErrCode = ERROR_BAD_DEV_TYPE ) then MLog.Lines.Add('ERROR_BAD_DEV_TYPE') else
if (ErrCode = ERROR_BAD_DEVICE ) then MLog.Lines.Add('ERROR_BAD_DEVICE') else
if (ErrCode = ERROR_BAD_NET_NAME ) then MLog.Lines.Add('ERROR_BAD_NET_NAME') else
if (ErrCode = ERROR_BAD_PROFILE ) then MLog.Lines.Add('ERROR_BAD_PROFILE') else
if (ErrCode = ERROR_BAD_PROVIDER ) then MLog.Lines.Add('ERROR_BAD_PROVIDER') else
if (ErrCode = ERROR_BUSY ) then MLog.Lines.Add('ERROR_BUSY') else
if (ErrCode = ERROR_CANCELLED ) then MLog.Lines.Add('ERROR_CANCELLED') else
if (ErrCode = ERROR_CANNOT_OPEN_PROFILE ) then MLog.Lines.Add('ERROR_CANNOT_OPEN_PROFILE') else
if (ErrCode = ERROR_DEVICE_ALREADY_REMEMBERED ) then MLog.Lines.Add('ERROR_DEVICE_ALREADY_REMEMBERED') else
if (ErrCode = ERROR_EXTENDED_ERROR ) then MLog.Lines.Add('ERROR_EXTENDED_ERROR') else
if (ErrCode = ERROR_INVALID_PASSWORD ) then MLog.Lines.Add('ERROR_INVALID_PASSWORD') else
if (ErrCode = ERROR_NO_NET_OR_BAD_PATH ) then MLog.Lines.Add('ERROR_NO_NET_OR_BAD_PATH') else
if (ErrCode = ERROR_NO_NETWORK ) then MLog.Lines.Add('ERROR_NO_NETWORK') else
MLog.Lines.Add('DESCONOCIDO');

ErrCode2 := CopyFile(PChar(vOrigen), PChar('X:\destino.txt'), True);
MLog.Lines.Add('CopyFile(PChar(' + vOrigen + '), PChar(' + vDestino + '), True)');
if (ErrCode2) then
MLog.Lines.Add('ErrCode: True')
else
MLog.Lines.Add('ErrCode: False');

ErrCode := WNetCancelConnection2('X:', CONNECT_UPDATE_PROFILE, True);
MLog.Lines.Add('WNetCancelConnection2(''X:'', CONNECT_UPDATE_PROFILE, True)''');
MLog.Lines.Add('ErrCode: '+IntToStr(ErrCode));
end;

procedure TFMMainCopia.BCopiarClick(Sender: TObject);
begin
prcCopiARed('C:\Origen.txt', 'X:\Destino.txt', 'Usuario', 'password');
end;

end.

edgwin
03-02-2011, 21:45:14
Gracias nuevamente por responder.

Este es el resultado que me genera:


vRuta := PChar('\\132.147.160.51\RIS')
NetResource.dwType := RESOURCETYPE_DISK
NetResource.lpLocalName := 'X:'
NetResource.lpRemoteName := vRuta
NetResource.lpProvider := ''
WNetAddConnection2(NetResource, PChar(Radiologia1), PChar(UPC), CONNECT_UPDATE_PROFILE)
ErrCode: 0
DESCONOCIDO
CopyFile(PChar(C:\Origen.txt), PChar(X:\Destino.txt), True)
ErrCode: False
WNetCancelConnection2('X:', CONNECT_UPDATE_PROFILE, True)'
ErrCode: 0


Adjunto, archivo zip con imagen del explorador de Windows

... :confused::confused::confused:

Saludos!

duilioisola
04-02-2011, 09:00:13
WNetAddConnection2(NetResource, PChar(Radiologia1), PChar(UPC), CONNECT_UPDATE_PROFILE)
ErrCode: 0
Esto asegura que X: se puede crear.
CopyFile(PChar(C:\Origen.txt), PChar(X:\Destino.txt), True)
ErrCode: False

El resultado de la copia es False. Por lo tanto no ha podido copiar...
Puede ser que X:\Destino.txt ya exista... aunque lo dudo mucho.
Si cambias el parámetro final de CopyFile a False, también falla?

La última prueba que se me ocurre es que pongas un breakpoint en la linea de CopyFile y copies a mano C:\Origen.txt a X:Destino.txt para ver si Windows te da algún error.

edgwin
04-02-2011, 17:29:10
Gracias nuevamente por responder.

Hice lo que me sugeriste, pero si me dejo copiar el archivo a la unidad "X".

Me parece que delphi tiene un bug en este sentido.

Gracias por tu apoyo amigo.
Saludos!!

duilioisola
04-02-2011, 17:45:34
Parece ser que si... No veo ningún otro error.
Si lo que quieres copiar es un archivo XML, lo que te sugiero que hagas es lo siguente:
Creas un TStrings y utilizas los métodos LoadFromFile SaveToFile


var
ts : TStrings;
[...]
{CopyFile(PChar(vFile),PChar('X:\archivo.XML'),False);}
ts := TStrings.Create;
try
ts.LoadFromFile(vFile);
ts.SaveToFile('X:\archivo.XML');
finally
ts.Free;
end;
[...]

duilioisola
04-02-2011, 17:49:55
Otra opción es usar Streams. TFileStream en este caso...

Ejemplo de Delphi 6:

procedure TForm1.Save1Click(Sender: TObject);

var
NewFileName: string;
Msg: string;
NewFile: TFileStream;
OldFile: TFileStream;
begin
NewFileName := ExtractFilePath(Application.ExeName) + ExtractFileName(Edit1.Text);
Msg := Format('Copy %s to %s?', [Edit1.Text, NewFileName]);
if MessageDlg(Msg, mtConfirmation, mbOKCancel, 0) = mrOK then
begin
OldFile := TFileStream.Create(Edit1.Text, fmOpenRead or fmShareDenyWrite);
try
NewFile := TFileStream.Create(NewFileName, fmCreate or fmShareDenyRead);

try
NewFile.CopyFrom(OldFile, OldFile.Size);
finally
FreeAndNil(NewFile);
end;
finally
FreeAndNil(OldFile);
end;
end;
end;

duilioisola
04-02-2011, 17:52:08
Otra opcion BlockRead - BlockWrite

Ejemplo de Delphi 6:

var
FromF, ToF: file;
NumRead, NumWritten: Integer;
Buf: array[1..2048] of Char;
begin
if OpenDialog1.Execute then { Display Open dialog box }
begin
AssignFile(FromF, OpenDialog1.FileName);
Reset(FromF, 1); { Record size = 1 }
if SaveDialog1.Execute then { Display Save dialog box}
begin
AssignFile(ToF, SaveDialog1.FileName); { Open output file }

Rewrite(ToF, 1); { Record size = 1 }
Canvas.TextOut(10, 10, 'Copying ' + IntToStr(FileSize(FromF))
+ ' bytes...');
repeat
BlockRead(FromF, Buf, SizeOf(Buf), NumRead);
BlockWrite(ToF, Buf, NumRead, NumWritten);
until (NumRead = 0) or (NumWritten <> NumRead);
CloseFile(FromF);
CloseFile(ToF);
end;
end;
end;

edgwin
05-02-2011, 16:42:36
Gracias amigo .... ya resolvi el problema.

Hice un servidor de archivos TCP, donde el servidor enviar el archivo y en la computadora cliente lo recibe y lo coloca en la ruta indicada.

Gracias nuevamente

Saludos!

juank1971
21-03-2011, 21:03:55
saludos edgwin y como hiciste ese servidor, postea eso me interesa estoy haciendo lo mismo.

saludos juank

edgwin
22-03-2011, 17:33:20
Claro que si amigo. En un momento mas te posteo el programita que hice, solo deja lo modifico para que sea un poco mas "generico" y no te marque errores.

Saludos!

edgwin
22-03-2011, 18:21:58
Que tal juank1971

Dame un correo para poderte enviar los archivos ya que el foro no me deja postearlos. Cabe mensionar que el programa servidor es un servicio, por lo que hay que compilar y construir e instalar en el sistema (inicio -> ejecutar -> C:\...\SrvDicomAgfa.exe /install).

Saludos!

rgstuamigo
22-03-2011, 18:32:02
Que tal juank1971

Dame un correo para poderte enviar los archivos ya que el foro no me deja postearlos....

El club delphi cuenta con un FTP (http://www.terawiki.clubdelphi.com/) donde puedes compartir tus proyectos,ejemplos,tutoriales,libros,etc. puedes subirlo ahí para compartirlos con todos, tan solo debes ponerlo en el lugar adecuado...;)
Saludos...:)

edgwin
22-03-2011, 18:36:57
Gracias, de hecho es lo que acabo de hacer:

Servidor (http://www.terawiki.clubdelphi.com/archivos/Delphi/Ejemplos/Servidor.rar) y Cliente (http://www.terawiki.clubdelphi.com/archivos/Delphi/Ejemplos/EnviaArchivos.rar)

Espero te sirva. Cualquier cosa, no dudes en preguntar.

Saludos!

juank1971
13-04-2011, 15:17:40
Saludos de nuevo por fin subiste el programa al ftp , ???
no te puedo mandar el correo por esta via , no esta permitido en los foros.

salud y pesetas gracias

juank1971
13-04-2011, 15:25:04
disculpa no habia leido bien gracias amigo salud y pesetas de nuevo, hoy el ide del delphi me tiene medio entretenido