elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


+  Foro de elhacker.net
|-+  Programación
| |-+  Scripting
| | |-+  Cómo diferenciar un directorio de un archivo
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Cómo diferenciar un directorio de un archivo  (Leído 8,832 veces)
<ИΘZIЭ(ŦB>

Desconectado Desconectado

Mensajes: 109


-cyman-


Ver Perfil
Cómo diferenciar un directorio de un archivo
« en: 25 Agosto 2009, 05:12 am »

Buenas noches compañeros. Bueno, no sé que horario tengan uds, pero aquí es de noche. Saludos.

Quisiera saber si los archivos y directorios tienen agún identificador que los diferencie entre sí, de modo que se pueda verificar a través de un .bat.

Tengo un .bat que pide al usuario definir la ruta de un directorio o archivo, para luego almacenar ese valor en una variable. Lo que necesito ahora es poder saber si la ruta se trata de un archivo o un directorio, pero no sé cómo. Se me ocurrió verificar si la ruta tenía extensión, ya que así sabría que se trata de un archivo, pues los directorios no tienen extensión. No obstante, recordé que hay muchos archivos que tampoco tienen extensión, así que no lo intenté.

Así pues, consideré necesario acudir una vez más a uds a ver si me ayudan. Se los agradezco de antemano.


« Última modificación: 23 Junio 2010, 22:03 pm por <ИΘZIЭ(ŦB> » En línea

leogtz
. . .. ... ..... ........ ............. .....................
Colaborador
***
Desconectado Desconectado

Mensajes: 3.069


/^$/


Ver Perfil WWW
Re: Cómo diferenciar un directorio de un archivo
« Respuesta #1 en: 25 Agosto 2009, 06:21 am »

Código
  1. @echo off
  2. if ["%~1"]==[""] exit /b 0
  3. call:know %~1
  4. echo %var% | find /i "d" > nul 2>&1 && (
  5. echo Folder
  6. ) || (
  7. echo File
  8. )
  9. goto:Eof
  10. :know
  11. set "var=%~a1"
  12. goto:eof
Código:

C:\>code.bat code.bat
File

C:\>code.bat c:\windows
Folder

C:\>code.bat c:\windows\system32
Folder

C:\>code.bat c:\windows\system32\cmd.exe
File

C:\>code.bat file.txt
File

C:\>code.bat "c:\documents and settings"
Folder

C:\>


En línea

Código
  1. (( 1 / 0 )) &> /dev/null || {
  2. echo -e "stderrrrrrrrrrrrrrrrrrr";
  3. }
  4.  
http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com
0x0309

Desconectado Desconectado

Mensajes: 215


Ver Perfil
Re: Cómo diferenciar un directorio de un archivo
« Respuesta #2 en: 25 Agosto 2009, 08:27 am »

con if y agregas un \ al final

Por ejemplo si tu carpeta se llama:
nueva carpeta

Código:
if exist "nueva carpeta\" (echo. Es carpeta) else (
if exist "nueva carpeta" (echo.Es archivo) else (
echo.No existe.
)
)
En línea

kevlar

Desconectado Desconectado

Mensajes: 27



Ver Perfil
Re: Cómo diferenciar un directorio de un archivo
« Respuesta #3 en: 27 Agosto 2009, 16:23 pm »

Saludos


Puedes probar con un simple CD RUTA

Si la ruta es un archivo, entonces la variable %ERRORLEVEL% nos arrojaá un 1

De lo contrario si efectua el CD correctamente nos arroja 0 (cero)


F:\Armando>cd semana.bat
El nombre del directorio no es válido.

F:\Armando>echo %ERRORLEVEL%
1

F:\Armando>cd APPS

F:\Armando\APPs>echo %ERRORLEVEL%
0



 ;D
En línea

leogtz
. . .. ... ..... ........ ............. .....................
Colaborador
***
Desconectado Desconectado

Mensajes: 3.069


/^$/


Ver Perfil WWW
Re: Cómo diferenciar un directorio de un archivo
« Respuesta #4 en: 27 Agosto 2009, 17:22 pm »

El problema aquí es que podrías no tener permisos para acceder a ese directorio.

Pero podría funcionar.

Código:
cd /d "ruta" && (
echo Directorio
cd..
) || (
echo Archivo
)
En línea

Código
  1. (( 1 / 0 )) &> /dev/null || {
  2. echo -e "stderrrrrrrrrrrrrrrrrrr";
  3. }
  4.  
http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com
0x0309

Desconectado Desconectado

Mensajes: 215


Ver Perfil
Re: Cómo diferenciar un directorio de un archivo
« Respuesta #5 en: 2 Septiembre 2009, 05:25 am »

Miren, probé el código de Leo, no funciona bien porque:
por ejemplo:

Código:
C:\>code.bat c:\pagefile.sys
Folder

Se podría usar attrib, pero el problema es que attrib no muestra el atributo de directorio, usando una lógica similar a la de Leo de ver los atributos usando for que se expanden más o menos así si son un archivo:
Código:
---------
si son un directorio:
Código:
d--------
si no existen:
Código:


pero el problema es que con archivos especiales, como el pagefile.sys el for expande como si no existiera.

hice este código más rebuscado, con validaciones:

Código:
@echo off

call :isFolder "%~1"
if errorlevel 0 if not errorlevel 1 (echo.Es archivo)
if errorlevel 1 if not errorlevel 2 (echo.Es directorio)
goto :eof

:isFolder
setlocal enableextensions enabledelayedexpansion
(set n=%~1)
if not defined n (
echo.No se paso ningun parametro.
exit /b 2
)
for %%_ in ("!n!") do set "atr=%%~a_#"
if "#"=="!atr!" (
echo.No se encuentra el archivo o directorio.
exit /b 3
) else (
set i=0
if "!atr:~0,1!"=="d" (set i=1)
)
exit /b %i%


que produce:
Código:
C:\>tipo.bat "c:\Archivos de programa"
Es directorio

C:\>tipo.bat "c:\AUTOEXEC.BAT"
Es archivo

C:\>tipo.bat "c:\pagefile.sys"
No se encuentra el archivo o directorio.

si se fijan el pagefile dice que no se encuentra, así es que a mí parecer la mejor forma es la que había puesto en el post anterior:

Código:
C:\>if exist "c:\pagefile.sys\" (echo.es directorio) else (
¿Más? if exist "c:\pagefile.sys" (echo.es archivo) else (
¿Más? echo.no existe ))
es archivo


Así es que este código está a prueba de balas.

atr.bat
Código
  1. :funAtr
  2. setlocal enableextensions
  3. set /a t=0
  4. if exist "%~1\" (set /a t=1
  5. ) else if exist "%~1" (set /a t=2)
  6. exit /b %t%
  7.  

que devuelve en errorlevel 0 si no existe, 1 si es directorio y 2 si es archivo.
Así que si lo llaman desde otro archivo:

test.bat
Código
  1. @echo off
  2. call atr.bat "%~1"
  3. if errorlevel 0 if not errorlevel 1 (echo.No existe)
  4. if errorlevel 1 if not errorlevel 2 (echo.Es directorio)
  5. if errorlevel 2 if not errorlevel 3 (echo.Es archivo)
  6.  

que produce:
Código:
C:\>test.bat "c:\Archivos de programa"
Es directorio

C:\>test.bat "c:\AUTOEXEC.BAT"
Es archivo

C:\>test.bat "c:\pagefile.sys"
Es archivo

C:\>test.bat c:\dfdsgsfdgfdhfd
No existe

C:\>


« Última modificación: 2 Septiembre 2009, 05:37 am por 0x0309 » En línea

xassiz_

Desconectado Desconectado

Mensajes: 273


Ich werde dich töten..


Ver Perfil WWW
Re: Cómo diferenciar un directorio de un archivo
« Respuesta #6 en: 2 Septiembre 2009, 18:21 pm »

Una cosa 0x0309, que diferencia hay entre estas cosas:

Código:
exit /b

Código:
exit /b 0

Código:
exit /b %t%


Supongo que deja el errorlevel en lo que viene a continuacion del  /b

code.bat
Código:
echo.exit /b + errorlevel
echo.
exit /b 69

file.bat
Código:
@echo off
call code.bat
echo.Errorlevel: %errorlevel%
pause>nul
exit


Comprobado, lo acabo de aprender gracias a tu code ;D

Pero de todas formas, solo tiene esa aplicacion?


Gracias de nuevo 0x! ;-)
En línea



YXVuIGVyZXMgbWF0YWRvIHBhcmEgcG9uZXJ0ZSBhIGRlc2NpZnJhciBlc3RvIHhE
leogtz
. . .. ... ..... ........ ............. .....................
Colaborador
***
Desconectado Desconectado

Mensajes: 3.069


/^$/


Ver Perfil WWW
Re: Cómo diferenciar un directorio de un archivo
« Respuesta #7 en: 3 Septiembre 2009, 04:06 am »

Sí, sólo tiene ese aplicación.
Código:
exit /b "Error level a devolverle al sistema operativo"
En línea

Código
  1. (( 1 / 0 )) &> /dev/null || {
  2. echo -e "stderrrrrrrrrrrrrrrrrrr";
  3. }
  4.  
http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com
xassiz_

Desconectado Desconectado

Mensajes: 273


Ich werde dich töten..


Ver Perfil WWW
Re: Cómo diferenciar un directorio de un archivo
« Respuesta #8 en: 3 Septiembre 2009, 11:43 am »

Ok, gracias, vere si le saco utilidad ;D
En línea



YXVuIGVyZXMgbWF0YWRvIHBhcmEgcG9uZXJ0ZSBhIGRlc2NpZnJhciBlc3RvIHhE
<ИΘZIЭ(ŦB>

Desconectado Desconectado

Mensajes: 109


-cyman-


Ver Perfil
Re: Cómo diferenciar un directorio de un archivo
« Respuesta #9 en: 23 Junio 2010, 22:02 pm »

Disculpen mi auscencia. No recordaba este tema.
Gracias a todos por su interés. De verdad me ha servido de mucho.

Sin embargo, ya llevo tiempo usando este método que me parece bastante cómodo:

Código
  1. set "file=Nombre_archivo"
  2. For %%T in ("%file%") do (set "att=%%~aT")
  3. echo %att% | find "a" >nul
  4. If %errorlevel% == 0 echo Es archivo
  5. If %errorlevel% == 1 echo Es carpeta
  6.  

Gracias a todos.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Como diferenciar una llamada de datos de una de voz?
Programación Visual Basic
TrashAmbishion 0 2,344 Último mensaje 15 Julio 2011, 20:40 pm
por TrashAmbishion
Guardar archivo en directorio
PHP
overxfl0w13 9 7,146 Último mensaje 4 Junio 2012, 15:57 pm
por WHK
Como diferenciar una VPN y un Proxy?
Redes
0and6 1 1,545 Último mensaje 8 Enero 2015, 05:51 am
por engel lex
Así es como no debes definirte en tu currículum si te quieres diferenciar del...
Noticias
wolfbcn 0 1,113 Último mensaje 24 Enero 2015, 13:52 pm
por wolfbcn
archivo se escribe en falso directorio
Programación C/C++
laephy 1 1,863 Último mensaje 29 Julio 2020, 14:00 pm
por K-YreX
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines