2011-02-10 17 views
5

Necesito establecer la fecha de la última modificación para algunos archivos. Es una habilidad esencial para mi aplicación.fecha setLastModified con Qt

No veo cómo puedo hacer esto con QT. No veo un método/función para eso. Puedo leer las fechas con Qt, pero no veo cómo puedo establecer las fechas.

Ahora ... Sé que algunas (creo que todas en realidad) las API de Windows de MS tienen esta capacidad.

Lo que pasa es que no estoy buscando una solución única de "Windows". Necesito esta habilidad para trabajar en Windows, Linux y Mac. Es por eso que elijo Qt ...

Cualquier solución propuesta debe ser centrada en API (no quiero un comando/utilidad del sistema) y la solución debe cubrir los 3 sistemas operativos principales (Win, Linux, Mac).

+0

¿Ha encontrado una solución? Yo tengo el mismo problema. ¿Es posible usar Qt ?. Gracias –

Respuesta

3

La función posix para esto es utime(2), que también está disponible en Windows como parte de MSVCRT (consulte MSDN). Entonces, usar eso debería cubrir Mac, Linux y Windows.

Dado que QAbstractFileEngine no expone esta funcionalidad, tampoco creo que esté disponible en ninguna otra API del sistema de archivos Qt.

3

No creo que haya nada específico. La manera más fácil es, probablemente, abrir el archivo para escribir + anexar y cerrarlo de nuevo, esto permite que el sistema operativo/sistema de archivos actualice la hora modificada.

También podría intentar leer los permisos y llamar a setPerimssions, que a veces se utiliza como una forma más segura de actualizar un archivo, ya que no bloquea.

editar: para establecer una hora de última modificación arbitraria que podría usar - en la función de Windows SetFileTime.

Hay un boost::filesystem::last_write_time() que no quiere ver - No lo he usado.

+0

Eso no funcionaría en absoluto. Si dateTime ahora es B, copio un archivo que fue modificado por última vez en dateTime A, la copia tendrá una fecha de modificación de B. A lo largo del camino, a medida que pasa el tiempo, dateTime será C. Si en ese momento abro y guardo el archivo como sugiere, tendrá una última fecha de modificación de C. Obviamente, esto no tiene sentido, ya que el último DataTime modificado estará aún más "inactivo" porque necesito que sea A y no C. Necesito que lastModified dateTime sea el mismo que el archivo original. – user440297

+0

¿Lo sentimos? - estableces la última hora modificada en 'ahora' y lo haces modificando el archivo 'ahora'. –

+0

No quiero establecer la última hora de modificación como 'ahora'. Por lo tanto, lo que sugieres no funcionará. Todas las API de MS permiten establecer las marcas de tiempo de los archivos, al igual que Java y otras API maduras. Qt puede obtener marcas de tiempo pero no puede establecer marcas de tiempo, hasta donde yo sé. Si tengo que usar el WinAPI pero eso me deja en la oscuridad con respecto a Linux y MAC. – user440297

3

En Windows incluye qt_windows.h y juega con la fecha de modificación y creación.

QDateTime newModifiedTime=ui->dateTimeEdit_modified->dateTime(); 
QDateTime newCreationDate=TimeEdit_Creation->dateTime(); 
FILETIME pmodifiedtime,pcreationtime; 
    HANDLE hfile; 
    LPCWSTR filename=Filename.toStdWString().c_str(); 
      hfile=CreateFile(filename,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); 
    if(hfile==INVALID_HANDLE_VALUE) 
    { 
     QMessageBox::information(this,"Failed","Unable to open file,check file permission"); 
    } 
    else 
    { 
     LONGLONG ll = Int32x32To64(newCreationDate.toTime_t(), 10000000) + 116444736000000000; 
     pcreationtime.dwLowDateTime = (DWORD) ll; 
     pcreationtime.dwHighDateTime = ll >> 32; 
     LONGLONG ll2 = Int32x32To64(newModifiedTime.toTime_t(), 10000000) + 116444736000000000; 
     pmodifiedtime.dwLowDateTime = (DWORD) ll2; 
     pmodifiedtime.dwHighDateTime = ll2 >> 32; 

     if(!SetFileTime(hfile,&pcreationtime,NULL,&pmodifiedtime)) 
     { 
      QMessageBox::information(this,"Failed","Unable to set Date And Time"); 
     } 
     else 
     { 
      QMessageBox::information(this,"Success","Date And Time Updated"); 
      ui->lineEdit_FileName->clear(); 
     } 
    } 
    CloseHandle(hfile); 

Para añadir Linux incluyen utime.h y luego fcntl.h

struct utimbuf timebuffer; 
timebuffer.modtime=newModifiedTime.toTime_t(); 
const char *filename=Filename.toAscii(); 
if((utime(filename,&timebuffer))<0) 
{ 
     QMessageBox::information(this,"Error","Unable to set Time"); 
} 
else 
{ 
     QMessageBox::information(this,"Success","Date Changed"); 
} 
+2

'LPCWSTR filename = Nombre de archivo.toStdWString().c_str(); 'es un consejo muy malo, porque' filename' almacenará el puntero al objeto temporal eliminado – borisbn