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

3 respostas
martui

: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]

<blockquote><div class="quote-author">“louds no tópico ‘nio: como copiar arquivos?’”:</div>[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]</blockquote>[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).

3 Respostas

louds

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

T

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.

martui

“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]

: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:

Criado 5 de outubro de 2004
Ultima resposta 6 de out. de 2004
Respostas 3
Participantes 3