Hết hạn tệp trong thư mục: Xóa tệp sau x ngày


12

Tôi đang tìm cách tạo một "Thư mục thả" trong một ổ đĩa chia sẻ có thể truy cập được cho mọi người. Tôi muốn xóa các tệp tự động nếu chúng nằm trong thư mục trong hơn X ngày.

Tuy nhiên, có vẻ như tất cả các phương pháp tôi đã tìm thấy để thực hiện việc này, sử dụng ngày sửa đổi cuối cùng, thời gian truy cập cuối cùng hoặc ngày tạo tệp.

Tôi đang cố gắng biến đây thành một thư mục mà người dùng có thể thả các tệp vào để chia sẻ với ai đó. Nếu ai đó sao chép hoặc di chuyển tệp vào đây, tôi muốn đồng hồ bắt đầu đánh dấu vào thời điểm này. Tuy nhiên, ngày sửa đổi cuối cùng và ngày tạo của tệp sẽ không được cập nhật trừ khi có người thực sự sửa đổi tệp. Thời gian truy cập cuối cùng được cập nhật quá thường xuyên ... có vẻ như chỉ cần mở một thư mục trong windows explorer sẽ cập nhật thời gian truy cập cuối cùng.

Bất cứ ai cũng biết một giải pháp cho điều này? Tôi nghĩ rằng việc lập danh mục băm các tệp hàng ngày và sau đó hết hạn các tệp dựa trên giá trị băm cũ hơn một ngày nhất định có thể là một giải pháp .... nhưng việc băm các tệp có thể tốn thời gian.

Bất kì ý kiến ​​nào đều được đánh giá cao!

Lưu ý:
Tôi đã xem xét khá nhiều câu trả lời ở đây ... đã xem qua Trình theo dõi tài nguyên máy chủ tệp, tập lệnh powershell, tập lệnh bó, v.v. Họ vẫn sử dụng thời gian truy cập lần cuối, thời gian sửa đổi lần cuối hoặc thời gian tạo ... mà, như mô tả, không phù hợp với nhu cầu trên.


Một câu hỏi, như được đề cập bởi @Michael Kjorling, bộ đếm thời gian có dừng đếm nếu tập tin bị sửa đổi sau khi bị bỏ trong hộp không?
Get-HomeByFiveOClock

Những gì bạn đang tìm kiếm là tương đương Windows tmpwatch.
Avery Payne

Câu trả lời:


5

Chúng tôi đã sử dụng kết hợp một tập lệnh powershell và một chính sách. Chính sách chỉ định rằng người dùng phải tạo một thư mục bên trong chia sẻ Drop_Zone và sau đó sao chép bất kỳ tệp nào họ muốn vào thư mục đó. Khi thư mục được 7 ngày tuổi (sử dụng CreationTime), tập lệnh powershell sẽ xóa nó.

Tôi cũng đã thêm một số ghi nhật ký vào tập lệnh powershell để chúng tôi có thể xác minh hoạt động của nó và bật các bản sao bóng tối chỉ để lưu bản thân hoàn toàn không hoạt động.

Đây là kịch bản mà không có tất cả các công cụ đăng nhập.

$location = Get-ChildItem \\foo.bar\Drop_Zone
$date = Get-Date
foreach ($item in $location) {
  # Check to see if this is the readme folder
  if($item.PsIsContainer -and $item.Name -ne '_ReadMe') {
    $itemAge = ((Get-Date) - $item.CreationTime).Days
    if($itemAge -gt 7) {
      Remove-Item $item.FullName -recurse -force
    }
  }
  else {
  # must be a file
  # you can check age and delete based on that or just delete regardless
  # because they didn't follow the policy
  }
}

1
Điều này có vẻ đơn giản nhất, không phù hợp với tem datetime tệp, luồng dữ liệu thay thế hoặc yêu cầu một số danh sách các tệp và ngày thả của chúng. Tôi sẽ tạo ra một kịch bản tuyệt vời làm đủ mọi loại phép thuật, nhưng sau đó tôi thấy điều này.
BeowulfNode42

và không yêu cầu một sự kiện xem hệ thống tập tin kích hoạt tập lệnh mọi lúc, vì nó có thể được chạy một lần mỗi ngày và không có vấn đề gì nếu một ngày bị bỏ lỡ vì bất kỳ lý do gì.
BeowulfNode42

2
Ý tưởng đơn giản tuyệt vời, giống như @ BeowulfNode42 đã chỉ ra. Để đảm bảo người dùng phải tạo thư mục, một "Từ chối" đơn giản "Tạo tệp / ghi dữ liệu" ACL thành "Chỉ thư mục này" sẽ đảm bảo rằng người dùng cũng phải tạo các thư mục con.
Brett G

3

Nếu bạn có thể giả sử NTFS, bạn có thể viết một khóa (Hướng dẫn) vào một luồng thay thế của tệp. Cộng với ngày tháng, vì vậy về cơ bản bạn có thể lưu trữ cơ sở dữ liệu trong các tệp.

Thêm thông tin có thể được tìm thấy tại

http://bloss.technet.com/b/askcore/archive/2013/03/24/alternate-data-streams-in-ntfs.aspx

Về cơ bản, bạn có thể lưu trữ nội dung bổ sung trong một luồng riêng được mã hóa bằng một tên đặc biệt.


Làm thế nào một người sẽ làm điều này?
Brett G

@BrettG Đã thêm liên kết đến tài liệu. "Luồng dữ liệu thay thế NTFS" sẽ khiến bạn cũng tìm thấy nó trong google, chỉ trong trường hợp - bạn không biết google.
TomTom

Xin lỗi, tôi biết luồng dữ liệu thay thế là gì, tôi chỉ cố gắng hiểu cách sử dụng của chúng trong ngữ cảnh này. Vì vậy, bạn đang nói thay vì sử dụng hàm băm hoặc thứ gì đó, hãy sử dụng GUID (và / hoặc ngày) trong luồng dữ liệu thay thế để theo dõi các tệp .. aha.
Brett G

Vâng. Nếu bạn có thể đánh dấu một cách đáng tin cậy một tệp - bạn thậm chí có thể đặt ngày đánh dấu vào đó - thì bạn không cần phải tính toán một hàm băm.
TomTom

Chỉ cần xem nếu một tập tin được sao chép ra khỏi cửa hàng, chỉnh sửa, và sau đó sao chép lại. Bạn muốn khởi động lại bộ đếm thời gian sau đó, băm có thể hữu ích.
một CVn

2

Bạn có thể sử dụng IO.FileSystemWatcher, cho phép bạn "xem" một thư mục cho các tệp mới được tạo. Dưới đây là những phần bạn cần để thực hiện công việc này.

Các biến này định cấu hình đường dẫn để xem và bộ lọc để tinh chỉnh các tệp cần theo dõi:

$watchFolderPath = $env:USERPROFILE
$watchFolderFilter = "*.*"

Điều này thiết lập các tham số cho thư mục để xem và các hành động để thực hiện khi sự kiện xảy ra. Về cơ bản, điều này đặt lại LastWriteTime trên mỗi tệp như được viết:

$watcher = New-Object IO.FileSystemWatcher $watchFolderPath, $watchFolderFilter -Property @{
    IncludeSubdirectories = $true
    NotifyFilter = [IO.NotifyFilters]'FileName, LastWrite'
    }
$onCreated = Register-ObjectEvent $watcher Created -SourceIdentifier FileCreated -Action {
    $FileName = $Event.SourceEventArgs.FullPath
    $file = Get-Item $FileName
    $file.LastWriteTime = Get-Date
    }

Sự kiện này có thể không được đăng ký nếu cần sử dụng điều này:

Unregister-Event -SourceIdentifier FileCreated

Cuối cùng, bạn có thể chạy nó một lần một ngày để dọn sạch các tệp cũ:

Get-ChildItem $watchFolderPath -Recurse | Where-Object {((Get-Date)-$_.LastWriteTime).TotalDays -gt 6} | Remove-Item

Đó phải là tất cả những gì bạn cần ...


Đã chỉnh sửa phần này để đặt thuộc tính LastWriteTime khi tệp được tạo và sau đó sử dụng thuộc tính đó để xóa các tệp sau này.
Tim Ferrill

1

Đã được một lúc nhưng tôi đã thiết lập một phương pháp tương đối đơn giản để giải quyết vấn đề này.

Tôi sẽ chạm vào bất kỳ tệp nào được thêm vào thư mục thả (được theo dõi thông qua tiện ích giám sát tài nguyên) và đặt ngày sửa đổi cuối cùng thành ngày được thêm vào thư mục.

Sau đó tôi có thể sử dụng ngày sửa đổi cuối cùng để xóa bất kỳ tệp nào cần được tắt. Điều này cũng có lợi thế là nếu ai đó thực sự cập nhật tệp, nó sẽ đặt lại bộ đếm ngược.


Ý tưởng hoàn hảo. Tôi sẽ tự nghiên cứu .. nhưng bạn có biết tiện ích giám sát tài nguyên nào bạn đã sử dụng không?
Brett G

@BrettG thành thật mà nói đã gần 10 năm rồi. Tôi không thể nhớ. Bạn đang làm cho tôi cảm thấy già. :) Nếu tôi phải làm điều đó hôm nay tôi sẽ thực hiện một công việc dựa trên các sự kiện kiểm toán hệ thống tệp trong trình xem sự kiện. Đối tượng FileSystemWatcher .NET có sẵn thông qua PowerShell tôi nghĩ. Nó sẽ là một lựa chọn khác.
Tim Brigham

Ha, tôi đã không nhận ra bạn có nghĩa là lâu khi bạn nói "một thời gian". Vâng đủ buồn cười Tôi chỉ nhìn vào FileSystemWatcher. Mặc dù, tôi không nghĩ rằng nó sẽ hoạt động với các tập tin di chuyển / sao chép. Cảm ơn vi đa trả lơi!
Brett G

1
@BrettG - Filesystemwatcher có thể được sử dụng cùng với bảng theo dõi, nhưng nó có vấn đề riêng. Xem tại đây: stackoverflow.com/questions/1764809/
Thẻ

1
@BrettG - Ngoài ra, đây là một phần mở rộng tốt cho FSW: codeproject.com/Articles/58740/
Kẻ

1

Không có cách nào để dựa vào ngày mà một tập tin được sao chép hoặc di chuyển vào một thư mục. Windows quản lý để bảo vệ nó trên các hệ thống tệp, ổ đĩa, chia sẻ mạng, v.v. Bạn có thể làm việc gì đó với máy chủ tệp linux hoặc ngăn mọi người sao chép trực tiếp tệp bằng cách sử dụng FTP hoặc hệ thống tải lên dựa trên web.

Nếu bạn ổn với việc mọi người không thể sửa đổi các tệp sau khi họ tải lên, bạn có thể có các thư mục truy cập và tải lên riêng biệt và một tập lệnh di chuyển các tệp giữa chúng và hẹn hò lại với chúng. Nhưng có vẻ như bạn muốn mọi người có thể sửa đổi các tập tin trực tiếp.

Vì vậy, một giải pháp đơn giản, nếu hơi khó khăn, sẽ là lộn xộn với ngày. Tôi sẽ viết hai kịch bản:

Kịch bản thay đổi ngày hàng giờ

Có một tập lệnh chạy mỗi giờ một lần hoặc lâu hơn, bằng ngôn ngữ ưa thích của bạn, rằng:

  • Tìm kiếm bất kỳ tập tin có ngày sửa đổi trong vòng 20 năm qua.
  • Khi tìm thấy một tệp như vậy, hãy thay đổi ngày sửa đổi thành ngày hôm nay trừ đi 20 năm.

Trong powershell, nó sẽ trông giống như thế này:

$path = "D:\test"

$today = Get-Date
$before = $today.AddDays(-7300) #356*20 days

Get-ChildItem -Recurse -Path $path | foreach {
    if ($_.LastWriteTime -gt $before) {
        Write-Host $_.Name
        $_.LastWriteTime = $before
    }
}

Chạy tập lệnh này ngày hôm nay (27 tháng 5), đặt ngày sửa đổi của tất cả các tệp thành ngày 1 tháng 6 năm 1994 - chính xác là 356 * 20 ngày trước. Vì nó chỉ thay đổi các tệp mới hơn giá trị $ trước, nên nó sẽ không chạm vào các tệp mà nó đã đặt về quá khứ.

Tập lệnh dọn dẹp

Kịch bản dọn dẹp sẽ chạy mỗi đêm và:

  • Tìm kiếm các tệp có ngày sửa đổi "20 năm và X ngày trước"
  • Xóa chúng

Tôi sẽ không viết kịch bản cho phần này - có rất nhiều tiện ích có thể xử lý xóa các tệp cũ hơn một ngày đã chỉ định, chọn bất kỳ tùy chọn nào bạn muốn. Phần quan trọng là tìm kiếm các tệp 7300 + X ngày tuổi, trong đó X là số ngày bạn muốn giữ chúng kể từ lần sửa đổi cuối cùng.

Ưu điểm

Điều này có một vài lợi thế so với các câu trả lời khác ở đây:

  • Bộ hẹn giờ sẽ thiết lập lại nếu ai đó sửa đổi tập tin.
  • Không cần các luồng thay thế NTFS để đánh dấu các tệp (được bảo toàn khi di chuyển tệp, do đó có thể gây ra việc xóa sớm tệp đã sửa đổi)
  • Nên có tối thiểu nếu có tác động hiệu suất. Không cần phải giữ cơ sở dữ liệu hoặc danh sách tên tệp và / hoặc băm.
  • Không có gì phá vỡ khủng khiếp nếu các kịch bản không chạy. Không có dịch vụ hoặc chương trình liên tục chạy cần thiết để cập nhật ngày. Chỉ cần một vài nhiệm vụ theo lịch trình. Các giải pháp dựa vào việc xem các tệp mới và cập nhật thời gian sửa đổi cuối cùng của chúng thành ngay bây giờ có thể sẽ xóa các tệp mới nếu dịch vụ không thành công hoặc chạy trong tình trạng chạy đua.

Vấn đề duy nhất tôi có thể thấy là nếu mọi người sao chép một tệp đã được sửa đổi lần cuối 20 năm trước vào thư mục thả. Tôi nghĩ trong hầu hết các kịch bản, điều đó dường như không phải là vấn đề, nhưng nó có thể xảy ra.


0

Bạn có thể chính thức hóa việc thêm tệp vào hộp thả qua trang web có IFRAME "tải lên". Sau đó, người dùng có thể "đăng" tệp, yêu cầu một công việc PHP / ASP trên máy chủ, sẽ lấy tệp đó và đặt nó vào vị trí pucker. PHP / ASP có thể thực hiện bất kỳ số lượng các hoạt động chỉ mục / phân tích.


0

Nếu ai đó sao chép hoặc di chuyển tệp vào đây, tôi muốn đồng hồ bắt đầu tích tắc vào thời điểm này. Tuy nhiên, ngày sửa đổi cuối cùng và ngày tạo tệp sẽ không được cập nhật trừ khi có người thực sự sửa đổi tệp.

Tôi sẽ tạo một kịch bản chạy như các tác vụ theo lịch trình cứ năm phút một lần và thực hiện hai điều.

  1. Hành động đầu tiên sẽ tạo một bản sao của bất kỳ tệp nào được sao chép vào thư mục, đặt tiền tố vào tệp và xóa bản gốc. Điều này sẽ đảm bảo rằng ngày tạo của tệp là thống nhất cho ứng dụng.
  2. Hành động thứ hai sẽ xem xét tất cả các tệp có tiền tố được xác định trước (được đặt với hành động 1) và xóa bất kỳ tệp nào có ngày tạo cũ hơn X ngày. Điều này sẽ giải quyết vấn đề sửa đổi / ngày truy cập.

0

Có một cơ chế hiện có để đánh dấu các tệp, bit Lưu trữ. Nó đã ở đó từ những ngày đầu của DOS, và có mặt trên cả FAT và NTFS.

Về cơ bản, mọi tệp sẽ có bit lưu trữ được đặt theo mặc định. Nếu bạn thấy một tệp bit lưu trữ trong thư mục thả của bạn, (1) xóa bit đó và (2) đặt ngày của nó thành ngày hôm nay. Nếu bạn thấy một tệp không có bit đó và có ngày <= 7 ngày trong quá khứ, hãy xóa nó.

Nếu người dùng ghi vào tệp trong khi nó nằm trong thư mục thả, bit lưu trữ của nó được đặt lại để thời gian tồn tại của nó cũng được đặt lại thành 7 ngày. Rốt cuộc, nó có hiệu lực với một tập tin mới.

Bây giờ bạn có thể sử dụng FileSystemWatcher một cách an toàn. Bất kỳ vấn đề nào nó có (chẳng hạn như các sự kiện trùng lặp, tràn bộ đệm làm mất thông tin chi tiết) không còn quan trọng nữa vì tất cả các thông tin liên quan đều có trong siêu dữ liệu tệp.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.