PDA

Ver la Versión Completa : Ruta/Dirección/Path en PC Remoto


jhonalone
06-08-2011, 20:40:33
Hola Compañeros! Agradecería vuestra ayuda.

A ver si sé explicarme.

Tengo una red doméstica entre mi PC sobremesa y el portátil.

Tengo un programa instalado en el PC sobremesa y lo quiero ejecutar desde el portátil. Bueno, hasta aquí no hay problema, he conseguido ejecutarlo.

Cuando uso ficheros que están en el directorio del programa, no tengo problemas en leerlos y grabarlos desde el portátil, como si estuviera en el de sobremesa, vamos.


El problema surge cuando tengo que usar un fichero con una path determinada en el PC sobremesa o cuando quiero utilizar GetCurrentDir, que me proporciona una dirección que luego me da error al utilizarla. P.e.: al buscar archivos del directorio actual me proporciona una dirección como la siguiente \

jhonalone
06-08-2011, 22:22:11
No se qué pasó.

No se incorporó la mitad de mi post. Acabo de verlo ahora, disculpadme.

Justo después de las dos barras inversas "\\" se perdió TODO lo que había escrito. Vuelvo a escribir todo el mensaje.

Hola Compañeros! Agradecería vuestra ayuda.

A ver si sé explicarme.

Tengo una red doméstica entre mi PC sobremesa y el portátil.

Tengo un programa instalado en el PC sobremesa y lo quiero ejecutar desde el portátil. Bueno, hasta aquí no hay problema, he conseguido ejecutarlo.

Cuando uso ficheros que están en el directorio del programa, no tengo problemas en leerlos y grabarlos desde el programa ejecutado en el portátil, como si estuviera en el de sobremesa, vamos.

El problema surge cuando tengo que usar un fichero con una path determinada en el PC sobremesa o cuando quiero utilizar GetCurrentDir, que me proporciona una dirección que luego me da error al utilizarla. P.e.: al buscar archivos del directorio actual me proporciona una dirección como la siguiente "\ \ PC1\Dir1\fichero.ext" (Pongo las barras invertidas separadas, para que no me pase lo mismo. Esta es la path facilitada por GetCurrentDir)

"PC1" es el nombre asignado al PC de sobremesa, "Dir1" es el nombre asignado al directorio compartido, donde reside el ejecutable. "fichero.ext" es el nombre de cualquier fichero en el "Dir1"

Cuando intento utilizar la Path recibida para copiar un fichero, (dentro del mismo directorio compartido, pero con otro nombre) con el siguiente procedimiento, no realiza la acción.
procedure CopyFiles(Source, Dest: String);
var
FileOpInfo: TShFileOpStruct;
begin
FillChar(FileOpInfo, SizeOf(FileOpInfo), 0);
FileOpInfo.wFunc := FO_COPY;
FileOpInfo.pFrom := PChar(Source + #0);
FileOpInfo.pTo := PChar(Dest);
FileOpInfo.fFlags := FOF_NOCONFIRMMKDIR;
ShFileOperation(FileOpInfo);
end;

El mismo problema se manifiesta en otra fase del programa, donde intento hacer una copia de seguridad a un subdirectorio, dentro del directorio donde está ubicado el ejecutable.

En un fichero tengo almacenada la dirección donde el usuario ha elegido hacer la copia de seguridad. (Puede ser en el mismo directorio y PC, como es el caso, o en otro PC de la red, que no lo he probado)

Bien, la dirección es del tipo: "C:\MiPrograma\CopySegu"

DirectoryExists("C:\MiPrograma\CopySegu") responde que no existe (aunque exista)

MKDir("C:\MiPrograma\CopySegu") da Error #21 (no sé qué significa, pero supongo que será que no encuentra la path)

Y aquí estoy. No sé como direccionar desde Delphi7 los ficheros que residen en un PC de la red.

CREO QUE ES OBVIO DECIR QUE TODO FUNCIONA PERFECTAMENTE SI NO ESTA EN RED.

Es la primera vez que voy a intentar utilizar un programa en red local y estoy bastante perdido.

Agradeceré cualquier sugerencia o ayuda.

Saludos.

Chris
07-08-2011, 01:31:37
[COLOR=red]
Bien, la dirección es del tipo: "C:\MiPrograma\CopySegu"

DirectoryExists("C:\MiPrograma\CopySegu") responde que no existe (aunque exista)

MKDir("C:\MiPrograma\CopySegu") da Error #21 (no sé qué significa, pero supongo que será que no encuentra la path)

Primero, talvez "C:\MiPrograma\CopySegu" existe en la computadora de escritorio, pero no en la portatil. Así que este error siempre lo tendrás.

Con relación al Error # 21 tampoco sé que significa. Pero pueden ser dos cosas: 1) que la ruta "C:\MiPrograma\" no exista o 2) que la aplicación no tenga permisos para crear carpetas en la raiz C:\.

[COLOR=red]
El problema surge cuando tengo que usar un fichero con una path determinada en el PC sobremesa o cuando quiero utilizar GetCurrentDir, que me proporciona una dirección que luego me da error al utilizarla. P.e.: al buscar archivos del directorio actual me proporciona una dirección como la siguiente "\ \ PC1\Dir1\fichero.ext"

"PC1" es el nombre asignado al PC de sobremesa, "Dir1" es el nombre asignado al directorio compartido, donde reside el ejecutable. "fichero.ext" es el nombre de cualquier fichero en el "Dir1"

Cuando intento utilizar la Path recibida para copiar un fichero, (dentro del mismo directorio compartido, pero con otro nombre) con el siguiente procedimiento, no realiza la acción.

Cuál es ese "otro nombre" que estás utilizando?

Por último, podrías detallar un poco más los errores que está generando la aplicación.

Saludos,
Chris

jhonalone
07-08-2011, 09:36:55
Gracias Chris, por leerme y por querer ayudarme.

El "otro nombre" se refiere a que el mismo fichero (P.e: "fichero.txt" le duplico para hacer copia de seguridad con el nombre "fichero2.txt", pero en el mismo directorio del ejecutable.

No sé muy bien como funciona esto, ¿quieres decir que, aunque el programa ejecutable está en el PC de sobremesa, si yo le doy una ruta, la va a buscar en el portátil, desde el que ejecuto el programa?

Sin embargo, el resto de ficheros que no direcciono, sino dejo por defecto los está escribiendo corrrectamente en el PC de escritorio.

Y cuando le pido GetDir() o GetCurrentDir, me facilita una ruta con los datos de los nombres de la red, pero luego no puedo utilizarla para acceder a ellos, ni en el mismo directorio del ejecutable. Ya te dije que entiendo poco de esto, si puedes o conoces algún manual rápido de redes locales, te agradezco me lo indiques y así resolver las cuestiones, que pueden ser triviales si las conoces, pero insalvables si no las cononoces.

Gracias de todos modos. Chris.

Un saludo.

ecfisa
08-08-2011, 09:19:37
Hola jhonalone.

Supongamos que el equipo donde se encuentra el programa se llama DESKTOP y tu portátil NOTEBOOK. También supongamos que el programa se encuentra en la ubicacion: C:\MiPrograma.

Bién, ahora la ubicación que devuelva GetCurrentDir, es relativa al equipo que esté ejecutando la aplicación, por ejemplo la instrucción:

ShowMessage(GetCurrentDir);

. Ejecutada desde DESKTOP mostrará: C:\MiPrograma
. Ejecutada desde NOTEBOOK mostrara: \\DESKTOP\MiPrograma

El problema es que si desde NOTEBOOK haces una una copia usando la cadena: 'C:\MiPrograma', estas haciendo referencia al disco C: de NOTEBOOK y no de DESKTOP.
No es una idea inteligente espejar los directorios para solapar el error, por que cuando pienses que estas copiando en DESKTOP lo harás en NOTEBOOK.

Para verificarlo, podés realizar una simple prueba: Una aplicación con un TButton y el siguiente código:

procedure TForm1.Button1Click(Sender: TObject);
begin
if not CopyFile(PChar('C:\MiPrograma\Archivo.txt'), PChar('C:\MiPrograma\Archivo.bak'), True) then
ShowMessage('ERROR. No se pudo realizar la copia');
end;


.Ejecutado desde DESKTOP, realiza la copia sin problemas.
.Ejecutado desde NOTEBOOK muestra el mensaje: 'ERROR. No se pudo realizar la copia'.

Eso sucede por que la aplicación no puede saber desde donde fué ejecutada.

Saludos.

Edito: Ya me olvidaba... : I/O Error 21: ERROR_NOT_READY (The device is not ready)

jhonalone
08-08-2011, 16:23:51
Gracias, Ecfisa.
¡Qué grande eres y que bien te explicas!

No te he respondido antes porque he estado probando.
Si no he comprendido mal, cuando quiera referirme desde NOTEBOOK, a una dirección de DESKTOP, deberé sustituir, (siguiendo tu ejemplo) C:\MiPrograma por \\DESKTOP\MiPrograma

y siguiendo esta lógica, C:\Ejemplo\Primero\MiPrograma SE DEBERÍA CAMBIAR por \\ DESKTOP\Ejemplo\Primero\MiPrograma

¿y los problemas de direcciones en red se solucionarían de este modo?

Gracias por tu esfuerzo y por tu ayuda.

Saludos.

ecfisa
08-08-2011, 18:33:46
Hola jhonalone.

¡Qué grande eres
Si quitás la lupa vas a ver que no es así... :D

Ahora fuera de bromas, lo que creo que al trabajar de ese modo, vas a tener que efectuar todas tus acciones desde la ubicación de la aplicación. Ya que es el único punto de referencia en común entre DESKTOP y NOTEBOOK.

Es decir que tu centro de operaciones debería ser:
Desde el equipo de escritorio (DESKTOP): C:\MiPrograma o ya sea, visto desde la laptop (NOTEBOOK): \\DESKTOP\MiPrograma


No estoy en red para probar el código siguiente, pero pienso que debería funcionar en ambos equipos.

Ubicándonos en DESKTOP, y suponiendo que tenemos: C:\MiPrograma\arch1.e1 y quisieramos guardar arch1.e1 en la carpeta C:\MiPrograma\Dir :


procedure CopiarArchivo(Origen, Destino: string; const Nombre: string);
begin
Origen:= IncludeTrailingPathDelimiter(Origen)+Nombre;
Destino:= IncludeTrailingPathDelimiter(Destino)+Nombre;
if not CopyFile(PChar(Origen), PChar(Destino), True) then
ShowMessage('Error al intentar copiar el archivo');
end;

procedure TForm1.Button1Click(Sender: TObject);
var
PtoPartida: string;
begin
PtoPartida:= ExtractFilePath(Application.ExeName);
CopiarArchivo(PtoPartida, PtoPartida+'Dir', 'arch1.e1'); // 'Dir' debe haber sido creado con anterioridad
end;
...

Pero como te dije arriba vas a tener que probarlo, no tengo manera de hacerlo ahora.

Un saludo.

jhonalone
08-08-2011, 20:09:02
Aun quitando la lupa, eres GRANDISIMO, Ecfisa.

Probaré lo que me mandas y te cuento.

Mientras tanto. Y si quieres entretenerte, te voy a proponer otra cuestión, que es para nota, (Bastante más complicada).
Si un usuario, elige como ruta de destino para los ficheros de copia de suguridad otro ordenador de la red, que no sea DESKTOP, sino otro portátil o sobremesa, conectado como NOTEBOOK2 o DESKTOP2, y esta dirección está grabada en un fichero, por ejemplo como "\\ DESKTOP2\Compartido", ¿Habría alguna posibilidad de averiguar, (desde DESKTOP), a qué dirección REAL corresponede y cómo puedo grabar las copias de seguridad en esta dirección, desde NOTEBOOK?.

Sé que es una pregunta muy complicada, (a lo mejor imposible de resolver), te pido que no gastes demasiado tiempo en resolverla si ves que es muy complicada.

Gracias por tu inestimable ayuda, Ecfisa.

Un saludo cordial.

jhonalone
08-08-2011, 20:44:04
Ecfisa, he probado tu código y funciona perfectamente. (NO esperaba otra cosa)

Gracias.
Un saludo.

newtron
09-08-2011, 09:02:53
Este ecfisa ya empieza a caerme mal, ¿es que sabes todo de todo? :p

jhonalone
10-08-2011, 10:02:05
Estaré fuera unos dias.
Pero no he olvidado el tema.
Lo digo por si tardo en responderos es por este motivo.
Saludos a todos.

eroblesh
16-10-2011, 20:57:33
Hola jhonalone.
El problema es que si desde NOTEBOOK haces una una copia usando la cadena: 'C:\MiPrograma', estas haciendo referencia al disco C: de NOTEBOOK y no de DESKTOP.
No es una idea inteligente espejar los directorios para solapar el error, por que cuando pienses que estas copiando en DESKTOP lo harás en NOTEBOOK.

Para verificarlo, podés realizar una simple prueba: Una aplicación con un TButton y el siguiente código:

procedure TForm1.Button1Click(Sender: TObject);
begin
if not CopyFile(PChar('C:\MiPrograma\Archivo.txt'), PChar('C:\MiPrograma\Archivo.bak'), True) then
ShowMessage('ERROR. No se pudo realizar la copia');
end;


.Ejecutado desde DESKTOP, realiza la copia sin problemas.
.Ejecutado desde NOTEBOOK muestra el mensaje: 'ERROR. No se pudo realizar la copia'.

Eso sucede por que la aplicación no puede saber desde donde fué ejecutada.

Saludos.

Edito: Ya me olvidaba... : I/O Error 21: ERROR_NOT_READY (The device is not ready)

Que tal eficsa oya aca dando lata de nuevo veia este codigo para copiar un archivo desde mi red a mi pc pero no me esta funcionando el codigo es algo asi


procedure TForm1.btn2Click(Sender: TObject);
begin
if not CopyFile(PChar('\\Teamkonetl\instalacionk\KONETL\KONETL.exe'), PChar('C:\konetl'), True) then
ShowMessage('ERROR. No se pudo realizar la copia');
end;



siempre me regresa el error de que no se pudo copiar, me podrias comentar si algo esta mal? lo hago desde la linea de comandos y si lo ejecuta mm gracias salu2

eroblesh
16-10-2011, 22:00:38
jejej ya logre que funcionara, pero ahora lo necesito integrara mi aplicacion pero cuando lo quiero ejecutar no me deja por que el programa esta en uso, me podrian recomendar algo??? gracias