Cambiar nombre, fecha y hora de archivos, por lotes

1,318 views
Skip to first unread message

Carlos Reynoso

unread,
Feb 7, 2013, 9:57:37 AM2/7/13
to publice...@googlegroups.com
Hola amigos!
Por mal funcionamiento en una máquina fotográfica, necesito re-estampar masivamente, por lo menos fecha y hora, para que pueda ordenarlos y clasificarlos por ese item
Tengo una utilidad, que me permite hacerlo, pero de a uno- Otra utilidad, me permite agregarle una numeración automática, antepuesta al nombre Ej.
001 DSC4530,jpg
002 DSC4555.jpg
Pero el problema lo tengo, cuando quiero combinar fotos de distintas máquinas, en una misma carpeta.
Primero procesaria por separado, la fecha y hora de cada máquina, y luego al mezclarlas, las ordenaría por la misma, Después, renombrar masivamente
La idea es:
1 Leer todos los archivos JPG de un directorio y colocarlos en una matriz
2 Procesar por separado el dato de fecha y hora, de la máquina que funcionó mal
3 En un lazo, ir incrementado un dato "Time" +1 y reestamparlo
¿ Como podría hacer esto? ¿Se puede hacer?

Gracias de antemano!..
Carlos (VFP9)

Miguel A.

unread,
Feb 8, 2013, 6:57:24 AM2/8/13
to publice...@googlegroups.com
Con el siguiente código llenas un cursor (biblio) con los datos de los fichero JPG que hay en el directorio midirO
A partir de ahí ya puedes hacer las demás cosas que quieras.
Saludos,
Miguel A.
 
numfich=adir(mima,midirO+'*.JPG')
set safe off
select biblio
zap
set safe on
for ik=1 to numfich
 append blank
 replace ruta with midirO, nombre with mima[ik,1], tamano with mima[ik,2] fecha with mima[ik,3]
endfor

HernanCano

unread,
Feb 8, 2013, 10:10:01 AM2/8/13
to publice...@googlegroups.com
Espero que te pueda servir.

** Cambiar Fecha-Hora
** basado en una primera idea de Miguel A.

** Datos iniciales -sección configurable-
midirO = "C:\CORREGIR\"
numfich = adir(mima,midirO+'*.JPG')
**
NuevaFecha = date(2013,02,09)
NuevaHora  = 08
NuevaMin   = 00
NuevaSec   = 00
**

tTiempo = datetime(year(NuevaFecha), month(NuevaFecha), day(NuevaFecha), NuevaHora, NuevaMin, NuevaSec)

** Ciclo para armar la lista de archivos
create cursor LISTA ( RUTA C(100), NOMBRE C(100), TAMANO N(10), FECHA D, HORA C(15) )
select LISTA

for ik=1 to numfich
   append blank
   replace ruta with midirO, nombre with mima[ik,1], tamano with mima[ik,2], fecha with mima[ik,3], HORA with mima[ik,4]
endfor

** Ordenamos la lista de archivos
index on dtoc(FECHA,1)+HORA tag FECHA_HORA

** Vamos a cambiar Fecha-Hora
go top in LISTA
do while !eof([LISTA])

   tTiempo= tTiempo + 1  && se incrementa un segundo --> ¿adecuado para tú?
  
   dFecha = date(year(tTiempo), month(tTiempo), day(tTiempo))
   cTime  = padl(hour(tTiempo),2,'0') +':'+ padl(minute(tTiempo),2,'0') +':'+ padl(sec(tTiempo),2,'0')
  
   M.Archivo = alltrim(LISTA.RUTA) + alltrim(LISTA.NOMBRE)
   CambiarFechaHora(M.Archivo, dFecha, cTime)
  
   skip in LISTA
enddo

procedure CambiarFechaHora(M.pArchivo, M.pFecha, M.pHora)
** aquí va tu procedimiento para ponerle las nuevas M.pFecha y M.pHora al archivo M.pArchivo
wait window "CambiarFechaHora ( "+M.pArchivo+", "+dtoc(M.pFecha,1)+", "+M.pHora +")" timeout 2
return

Carlos Reynoso

unread,
Feb 9, 2013, 8:11:16 PM2/9/13
to publice...@googlegroups.com
Gracias Miguel y Gracias Hernan
 
No que no me quedó claro, y es lo que realmente busco, ¿ Cual es la función que se coloca en el procedimiento, para que se cambie fecha y hora?
O sea ¿ Que defino en PROCEDURE, para que ello ocurra, suponiendo que tengo los datos MODIFICADOS, y un solo archivo (ARCHIVO.JPG)
Gracias!!! 
 

HernanCano

unread,
Feb 10, 2013, 1:33:54 AM2/10/13
to publice...@googlegroups.com

En el mansaje original tú dijiste:

>>> ... Tengo una utilidad, que me permite hacerlo, pero de a uno-....

Esa utilidad es la que colocas en el "procedimiento" que yo te propongo: el método para cambiar la fecha y hora --que tú ya tienes-- es lo que escribes en la "procedure".

Carlos Reynoso

unread,
Feb 10, 2013, 11:29:12 AM2/10/13
to publice...@googlegroups.com


El domingo, 10 de febrero de 2013 03:33:54 UTC-3, HernanCano escribió:

En el mansaje original tú dijiste:

>>> ... Tengo una utilidad, que me permite hacerlo, pero de a uno-....

Esa utilidad es la que colocas en el "procedimiento" que yo te propongo: el método para cambiar la fecha y hora --que tú ya tienes-- es lo que escribes en la "procedure".




El sábado, 9 de febrero de 2013 20:11:16 UTC-5, Carlos Reynoso escribió:
Gracias Miguel y Gracias Hernán
 
No que no me quedó claro, y es lo que realmente busco, ¿ Cual es la función que se coloca en el procedimiento, para que se cambie fecha y hora?

 Discúlpame Hernán!..No fuí del todo claro!-
 La utilidad que mencioné, es de código cerrado, y lo trabajo aparte de VFP9. Se trata del "BulkFileChanger". Con este programa, puedo alterar varios archivos al mismo tiempo, pero no puedo diferenciar uno de otros por el "datetime". O sea, que todos tendrían la misma fecha y hora.
Si pudiera conocer la rutina que lo hace, la insertaría en el procedimiento, y en el lazo, incrementaría el valor correspondiente por cada archivo


HernanCano

unread,
Feb 10, 2013, 3:37:42 PM2/10/13
to publice...@googlegroups.com

Te doy lo más difícil del algoritmo.
Ahora sigue incluir ejecutar to BulkFileChanger; lo más facilista es con un RUN.

Dále....

Guillermo MDQ

unread,
Feb 10, 2013, 4:18:25 PM2/10/13
to publice...@googlegroups.com
Carlos, fijate si estas funciones te son de utilidad para lo que vos necesitas:

A procedure for setting file times
http://www.news2news.com/vfp/?example=128&function=96&PHPSESSID=c6317d5cb287a857e047d023581847e9

How to set Creation Date/Time for a folder (WinNT)
http://www.news2news.com/vfp/?example=399&function=96&PHPSESSID=c6317d5cb287a857e047d023581847e9

Saludos
Guillermo

Guillermo MDQ

unread,
Feb 10, 2013, 4:38:14 PM2/10/13
to publice...@googlegroups.com
Tambien podes bajarte este archivo stdt25.zip  de esta pagina:

SETDTTM.PLB is a library routine which allows a FoxPro program to set a file's date and time stamps (C source is included)
http://www.jjtc.com/Fox/foxfiles/

Saludos
Guillermo

Ricardo Pina

unread,
Feb 10, 2013, 4:59:25 PM2/10/13
to Grupo VFP
Hola Carlos
 
Te paso un código alguna vez posteado por LMG que te permite cambiar fecha y hora de archivos
 
*!* Modificar la Fecha Hora de un archivo
*!* Uso:
*!* m.lRsltC=WinSetFileTime("C:\Imagenes\Foto.JPG","c",2001,08,29,18,01,01,300)
*!* m.lRsltW=WinSetFileTime("C:\Imagenes\Foto.JPG","w",2001,08,29,18,01,04,000)
*!* m.lRsltA=WinSetFileTime("C:\Imagenes\Foto.JPG","a",2001,08,30,0,0,0,000)
*!*
*!* m.cTimeType
*!* c - creación (default)
*!* a - acceso
*!* w - escritura
*!*
*!* FechaHora Creación
? WinSetFileTime("C:\MiImagen.jpg","c",2002,01,01,18,59,59,300)
*!*
*!* FechaHora último acceso
? WinSetFileTime("C:\MiImagen.jpg","a",2002,01,02,18,59,59,300)
*!*
*!* FechaHora Modificación
? WinSetFileTime("C:\MiImagen.jpg","w",2002,01,03,18,59,59,300)
*!*
PROCEDURE WinSetFileTime
LPARAMETERS m.uFl, m.cTimeType, m.nYear, m.nMonth,;
m.nDay, m.nHour, m.nMinute, m.nSec, m.nThou
#DEFINE OF_READWRITE 2
LOCAL m.lpFileInformation, m.cS, m.nPar, m.fh,;
m.lpFileInformation, m.lpSYSTIME, m.cCreation,;
m.cLastAccess, m.cLastWrite, m.cBuffTime, m.cBuffTime1,;
m.cTT,m.nYear1, m.nMonth1, m.nDay1, m.nHour1,;
m.nMinute1, m.nSec1, m.nThou1
m.nPar=PARAMETERS()
IF m.nPar < 1
RETURN .F.
ENDIF
DO DECL && declara funciones externas
m.cTT=IIF(m.nPar>=2 AND TYPE("m.cTimeType")="C";
AND !EMPTY(m.cTimeType),LOWER(SUBSTR(m.cTimeType,1,1)),"c")
m.nYear1=IIF(m.nPar>=3 AND TYPE("m.nYear")$"FIN";
AND m.nYear>=1800,ROUND(m.nYear,0),-1)
m.nMonth1=IIF(m.nPar>=4 AND TYPE("m.nMonth")$"FIN";
AND BETWEEN(m.nMonth,1,12),ROUND(m.nMonth,0),-1)
m.nDay1=IIF(m.nPar>=5 AND TYPE("m.nDay")$"FIN";
AND BETWEEN(m.nDay,1,31),ROUND(m.nDay,0),-1)
m.nHour1=IIF(m.nPar>=6 AND TYPE("m.nHour")$"FIN";
AND BETWEEN(m.nHour,0,23),ROUND(m.nHour,0),-1)
m.nMinute1=IIF(m.nPar>=7 AND TYPE("m.nMinute")$"FIN";
AND BETWEEN(m.nMinute,0,59),ROUND(m.nMinute,0),-1)
m.nSec1=IIF(m.nPar>=8 AND TYPE("m.nSec")$"FIN";
AND BETWEEN(m.nSec,0,59),ROUND(m.nSec,0),-1)
m.nThou1=IIF(m.nPar>=9 AND TYPE("m.nThou")$"FIN";
AND BETWEEN(m.nThou,0,999),ROUND(m.nThou,0),-1)
m.lpFileInformation = REPLI (CHR(0), 53)
m.lpSYSTIME = REPLI (CHR(0), 16)
IF GetFileAttributesEx (m.uFl, 0, @lpFileInformation) = 0
RETURN .F.
ENDIF
m.cCreation = SUBSTR(m.lpFileInformation,5,8)
m.cLastAccess = SUBSTR(m.lpFileInformation,13,8)
m.cLastWrite = SUBSTR(m.lpFileInformation,21,8)
m.cBuffTime = IIF(m.cTT="w",m.cLastWrite,;
IIF(m.cTT="a",m.cLastAccess,m.cCreation))
FileTimeToSystemTime(m.cBuffTime, @lpSYSTIME)
m.lpSYSTIME=;
IIF(m.nYear1>=0,Int2Word(m.nYear1),SUBSTR(m.lpSYSTIME,1,2))+;
IIF(m.nMonth1>=0,Int2Word(m.nMonth1),SUBSTR(m.lpSYSTIME,3,2))+;
SUBSTR(m.lpSYSTIME,5,2)+;
IIF(m.nDay1>=0,Int2Word(m.nDay1),SUBSTR(m.lpSYSTIME,7,2))+;
IIF(m.nHour1>=0,Int2Word(m.nHour1),SUBSTR(m.lpSYSTIME,9,2))+;
IIF(m.nMinute1>=0,Int2Word(m.nMinute1),SUBSTR(m.lpSYSTIME,11,2))+;
IIF(m.nSec1>=0,Int2Word(m.nSec1),SUBSTR(m.lpSYSTIME,13,2))+;
IIF(m.nThou1>=0,Int2Word(m.nThou1),SUBSTR(m.lpSYSTIME,15,2))
SystemTimeToFileTime(m.lpSYSTIME,@cBuffTime)
m.cBuffTime1=m.cBuffTime
LocalFileTimeToFileTime(m.cBuffTime1,@cBuffTime)
DO CASE
CASE m.cTT = "w"
m.cLastWrite=m.cBuffTime
CASE m.cTT = "a"
m.cLastAccess=m.cBuffTime
OTHERWISE
m.cCreation=m.cBuffTime
ENDCASE
m.fh = _lopen (m.uFl, OF_READWRITE)
IF m.fh < 0
RETURN .F.
ENDIF
SetFileTime (m.fh,m.cCreation,;
m.cLastAccess, m.cLastWrite)
_lclose(m.fh)
RETURN .T.
ENDPROC
*!*
PROCEDURE Int2Word
LPARAMETERS m.nVal
RETURN CHR(MOD(m.nVal,256)) + CHR(INT(m.nVal/256))
ENDPROC
*!*
PROCEDURE DECL
DECLARE INTEGER SetFileTime IN kernel32;
INTEGER hFile,;
STRING lpCreationTime,;
STRING lpLastAccessTime,;
STRING lpLastWriteTime
DECLARE INTEGER GetFileAttributesEx IN kernel32;
STRING lpFileName,;
INTEGER fInfoLevelId,;
STRING @ lpFileInformation
DECLARE INTEGER LocalFileTimeToFileTime IN kernel32;
STRING LOCALFILETIME,;
STRING @ FILETIME
DECLARE INTEGER FileTimeToSystemTime IN kernel32;
STRING FILETIME,;
STRING @ SYSTEMTIME
DECLARE INTEGER SystemTimeToFileTime IN kernel32;
STRING lpSYSTEMTIME,;
STRING @ FILETIME
DECLARE INTEGER _lopen IN kernel32;
STRING lpFileName, INTEGER iReadWrite
DECLARE INTEGER _lclose IN kernel32 INTEGER hFile
ENDPROC
*!*
 
Saludos
 
--
            

                   Ricardo Pina

Desarrollo y Servicios Informáticos

                  Profesionales
               www.dsip.com.ar

 

 

Luis Maria Guayan

unread,
Feb 10, 2013, 7:36:25 PM2/10/13
to publice...@googlegroups.com
Grande Ricardo ! Lo estaba buscando y no lo encontraba, y eso que ahora también lo encontré en PortalFox

--Modificar la Fecha Hora de un archivo --
http://www.portalfox.com/article.php?sid=2207



Luis María Guayán
Tucumán, Argentina
_________________________
http://www.PortalFox.com
Nada corre como un zorro
_________________________

Reply all
Reply to author
Forward
0 new messages