Ir al contenido



Foto

Arreglar la Galería de Android

Galería de Android

  • Por favor identifícate para responder
1 respuesta en este tema

#1 escafandra

escafandra

    Advanced Member

  • Moderadores
  • PipPipPip
  • 3.689 mensajes
  • LocationMadrid - España

Escrito 15 octubre 2016 - 03:48

Tengo mi smartphone configurado para que las fotografías y vídeos se guarden en una SD. Tras copiar las fotos de una SD a otra de mayor tamaño me llevé la desagradable sorpresa del desorden.

 

Vi que el problema era que la fecha de creación de archivos había cambiado a la actual, como es lógico en un archivo nuevo, así que decidí dar una solución.

Android coloca en el nombre del archivo la fecha y hora de realización de la fotografía. WhatsApp también lo hace, aunque no pone la hora. Por otro lado, la fecha de modificación del archivo, que coincide con la fecha de creación al tomar la fotografía no suele alterarse al copiarla a otra SD o al HD.

 

Con este conocimiento hice esta pequeña aplicación que trata de codificar la fecha y hora desde el nombre de archivo, y si no lo consigue toma la fecha y hora de la fecha de última modificación del archivo para colocarla como fecha y hora de creación del mismo. También hace lo mismo con la fecha de las subcarpetas y de sus archivos, pues la búsqueda se hace de un modo recursivo si el usuario lo quiere.

 

Una advertencia, debe usarse sacando la microSD y conectándola al PC,

 

La primera versión la hice en Builder C++ y me he decidido traducirlo a delphi7 para compartirlo.

 

Aquí esta la fuente del programita que subo con el binario.


delphi
  1. const
  2. FILE_READ_ATTRIBUTES = $0080;
  3. FILE_WRITE_ATTRIBUTES = $0100;
  4.  
  5. //---------------------------------------------------------------------------
  6. function EnablePrivilege(name: String; Enable: boolean = true): boolean;
  7. var
  8. hToken: Cardinal;
  9. priv: TOKEN_PRIVILEGES;
  10. begin
  11. priv.PrivilegeCount:= 1;
  12. priv.Privileges[0].Attributes:= 0;
  13. if Enable then priv.Privileges[0].Attributes:= SE_PRIVILEGE_ENABLED;
  14. LookupPrivilegeValue(nil, PCHAR(name), priv.Privileges[0].Luid);
  15. OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES, hToken);
  16. AdjustTokenPrivileges (hToken, FALSE, priv, sizeof(priv), nil, PDWORD(nil)^);
  17. Result:= (GetLastError = ERROR_SUCCESS);
  18. CloseHandle (hToken);
  19. end;
  20.  
  21. //---------------------------------------------------------------------------
  22. function FileNameToFileTime(FileName: String): TFILETIME;
  23. var
  24. ST: TSYSTEMTIME;
  25. Name, Data: String;
  26. i: integer;
  27. begin
  28. ZeroMemory(@ST, sizeof(TSYSTEMTIME));
  29. ZeroMemory(@Result, sizeof(TFILETIME));
  30. Name:= ExtractFileName(FileName);
  31.  
  32. // tomo solo dígitos en Data
  33. for i:= 1 to Length(Name) do
  34. if Name[i] in ['0'..'9'] then Data:= Data + Name[i];
  35.  
  36. if Length(Name) >= 8 then
  37. begin
  38. ST.wYear:= StrToIntDef(Copy(Data, 1, 4), 0);
  39. ST.wMonth:= StrToIntDef(Copy(Data, 5, 2), 0);
  40. ST.wDay:= StrToIntDef(Copy(Data, 7, 2), 0);
  41. end;
  42. if Length(Name) >= 14 then
  43. begin
  44. ST.wHour:= StrToIntDef(Copy(Data, 9, 2), 0);
  45. ST.wMinute:= StrToIntDef(Copy(Data, 11, 2), 0);
  46. ST.wSecond:= StrToIntDef(Copy(Data, 13, 2), 0);
  47. end;
  48.  
  49. if Length(Name) >= 8 then
  50. SystemTimeToFileTime(ST, Result);
  51. end;
  52.  
  53. //---------------------------------------------------------------------------
  54. function ModifyToCreationFile(FileName: String): boolean;
  55. var
  56. hFile: THANDLE;
  57. FileTime: TFILETIME;
  58. begin
  59. Result:= FALSE;
  60.  
  61. hFile:= CreateFile(PCHAR(FileName), FILE_READ_ATTRIBUTES or FILE_WRITE_ATTRIBUTES, 0, nil, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0); //GENERIC_READ|FILE_GENERIC_WRITE
  62. if hFile <> THANDLE(1) then
  63. begin
  64. FileTime:= FileNameToFileTime(FileName);
  65. Result:= boolean(FileTime.dwLowDateTime or FileTime.dwHighDateTime);
  66. if(not Result) then
  67. Result:= GetFileTime(hFile, nil, nil, @FileTime);
  68. if(Result and LocalFileTimeToFileTime(FileTime, FileTime)) then
  69. Result:= SetFileTime(hFile, @FileTime, @FileTime, @FileTime);
  70. end;
  71.  
  72. CloseHandle(hFile);
  73. end;
  74.  
  75. //---------------------------------------------------------------------------
  76. procedure Cambia(Dir: String; SubDir: boolean = true);
  77. var
  78. sr: TSearchRec;
  79. begin
  80. if (Dir <> '') and (FindFirst(Dir + '\*.*', faAnyFile, sr) = 0) then
  81. repeat
  82. begin
  83. Application.ProcessMessages();
  84. if (sr.Name <> '.') and (sr.Name <> '..') then
  85. begin
  86. if (sr.Attr and faDirectory) <> 0 then
  87. begin
  88. ModifyToCreationFile(Dir);
  89. if(SubDir) then
  90. Cambia(Dir + '\' + sr.Name, true);
  91. end
  92. else
  93. ModifyToCreationFile(Dir + '\' + sr.Name);
  94. end;
  95. end;
  96. until FindNext(sr) <> 0;
  97. FindClose(sr);
  98. end;
  99.  
  100. //---------------------------------------------------------------------------
  101. procedure TForm1.FormCreate(Sender: TObject);
  102. begin
  103.   EnablePrivilege('SeBackupPrivilege', true);
  104.   EnablePrivilege('SeRestorePrivilege', true);
  105. end;
  106.  
  107. //---------------------------------------------------------------------------
  108. procedure TForm1.Button1Click(Sender: TObject);
  109. begin
  110. Button1.Caption:= 'Trabajando';
  111. Button1.Update();
  112. Cambia(Edit1.Text, CheckBox1.Checked);
  113. Windows.Beep(1000, 100);
  114. Button1.Caption:= 'Go';
  115. Button1.Update();
  116. end;

Espero que os sea tan útil como me fue a mi.

 

 

Saludos.

Archivos adjuntos


  • 2

#2 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 13.555 mensajes
  • LocationMéxico

Escrito 15 octubre 2016 - 04:49

Tengo mi smartphone configurado para que las fotografías y vídeos se guarden en una SD. Tras copiar las fotos de una SD a otra de mayor tamaño me llevé la desagradable sorpresa del desorden.

 

Vi que el problema era que la fecha de creación de archivos era el problema y decidí dar una solución.

Android coloca en el nombre del archivo la fecha y hora de realización de la fotografía. WhatsApp también lo hace, aunque no pone la hora. Por otro lado, la fecha de modificación del archivo, que coincide con la fecha de creación al tomar la fotografía no es alterada al copiarla a otra SD o al HD.

 

Con este conocimiento hice esta pequeña aplicación que trata de codificar la fecha y hora desde el nombre de archivo, y si no lo consigue toma la fecha y hora de la fecha de última modificación del archivo para colocarla como fecha y hora de creación del mismo. También hace lo mismo con la fecha de las subcarpetas pues la búsqueda se hace de un modo recursivo si el usuario lo quiere.

 

Espero que os sea tan útil como me fue a mi.

 

 

Saludos.

 

Caramba!!! 

 

Haber tenido ésto hace unos meses me hubiera ahorrado muchas horas de trabajo :D

 

Me parece que es muy útil (y)

 

Saludos


  • 0