Cópia de Arquivos - A Ressurreição: como manter o TimeStamp

:scrambleup: Boa tarde, señores… Vocês devem se lembrar de mim de tópicos como “Mover, copiar e apagar arquivos. Tem API?” ou “nio: como copiar arquivos?”. Bom, hoje lhes trago a volta das dúvidas sobre cópias de arquivos:

:arrow: [color=“darkblue”][size=“14”]Como eu faço pra fazer uma cópia de arquivos com NIO (leia-se: com ByteBuffer):[/size][/color]

[quote=“louds no tópico ‘nio: como copiar arquivos?’”][code:1:31b394c3c2"]ByteBuffer bb = ByteBuffer.allocateDirect(2048);
FileChannel from = …
FileChannel to = …
bb.clear();
while(from.read(bb) != -1) {
bb.flip();
to.write(bb);
bb.clear();
}[/code:1:31b394c3c2][/quote][color=“darkblue”][size=“14”]mantendo o TimeStamp (data e hora de criação) dos arquivos copiados?[/size][/color]

:arrow: Corrijam-me se eu estiver errado, mas o que esta técnica usando o ByteBuffer faz é criar um novo arquivo, com os dados idênticos aos do original, porém sem informações de TimeStamp. Eu quero preservar (ou replicar) o TimeStamp. Como fazer? (tem como fazer?)

:arrow: Dados que podem vir a importar: J2SDK1.4.2_05 (ainda… :cry: ), Windows 2000 (existe a garantia que o sistema só será usado em Windows 2000 ou XP).

Voce pode modificar o timestamp de última modifcação. Para os de criação e último acesso, aquele abraço…

No Windows, como você deve saber muito bem, existem três informações de data para cada arquivo: a data de criação, de último acesso de leitura e de último acesso de escrita (ou de modificação). Isso é semelhante ao Unix (onde as três informações também estão disponíveis).

java.util.File só consegue alterar a data de último acesso de modificação (que felizmente é a que aparece no Windows Explorer ou no dir, ou para o Unix, a que aparece com ls -l )

setLastModified
public boolean setLastModified(long time)

Não sei porque é que java.util.File não define funções para modificar as outras duas datas, já que é um problema que aparece no Windows e no Unix, que são as duas grandes plataformas onde roda o J2SE.

Obviamente se você quiser setar as duas outras datas existe a palavra mágica - nem vou dizer qual é, que você suou muito para fazer a tal DLL JNI funcionar. Mas se você é suficientemente doido, e alguém suficientemente doido quer que você faça a tal coisa funcionar, lá vai:
[i]
SetFileTime
The SetFileTime function sets the date and time that a file was created, last accessed, or last modified.

BOOL SetFileTime(
HANDLE hFile, // handle to file
CONST FILETIME *lpCreationTime, // creation time
CONST FILETIME *lpLastAccessTime, // last-access time
CONST FILETIME *lpLastWriteTime // last-write time
);
[/i]

Obviamente tem mais algumas APIs que devem ser chamadas para converter a data e hora em formato Java para a data e hora que esta API requer - ou seja, dá um bom trabalho no final das contas.

[quote=“thingol”]Obviamente se você quiser setar as duas outras datas existe a palavra mágica - nem vou dizer qual é, que você suou muito para fazer a tal DLL JNI funcionar. Mas se você é suficientemente doido, e alguém suficientemente doido quer que você faça a tal coisa funcionar, lá vai:
[i]
SetFileTime
The SetFileTime function sets the date and time that a file was created, last accessed, or last modified.

BOOL SetFileTime(
HANDLE hFile, // handle to file
CONST FILETIME *lpCreationTime, // creation time
CONST FILETIME *lpLastAccessTime, // last-access time
CONST FILETIME *lpLastWriteTime // last-write time
);
[/i][/quote]

:scrambleup: É… JNI foi um custo… Mas, o trauma passou… Acho que até me aventuraria em mais uma “Jornada JNI - em busca do timestamp perdido”… Porém… Ontem eu acabei descobrindo o setLastModified(long) de File (desculpem :? , não deu tempo de postar que já tinha achado…). E, como estou usando Windows, a data da última modificação é suficiente (acho 98,23% dos usuários do Windows desconhece as outras duas informações de timestamp).

Bom… Quem sabe um dia, com mais tempo, eu mexa mais com JNI… :slight_smile:

Valeu, señores, e até a próxima aventura de nio, o copiador de arquivos (eu sei, eu sei, nio tem outras utilidades, mas elas não soavam bem na frase…) :lol: