: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… ), Windows 2000 (existe a garantia que o sistema só será usado em Windows 2000 ou XP).
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…
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: