Jump to content


Photo

Situacion con Movefile/MoveFileEx


  • Please log in to reply
9 replies to this topic

#1 Kipow

Kipow

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 228 posts
  • LocationGuatemala

Posted 04 May 2009 - 03:38 PM

Hola, tengo el siguiente codigo que utilizo para sustituir los ejecutables de mi sistema en caliente (en uso)


delphi
  1. MoveFile(PWideChar('C:\MIPROGRAMA\EXE\EJECUTABLE.EXE'),PWideChar('C:\MIPROGRAMA\EXE\EJECUTABLE.TMP');
  2. MoveFile(PWideChar('C:\WINDOWS\TEMP\MIPROGRAMA\EJECUTABLE.EXE'),PWideChar('C:\MIPROGRAMA\EXE\EJECUTABLE.EXE'));

(Funciona ignoren los espacios en la segunda instruccion, no me dejo quitarlos el editor del post.)

Pues realmente si funciona me deja sustituir el ejecutable en caliente (en uso) pero resulta que la carpeta C:\MIPROGRAMA\EXE es un recurso compartido en la red. luego de ejecutar las sentencias anteriores algo sucede al recurso compartido, puedo accederlo desde el explorador de windows y ejecutarlo en el servidor que es desde donde actualizo el ejecutable, ahora bien si intento hacerlo desde otra pc accediendo al recurso compartido no me deja simplemente no hace nada, para que funcione tengo que quitar el recurso compartido y volver a compartir. alguna idea de porque sucede esto?

Gracias por el tiempo.

saludos.
  • 0

#2 cHackAll

cHackAll

    Advanced Member

  • Administrador
  • 599 posts

Posted 04 May 2009 - 04:14 PM

Puedes explicar un poco mejor el escenario... que no me queda claro?

PD; puedes recompartir la carpeta por codigo :p
  • 0

#3 Kipow

Kipow

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 228 posts
  • LocationGuatemala

Posted 04 May 2009 - 10:28 PM

Gracias por tu tiempo.

1. Carpeta en el servidor C:\MIPROGRAMA\EXE
2. Recurso compartido EXE.
3. Ejecuto el codigo del post anterior todo ok.
4. Al intentar acceder desde otro pc a MIPROGRAMA.EXE asi \\servidor\exe\MIPROGRAMA.EXE no hace nada.
5. En el servidor el recurso aparece como compartido pero si lo quito y lo vuelvo a compartir ya me funciona bien MIPROGRAMA.EXE.

A tu segunda pregunta si puedo recompartir por codigo pero solamente local asi lo tengo ahorita, pero me interesa que puedan actualizar MIPROGRAMA desde cualquier estacion. te coloco el codigo que utilizo para des/compartir.




delphi
  1. function ShareFolder(ServerName, NetName, Path : WideString) : boolean;
  2. var
  3.     shareInfo:SHARE_INFO_2;
  4.     pass:widestring;
  5.     status:NET_API_STATUS;
  6. begin
  7.   pass:='';
  8.  
  9.   zeroMemory(@shareInfo,sizeof(SHARE_INFO_2));
  10.   shareInfo.shi2_netname:=PWideChar(netname);
  11.   shareInfo.shi2_type:=STYPE_DISKTREE;
  12.   shareInfo.shi2_remark:=PWideChar('Compartiendo Carpeta '+netname);
  13.     shareInfo.shi2_permissions:=shareInfo.shi2_permissions or ACCESS_ALL;
  14.  
  15.   shareInfo.shi2_max_uses:=200;
  16.   shareInfo.shi2_current_uses:=0;
  17.   shareInfo.shi2_path:=PWideChar(path);
  18.   shareInfo.shi2_passwd:=PWideChar(pass);
  19.   status:=NetShareAdd(PWideChar(servername),2,@shareInfo,nil);
  20.   if status<>NERR_SUCCESS then
  21.     raise exception.Create(MensajeErrorShare(status));
  22. end;
  23.  
  24.  
  25. function UnShareFolder(ServerName, Netname : WideString) : Boolean;
  26. var
  27.     status:NET_API_STATUS;
  28. begin
  29.   status:=NetShareDel(PWideChar(servername),PWideChar(netName),0);
  30.   if status<>NERR_SUCCESS then
  31.     raise exception.Create(MensajeErrorShare(status));
  32. end;


  • 0

#4 cHackAll

cHackAll

    Advanced Member

  • Administrador
  • 599 posts

Posted 05 May 2009 - 10:01 AM

Todo funciona normal, pero cuando en el servidor actualizas el ejecutable usando MoveFile ya no es posible acceder al mismo desde otro equipo... es eso?
  • 0

#5 Kipow

Kipow

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 228 posts
  • LocationGuatemala

Posted 05 May 2009 - 04:41 PM

Exactamente Chackall jajaja en resumen ese es el problema.
  • 0

#6 cHackAll

cHackAll

    Advanced Member

  • Administrador
  • 599 posts

Posted 05 May 2009 - 04:53 PM

Bueno, en algunas cosas soy lento ;)

Lo unico que se me ocurre es que; dado que el SO crea un caché de los recursos compartidos, por alguna razon al cambiar el recurso en si deja de ser accesible.

Lo que yo haria es actualizar, y re-compartir la carpeta.
  • 0

#7 Kipow

Kipow

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 228 posts
  • LocationGuatemala

Posted 06 May 2009 - 02:52 AM

mas bien sera que no me di a entender con facilidad. aun asi las funciones para compartir y descompartir no me funcionan a la perfeccion, resulta que efectivamente recomparten pero no hacen lo mismo que cuando lo hago manualmente.
  • 0

#8 Kipow

Kipow

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 228 posts
  • LocationGuatemala

Posted 06 May 2009 - 06:44 AM

Bueno, ya con sueño, pero encontre otra forma de hacer lo que necesito (aunque aun no en delphi).  con el comando NET FILE #id /CLOSE desde la linea de comando logro matar el proceso y ya puedo simplemente copiar encima el ejecutable nuevo. peeeero no se como hacer eso desde delphi. considerando que necesito listar todos los procesos que correspondan a mi ejecutable. (esto lo hago con NET FILE aunque ahi aparecen todos los archivos compartidos en uso). Alguna idea? cual sera el api que hace las funciones del NET FILE?
  • 0

#9 Kipow

Kipow

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 228 posts
  • LocationGuatemala

Posted 06 May 2009 - 08:48 AM

Bueno ya estoy casi listo. las APIs que me sirven son NetFileEnum y NetFileClose, el NetFileEnum me lista los archivos abiertos desde otras PCs y el NetFileClose cierra algo asi como el manejador pero no cierra las aplicaciones y eso me parece excelente porque las PCs clientes siguen trabajando normal (me imagino porque la aplicacion ha de estar toda en memoria la verdad no se). ahora me queda una duda como puedo hacer lo mismo pero con los archivos abiertos localmente?
  • 0

#10 Kipow

Kipow

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 228 posts
  • LocationGuatemala

Posted 07 May 2009 - 03:06 AM

Bueno Al final todo lo solucione de una forma tan sencilla. Moviendo el archivo en uso y copiando el nuevo. algo como



delphi
  1. MoveFil(PChar('c:\miprograma\exe\programa.exe'),pchar('c:\miprograma\exe\temp.tmp');
  2. CopiarArchivo(pchar('c:\nuevo.exe'),PChar('c:\miprograma\exe\programa.exe'));


esta es la funcion copiar, nada del otro mundo.



delphi
  1. function CopiarArchivo(const FromFolder: string; const ToFolder: string) : boolean;
  2. var
  3.   Fo      : TSHFileOpStruct;
  4.   buffer  : array[0..4096] of char;
  5.   p      : pchar;
  6. begin
  7.   FillChar(Buffer, sizeof(Buffer), #0);
  8.   p := @buffer;
  9.   StrECopy(p, PChar(FromFolder)); //this is folder that you want to copy
  10.   FillChar(Fo, sizeof(Fo), #0);
  11.   Fo.Wnd    := 0;
  12.   Fo.wFunc  := FO_COPY;
  13.   Fo.pFrom  := @Buffer;
  14.   Fo.pTo    := PChar(ToFolder); //this is where the folder will go
  15.   Fo.fFlags := FOF_NOCONFIRMATION or FOF_ALLOWUNDO;
  16.   result := ((SHFileOperation(Fo) <> 0) or (Fo.fAnyOperationsAborted <> false));
  17. end;



Gracias a todos por su atencion y espero esta info le sea util a mas de uno.

Lo unico es que para poder acceder a la nueva version del ejecutable se deben de cerrar las instancias anteriores.


  • 0




IP.Board spam blocked by CleanTalk.