Ir al contenido



Foto

Obtener ubicación correcta de un archivo


  • Por favor identifícate para responder
10 respuestas en este tema

#1 monchito_elroro

monchito_elroro

    Advanced Member

  • Miembros
  • PipPipPip
  • 247 mensajes

Escrito 13 octubre 2016 - 10:43

Buenas amigos :) , como están yo aquí de nuevo para solicitarles una ayuda con un problema.

Por ejemplo si yo tengo cualquiera estos valores (String):

 

c:\files\test.exe -f

c:\files\test.exe -startup

c:\files\test.exe /min

"c:\files\test.exe" /autostart

 

como puedo hacer para solo obtener la ruta exacta del programa, es decir:

 

c:\files\test.exe

 

Les agradezco cualquier ayuda que me puedan brindar, saludos :)

 


  • 0

#2 Gaston

Gaston

    Advanced Member

  • Miembros
  • PipPipPip
  • 63 mensajes

Escrito 14 octubre 2016 - 12:17

Hola, con funciones de manejo de cadenas Length, Pos, etc... 

Creo que primero deberás hallar la subcadena 'c:' y extraer desde allí hasta encontrar el '.exe' 

Con Pos('c:',cadena) y Pos('.exe',cadena) y luego un Copy(cadena, posición1, posición2). Eso a grandes rasgos.  Pos devuelve la posición donde comienza la subcadena, para encontrar 'c:' te alcanza.

 

 

Te dejo par de links en español que tratan los manejos de cadenas: 

 

http://www.nachocaba...s5/cupas04b.php

 

http://www.lawebdelp...scal/pag007.php

 

Saludos.


  • 0

#3 Agustin Ortu

Agustin Ortu

    Advanced Member

  • Moderadores
  • PipPipPip
  • 636 mensajes
  • LocationArgentina

Escrito 14 octubre 2016 - 12:49

Nunca lo probé cuando el string tiene los parámetros de la línea de comandos, pero la función ProcessPath http://docwiki.embar...trl.ProcessPathpodría servir
  • 0

#4 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.459 mensajes
  • LocationMallorca

Escrito 14 octubre 2016 - 02:17

¿ Has probado a usar las funciones ExtractFileName y ExtractFilePath sobre esas cadenas ?. No sé si te van a eliminar los parámetros, pero vale la pena intentarlo.


  • 0

#5 BDWONG

BDWONG

    Member

  • Miembros
  • PipPip
  • 21 mensajes

Escrito 14 octubre 2016 - 04:54

Hola puedes probar esta alternativa que recorre la cadena de modo inverso 


delphi
  1. function PathFilter(const Path:String):String;
  2. var Index:DWord;
  3. begin
  4. Index:=Length(Path);
  5. while Path[Index]<>#32 do Dec(Index);
  6. Result:=Copy(Path,1,Index);
  7. end;
  8.  
  9. begin
  10.  
  11. Writeln(PathFilter('c:\files\test.exe -f'));
  12. Writeln(PathFilter('c:\files\test.exe -startup'));
  13. Writeln(PathFilter('c:\files\test.exe /min'));
  14. WriteLn(PathFilter('c:\files\test.exe /autostart'));
  15.  
  16. ReadLn;
  17. end.

Saludos...  (y)


  • 0

#6 monchito_elroro

monchito_elroro

    Advanced Member

  • Miembros
  • PipPipPip
  • 247 mensajes

Escrito 14 octubre 2016 - 07:11

Muchas gracias amigos por su ayuda :) , les comento que primeramente probe con extractfilename y extractfilepath, pero no me dio el resultado deseado... :(

por ejemplo en:


php
  1. showmessage(extractfilename('c:\files\test.exe -f'));    // me muestra   test.exe -f
  2. showmessage(extractfilepath('c:\files\test.exe -f'));      // me muestra   c:\files\

De momento el código del amigo BDWONG me esta ayudando mucho: :D :D


php
  1. function PathFilter(const Path:String):String;
  2.  
  3. var Index:DWord;
  4. begin
  5. Index:=Length(Path);
  6. while Path[Index]<>#32 do Dec(Index);
  7. Result:=Copy(Path,1,Index);

 
por ejemplo en:

php
  1. showmessage(PathFilter('c:\files\test.exe -f'));                       // me muestra c:\files\test.exe
  2. showmessage(PathFilter('c:\files\test.abcde -startup'));        // me muestra c:\files\test.abcde
  3. showmessage(PathFilter('c:\files\test.bd /min'));                    // me muestra c:\files\test.bd
  4. showmessage(PathFilter('c:\files\test.1 /autostart'));              // me muestra c:\files\test.1

De momento me esta trabajando perfecto le agradezco por la ayuda  (y)  , más bien si no fuera mucha confianza como podría hacer en el caso que exista comillas dentro del path...

Por ejemplo si tengo los string:


php
  1. "c:\files\test.exe" /autostart
  2. "c:\files\test.db" /IM

El código del amigo BDWONG me devuelve:


php
  1. "c:\files\test.exe" /autostart      // devuelve   "c:\files\test.exe"
  2. "c:\files\test.db" /IM                  // devuelve   "c:\files\test.db"

Como puedo hacer para que devuelva por ejemplo el path exacto     c:\files\test.exe

Saludos y gracias por su tiempo.


  • 0

#7 BDWONG

BDWONG

    Member

  • Miembros
  • PipPip
  • 21 mensajes

Escrito 14 octubre 2016 - 08:59

Hola @mochito_elroro  una forma para resolver lo de las las comillas es usar la funcion stringReplace que remplaza todas las ocurrencias(comillas) por el espacio vacio quedando mas o menos asi 


delphi
  1. function PathFilter(Path:String):String;
  2. var Index:DWord;
  3. begin
  4. Path:=StringReplace(Path,#34,EmptyStr,[rfReplaceAll,rfIgnoreCase]);
  5. Index:=Length(Path);
  6. while Path[Index]<>#32 do Dec(Index);
  7. Result:=Copy(Path,1,Index);
  8. end;
  9.  
  10. begin
  11. Writeln(PathFilter('c:\files\test.exe -f'));
  12. Writeln(PathFilter('c:\files\test.abcde -startup'));
  13. Writeln(PathFilter('c:\files\test.exe" /autostart'));
  14. WriteLn(PathFilter('"c:\files\test.db" /IM'));
  15.  
  16. ReadLn;
  17. end.

Claro hay montones de formas de plantear el problema ya tu decides por cual irte.

Saluddos.... (y)


  • 0

#8 monchito_elroro

monchito_elroro

    Advanced Member

  • Miembros
  • PipPipPip
  • 247 mensajes

Escrito 15 octubre 2016 - 08:57

Amigo BDWONG es usted un genio (y) me ha servido perfectamente.

He estado probando sus códigos y trabajan muy bien, pero me he topado con un gran problema :( :( , antes que nada les comento lo que deseo crear.

 

Estoy tratando de listar todos los programas que se iniciar cada vez que se enciende la pc, para ser más claro estoy listando todos los item que aparece en esta sección del registro: (y)


php
  1. HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
  2. HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
  3. HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce

Ahora los primero códigos que el amigo BDWORD muy amablemente compartió me sirvieron tanto para las siguientes STRING:


php
  1. c:\files\test.exe -f
  2. c:\files\test.exe -abcde startup
  3. c:\files\test.1 /min
  4. "c:\files\test.db" /autostart

Pero ahora me topo con que otros valores tienes este formato: :|


php
  1. C:\Windows\system32\cmd.exe /q /c rmdir /s /q "C:\Users\juanito\AppData\17.3.6390.0509\amd64"
  2. c:\trabajos diarios\escuela\test.exe /s /q
  3. c:\files\test.exe /s /q

Ahora si no se que hacer, Pienso que talvez se tenga que hacer un recorrido desde el comienzo para obtener la ruta exacta, pero tomando en cuenta que en el camino puedan existir espacios y puntos que forman parte del path y que no necesariamente indican el final del string o una posible extensión, ya me maree :s


  • 0

#9 BDWONG

BDWONG

    Member

  • Miembros
  • PipPip
  • 21 mensajes

Escrito 15 octubre 2016 - 09:51

Bueno quizás seria mejor  plantear el problema de una forma distinta en vez de recorrer la cadena de manera inversa quizás seria mejor seria encontrar la posicion de la extensión de la aplicación y ya conociendo ese valor entonces ahora si copiar desde la posición 1 hasta la posición n, 


delphi
  1. function PathFilter(Path,extension:String):String;
  2. var iPos:DWord;
  3. begin
  4. Result:=EmptyStr;
  5. iPos:=Pos(extension,Path);
  6.  
  7. if iPos>0 then begin
  8. Path:=StringReplace(Path,#34,EmptyStr,[rfReplaceAll,rfIgnoreCase]);
  9. Result:=Copy(Path,1,iPos+Length(extension)-1);
  10. end;
  11. end;
  12.  
  13. begin
  14. WriteLn(PathFilter('C:\Windows\system32\cmd.exe /q /c rmdir /s /q "C:\Users\juanito\AppData\17.3.6390.0509\amd64"','.exe'));
  15. WriteLn(PathFilter('c:\trabajos diarios\escuela\test.exe /s /q','.exe'));
  16. WriteLn(PathFilter('c:\files\test.abcde -startup','.abcde'));
  17. WriteLn(PathFilter('"c:\files\test.db" /IM','.db'));
  18.  
  19. ReadLn;
  20. end.

PD: Si no se encuentra la extensión devolvera una cadena vacia


  • 0

#10 Gaston

Gaston

    Advanced Member

  • Miembros
  • PipPipPip
  • 63 mensajes

Escrito 15 octubre 2016 - 10:08

Esto funciona para los .exe si no es .exe devuelve una cadena vacía. En el único caso que no funciona bien es en el que comienza con "
Adjunto el archivo .pas por si lo querés probar con FPC por consola.
 
Éste es el resultado que se obtiene:
 


delphi
  1. c:\files\test.exe
  2. c:\files\test.exe
  3. c:\files\test.exe
  4. c::\files\test.exe"
  5. C:\Windows\system32\cmd.exe
  6. c:\trabajos diarios\escuela\test.exe
  7. c:\files\test.exe

 
Saludos.
 


delphi
  1. function elPath(spath:string):string;
  2. var
  3.   aux1,aux2:string;
  4.   i,j:integer;
  5. begin
  6.   aux1:=UpperCase(spath);
  7.   i:=Pos('C:',aux1);
  8.   aux2:=Copy(spath,i,2);
  9.   j:=Pos('.EXE',aux1);
  10.   aux2:=aux2+Copy(spath,Length(aux2)+1,j+2);
  11.   if (i=0) or (j=0) then elPath:='' else elPath:=aux2;
  12. end;
  13.  
  14. var
  15.    aPath:array [1..7] of string;
  16.    k:integer;
  17.  
  18. begin
  19.    aPath[1]:='c:\files\test.exe -f';
  20.    aPath[2]:='c:\files\test.exe -startup';
  21.    aPath[3]:='c:\files\test.exe /min';
  22.    aPath[4]:='"c:\files\test.exe" /autostart';
  23.    aPath[5]:='C:\Windows\system32\cmd.exe /q /c rmdir /s /q "C:\Users\juanito\AppData\17.3.6390.0509\amd64"';
  24.    aPath[6]:='c:\trabajos diarios\escuela\test.exe /s /q';
  25.    aPath[7]:='c:\files\test.exe /s /q';
  26.    for k:=1 to 7 do
  27.       writeln(elPath(aPath[k]))
  28. end.

Archivos adjuntos


  • 0

#11 monchito_elroro

monchito_elroro

    Advanced Member

  • Miembros
  • PipPipPip
  • 247 mensajes

Escrito 15 octubre 2016 - 11:59

Guauuu :shocked:

No cabe duda que todos son unos master les agradezco que me den una mano, voy a probar sus sugerencias y les comento. :)


  • 0