2012-01-10 3 views
15

tengo un escenario siguiente:de Windows sistema de archivos: Hora de creación de un archivo no cambia cuando se elimina tiempo y crea de nuevo

  • 1: Crear un montón de archivos

  • 2: Call alguna aplicación externa que procesa todos los archivos con el tiempo diferentes creación desde la última instantánea

  • 3: Eliminar archivos

  • 4: Goto 1

Resultó que las ventanas no garantiza que va a cambiar el tiempo de creación cuando el usuario crea un archivo, lo borra y que crea un archivo con un mismo nombre.

escribí un pequeño script de PowerShell que verifica lo siguiente:

ls | Remove-Item 

$fileListOld = @{} 
foreach($i in 1..1000) 
{ 
    $fname = [string]::Format("{0}.txt", $i) 
    "tst" >> $fname  
} 

ls | % { $fileListOld[$_.Name] = $_ } 
ls | Remove-Item 

foreach($i in 1..1000) 
{ 
    $fname = [string]::Format("{0}.txt", $i) 
    "tst" >> $fname  
} 

$fileListNew = @{} 
ls | % { $fileListNew[$_.Name] = $_ } 

$count = 0 



foreach ($fname in $fileListNew.Keys) 
{ 
    if ($fileListNew[$fname].CreationTimeUtc -eq $fileListOld[$fname].CreationTimeUtc) 
    { 
     Write-Host Same creation time -ForegroundColor Red 
     Write-Host $fname -ForegroundColor Red 
     $count++ 
    } 
} 

Write-Host $count 

Salida:

... 
... 
Same creation time 
241.txt 
Same creation time 
944.txt 
Same creation time 
908.txt 
Same creation time 
631.txt 
Same creation time 
175.txt 
Same creation time 
798.txt 
Same creation time 
192.txt 
Same creation time 
961.txt 
Same creation time 
476.txt 
Same creation time 
566.txt 
Same creation time 
945.txt 
Same creation time 
681.txt 
Same creation time 
880.txt 
Same creation time 
162.txt 
Same creation time 
634.txt 
Same creation time 
746.txt 
Same creation time 
442.txt 
Same creation time 
35.txt 
Same creation time 
96.txt 
Same creation time 
771.txt 
Same creation time 
787.txt 
Same creation time 
972.txt 
Same creation time 
642.txt 
Same creation time 
495.txt 
Same creation time 
625.txt 
Same creation time 
666.txt 
Same creation time 
660.txt 
Same creation time 
6.txt 
Same creation time 
593.txt 
Same creation time 
549.txt 
Same creation time 
842.txt 
Same creation time 
314.txt 
Same creation time 
148.txt 
**1000** 

Si duermo desde hace algún tiempo (> 30 años) después de la eliminación de todos los archivos tendrán marcas de tiempo correctos.

¿Hay alguna forma de evitar esto? ¿Alguna llamada winapi que borra el archivo para siempre?

+6

Esto se conoce como "tunelización". Consulte [este artículo de KB] (http://support.microsoft.com/?kbid=172190) para obtener más detalles. (El archivo se elimina para siempre. Es sólo el tiempo de creación y otros metadatos que se está realizando a través.) –

+0

@RaymondChen, leyendo entre líneas deduzco que esto era para preservar el nombre de archivo largo para los programas que estaban trabajando con los nombres de archivo cortos? –

+0

Eso fue parte de eso. Pero también para aplicaciones que usan el truco crear/cambiar nombre/eliminar para reemplazar un archivo. Esto propaga los metadatos del archivo anterior al nuevo archivo. –

Respuesta

14

Creo que se encuentra con un fenómeno en Windows conocido como filesystem tunneling. Esta es una característica de los sistemas basados ​​en NT donde un archivo nuevo con el mismo nombre que un archivo recientemente eliminado en el mismo directorio heredará la hora de creación del archivo anterior.

Puede desactivar un túnel o alterar la longitud de tiempo durante el cual se almacena en caché los datos del archivo de edad. Consulte esto Microsoft KB article para más detalles.

sistema de archivos túnel se llevó a cabo ya que muchas aplicaciones eliminar y volver a crear los archivos que desea modificar en lugar de simplemente actualizarlos.

Usted debe ser capaz de utilizar @Jim Rodas sugerencia para contrarrestar esta característica.

3

Usted podría utilizar SetFileTime para actualizar la hora de crear tan pronto como se crea el archivo.

+0

o 'File.SetCreationTime' para todos los que usan .NET – iliketocode

Cuestiones relacionadas