2012-01-10 35 views
15

Tôi có một tình huống sau:của Windows hệ thống tập tin: Thời gian tạo của một tập tin không thay đổi khi thời gian sẽ bị xóa và tạo lại

  • 1: Tạo một bó của tập

  • 2: Gọi một số ứng dụng bên ngoài mà xử lý tất cả các file theo thời gian tạo khác nhau từ ảnh chụp cuối cùng

  • 3: Xóa file

  • 4: goto 1

Hóa ra là cửa sổ không đảm bảo rằng nó sẽ thay đổi thời gian tạo khi người dùng tạo tệp, xóa tệp và tạo tệp có cùng tên.

Tôi đã viết một kịch bản PowerShell nhỏ mà xác minh này:

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 

Output:

... 
... 
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** 

Nếu tôi ngủ trong một thời gian (> 30s) sau khi xóa tất cả các file sẽ có tem thời gian chính xác.

Có cách nào để giải quyết vấn đề này không? Một số cuộc gọi winapi có thể xóa tập tin cho tốt?

+6

Điều này được gọi là "đường hầm". Xem [bài viết KB này] (http://support.microsoft.com/?kbid=172190) để biết thêm chi tiết. (Các tập tin bị xóa cho tốt. Nó chỉ là thời gian tạo và siêu dữ liệu khác đang được thực hiện trên.) –

+0

@RaymondChen, đọc giữa các dòng tôi thu thập rằng điều này là để bảo quản tên tập tin dài cho các chương trình đang làm việc với tên tập tin ngắn? –

+0

Đó là một phần của nó. Nhưng cũng cho các ứng dụng sử dụng thủ thuật tạo/đổi tên/xóa để thay thế một tệp. Điều này truyền siêu dữ liệu từ tệp cũ sang tệp mới. –

Trả lời

14

Tôi tin rằng bạn đang gặp hiện tượng trong Windows có tên là filesystem tunneling. Đây là một tính năng của các hệ thống dựa trên NT trong đó một tệp mới có cùng tên với tệp được xóa gần đây trong cùng một thư mục sẽ kế thừa thời gian tạo của tệp cũ.

Bạn có thể tắt đường hầm hoặc thay đổi khoảng thời gian lưu trữ dữ liệu tệp cũ. Xem chi tiết Microsoft KB article để biết chi tiết.

Việc tạo đường hầm hệ thống tập tin được triển khai vì nhiều ứng dụng sẽ xóa và tạo lại các tệp mà chúng muốn thay đổi thay vì chỉ cập nhật chúng.

Bạn sẽ có thể sử dụng đề xuất @Jim Rhodes để chống lại tính năng này.

3

Bạn có thể sử dụng SetFileTime để cập nhật thời gian tạo ngay khi bạn tạo tệp.

+0

hoặc 'File.SetCreationTime' cho mọi người sử dụng .NET. – iliketocode

Các vấn đề liên quan