Kedaluwarsa File Dalam Folder: Hapus File Setelah x Hari

12

Saya ingin membuat "Drop Folder" di drive bersama windows yang dapat diakses oleh semua orang. Saya ingin file dihapus secara otomatis jika mereka duduk di folder selama lebih dari X hari.

Namun, sepertinya semua metode yang saya temukan untuk melakukan ini, gunakan tanggal modifikasi terakhir, waktu akses terakhir, atau tanggal pembuatan file.

Saya mencoba menjadikan ini folder tempat pengguna dapat meletakkan file untuk dibagikan kepada seseorang. Jika seseorang menyalin atau memindahkan file ke sini, saya ingin jam mulai berdetak pada titik ini. Namun, tanggal modifikasi terakhir dan tanggal pembuatan file tidak akan diperbarui kecuali seseorang benar-benar memodifikasi file. Waktu akses terakhir terlalu sering diperbarui ... sepertinya hanya membuka direktori di windows explorer akan memperbarui waktu akses terakhir.

Adakah yang tahu solusi untuk ini? Saya berpikir bahwa katalogisasi hash file setiap hari dan kemudian berakhir file berdasarkan hash lebih tua dari tanggal tertentu mungkin menjadi solusi .... tetapi mengambil hash file dapat memakan waktu.

Setiap ide akan sangat dihargai!

Catatan:
Saya sudah melihat cukup banyak jawaban di sini ... melihat ke File Server Resource Monitor, skrip powershell, skrip batch, dll. Mereka masih menggunakan waktu akses terakhir, waktu modifikasi terakhir atau waktu pembuatan ... yang, seperti dijelaskan, tidak sesuai dengan kebutuhan di atas.

Brett G
sumber
Satu pertanyaan, seperti yang disebutkan oleh @Michael Kjorling, apakah penghitung waktu berhenti menghitung jika file diubah setelah dijatuhkan di dalam kotak?
Get-HomeByFiveOClock
Apa yang Anda cari adalah Windows equivelent tmpwatch.
Avery Payne

Jawaban:

5

Kami menggunakan kombinasi skrip PowerShell dan kebijakan. Kebijakan menentukan bahwa pengguna harus membuat folder di dalam share Drop_Zone dan kemudian menyalin file apa pun yang mereka inginkan ke folder itu. Ketika folder menjadi 7 hari (menggunakan CreationTime), skrip powershell akan menghapusnya.

Saya juga menambahkan beberapa logging ke skrip PowerShell sehingga kami dapat memverifikasi operasi itu dan menyalakan salinan bayangan hanya untuk menyimpan benar-benar tidak kompeten dari diri mereka sendiri.

Berikut ini skrip tanpa semua hal yang dicatat.

$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
  }
}
murisonc
sumber
1
Ini tampaknya paling sederhana, tidak fudge dengan cap datetime file, stream data alternatif, atau memerlukan beberapa daftar file dan tanggal jatuh mereka. Saya akan membuat skrip mengagumkan yang melakukan segala macam sihir, tetapi kemudian saya melihat ini.
BeowulfNode42
dan tidak memerlukan acara tontonan sistem file yang memicu skrip sepanjang waktu, karena dapat dijalankan sekali per hari, dan tidak masalah sebanyak itu jika satu hari dilewatkan karena alasan apa pun.
BeowulfNode42
2
Ide sederhana yang bagus, seperti yang ditunjukkan oleh @ BeowulfNode42. Untuk memastikan pengguna harus membuat folder, "Tolak" sederhana dari "Buat File / Tulis Data" ACL ke "Hanya Folder Ini" akan memastikan bahwa pengguna juga harus membuat subfolder.
Brett G
3

Jika Anda dapat mengasumsikan NTFS Anda bisa menulis kunci (Guid) ke aliran alternatif file. Ditambah tanggalnya, jadi pada dasarnya Anda bisa menyimpan database dalam file.

Informasi lebih lanjut dapat ditemukan di

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

Pada dasarnya Anda dapat menyimpan konten tambahan dalam aliran terpisah yang diberi kode dengan nama khusus.

TomTom
sumber
Bagaimana seseorang melakukan ini?
Brett G
@ BrettG Menambahkan tautan ke dokumentasi. "Aliran Data Alternatif NTFS" akan membuat Anda menemukannya juga di google, untuk berjaga-jaga - Anda tidak tahu google.
TomTom
Maaf, saya tahu apa aliran data alternatif itu, saya hanya mencoba memahami penggunaannya dalam konteks ini. Jadi Anda mengatakan alih-alih menggunakan hash atau sesuatu, gunakan GUID (dan / atau tanggal) dalam aliran data alternatif untuk melacak file .. aha.
Brett G
Ya. Jika Anda dapat dengan andal MENANDAI file - Anda bahkan dapat memasukkan tanggal penandaan di dalamnya - maka Anda tidak perlu menghitung hash.
TomTom
Hanya hati-hati jika file disalin dari toko, diedit, dan kemudian disalin kembali. Anda ingin me-restart timer itu, yang hash bisa berguna.
CVn
2

Anda bisa menggunakan IO.FileSystemWatcher, yang memungkinkan Anda untuk "menonton" folder untuk file baru yang dibuat. Inilah bagian-bagian yang Anda perlukan untuk membuat ini bekerja.

Variabel-variabel ini mengkonfigurasi jalur untuk ditonton dan filter untuk menyempurnakan file mana yang akan dilacak:

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

Ini mengatur parameter untuk folder untuk ditonton dan tindakan yang harus dilakukan ketika peristiwa terjadi. Pada dasarnya ini me-reset LastWriteTime pada setiap file seperti yang tertulis:

$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
    }

Acara dapat dibatalkan pendaftarannya jika perlu menggunakan ini:

Unregister-Event -SourceIdentifier FileCreated

Terakhir, Anda dapat menjalankan ini sekali sehari untuk membersihkan file lama:

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

Itu harus menjadi semua yang Anda butuhkan ...

Tim Ferrill
sumber
Diedit ini untuk mengatur atribut LastWriteTime ketika file dibuat dan kemudian menggunakannya untuk menghapus file nanti.
Tim Ferrill
1

Sudah lama tapi saya menyiapkan metode yang relatif lurus ke depan untuk mengatasi ini.

Saya akan menyentuh file yang ditambahkan ke direktori drop (dipantau melalui utilitas pemantauan sumber daya) dan mengatur tanggal modifikasi terakhir ke tanggal yang ditambahkan ke folder.

Saya kemudian dapat menggunakan tanggal modifikasi terakhir untuk membersihkan semua file yang perlu dihapus. Ini juga memiliki keuntungan bahwa jika seseorang benar-benar memperbarui file itu akan mengatur ulang hitungan mundur.

Tim Brigham
sumber
Ide sempurna Saya akan melakukan penelitian sendiri .. tapi ada ide utilitas pemantauan sumber daya apa yang Anda gunakan?
Brett G
@ BrettG jujur ​​itu hampir 10 tahun yang lalu. Saya tidak ingat. Anda membuat saya merasa tua. :) Jika saya melakukannya hari ini, saya akan menjalankan pekerjaan berdasarkan peristiwa audit sistem file di penampil acara. Objek FileSystemWatcher .NET tersedia melalui PowerShell saya pikir. Itu akan menjadi pilihan lain.
Tim Brigham
Ha, saya tidak menyadari maksud Anda selama itu ketika Anda mengatakan "sebentar". Ya cukup lucu saya hanya melihat FileSystemWatcher. Meskipun, saya tidak berpikir itu akan berhasil dengan file yang dipindahkan / disalin. Terima kasih balasannya!
Brett G
1
@ BrettG - Filesystemwatcher dapat digunakan bersama dengan tabel pelacakan, tetapi memiliki masalah sendiri. Lihat di sini: stackoverflow.com/questions/1764809/… stackoverflow.com/questions/6000856/filesystemwatchwatcher-issues
JohnP
1
@ BrettG - Juga, ini adalah ekstensi yang baik untuk FSW: codeproject.com/Articles/58740/…
JohnP
1

Tidak ada cara untuk mengandalkan tanggal kapan suatu file disalin atau dipindahkan ke folder. Windows mengelola untuk melestarikannya di seluruh sistem file, drive, jaringan berbagi, dll. Anda mungkin dapat menyelesaikan sesuatu dengan server file linux, atau mencegah orang dari menyalin file secara langsung dengan menggunakan FTP atau sistem upload berbasis web.

Jika Anda setuju dengan orang-orang yang tidak dapat memodifikasi file setelah mereka mengunggah, Anda dapat memiliki folder unggahan dan akses yang terpisah, dan skrip yang memindahkan file di antara mereka dan menentukan tanggal kembali. Tapi sepertinya Anda ingin orang dapat memodifikasi file secara langsung.

Jadi solusi sederhana, jika agak hacky, adalah mengacaukan tanggal. Saya akan menulis dua skrip:

Skrip Changer Tanggal Tiap Jam

Buat skrip dijalankan sekali dalam satu jam atau lebih, dalam bahasa pilihan Anda, bahwa:

  • Mencari file apa pun dengan tanggal yang diubah dalam 20 tahun terakhir.
  • Ketika menemukan file seperti itu, ubah tanggalnya diubah menjadi hari ini minus 20 tahun.

Dalam PowerShell, akan terlihat seperti ini:

$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
    }
}

Menjalankan skrip ini hari ini (27 Mei), menetapkan tanggal modifikasi dari semua file menjadi 1 Juni 1994 - tepat 356 * 20 hari yang lalu. Karena hanya mengubah file yang lebih baru dari nilai $ before, itu tidak akan menyentuh file yang telah ditetapkan sebelumnya.

Skrip Pembersihan

Skrip pembersihan akan dijalankan setiap malam, dan:

  • Cari file dengan tanggal yang diubah "20 tahun dan X hari yang lalu"
  • Hapus mereka

Saya tidak akan menulis skrip untuk bagian ini - ada banyak utilitas yang dapat menangani menghapus file yang lebih tua dari tanggal yang ditentukan, pilih mana yang Anda suka. Bagian yang penting adalah mencari file yang berumur 7300 + X hari, di mana X adalah jumlah hari yang ingin Anda pertahankan sejak mereka terakhir dimodifikasi.

Keuntungan

Ini memiliki beberapa keunggulan dibandingkan jawaban lain di sini:

  • Penghitung waktu akan mengatur ulang jika seseorang memodifikasi file.
  • Tidak perlu stream alternatif NTFS untuk menandai file (yang disimpan saat memindahkan file, sehingga dapat menyebabkan penghapusan dini dari file yang dimodifikasi)
  • Seharusnya minimal jika ada dampak kinerja. Tidak perlu menyimpan database atau daftar nama file dan / atau hash.
  • Tidak ada yang rusak jika skrip gagal dijalankan. Tidak ada layanan atau program yang terus berjalan yang diperlukan untuk memperbarui tanggal. Hanya beberapa tugas terjadwal. Solusi yang mengandalkan menonton file baru dan memperbarui waktu terakhir yang dimodifikasi untuk saat ini dapat berakhir dengan menghapus file baru jika layanan gagal atau mengalami kondisi balapan.

Satu-satunya masalah yang bisa saya lihat adalah apakah orang menyalin file yang terakhir diubah 20 tahun yang lalu ke folder drop. Saya pikir dalam sebagian besar skenario, itu tidak mungkin menjadi masalah besar, tetapi bisa muncul.

Hibah
sumber
0

Anda dapat memformalkan penambahan file ke drop box melalui halaman web, yang memiliki "unggah" IFRAME. Pengguna kemudian dapat "memposting" file, yang memanggil pekerjaan PHP / ASP di server, yang mengambil file dan menempatkannya di lokasi kerutan. PHP / ASP dapat melakukan sejumlah operasi indeks / analisis.

Simon Catlin
sumber
0

Jika seseorang menyalin atau memindahkan file ke sini, saya ingin jam mulai berdetak pada titik ini. Namun, tanggal modifikasi terakhir dan tanggal pembuatan file tidak akan diperbarui kecuali seseorang benar-benar memodifikasi file.

Saya akan membuat skrip yang berjalan sebagai tugas yang dijadwalkan setiap lima menit dan melakukan dua hal.

  1. Tindakan pertama akan membuat salinan file apa pun yang disalin ke dalam folder, menempatkan awalan pada file dan menghapus yang asli. Ini akan memastikan bahwa tanggal pembuatan file seragam untuk aplikasi.
  2. Tindakan kedua akan melihat semua file dengan awalan yang telah ditentukan sebelumnya (ditetapkan dengan tindakan 1) dan menghapus salah satu dari mereka dengan tanggal pembuatan yang lebih tua dari X hari. Ini akan menyelesaikan masalah tanggal modifikasi / diakses.
pengguna1914368
sumber
0

Ada mekanisme yang ada untuk menandai file, bit Arsip. Sudah ada sejak awal DOS, dan hadir pada FAT dan NTFS.

Pada dasarnya, setiap file akan memiliki bit arsip yang ditetapkan secara default. Jika Anda melihat file dengan bit arsip di folder drop Anda, (1) hapus bit itu dan (2) atur tanggalnya menjadi hari ini. Jika Anda melihat file tanpa bit itu dan dengan tanggal <= 7 hari di masa lalu, hapuslah.

Jika pengguna menulis ke file saat berada di folder drop, bit arsipnya diatur lagi sehingga masa pakainya juga diatur ulang menjadi 7 hari. Ini berlaku file baru, setelah semua.

Anda sekarang dapat menggunakan FileSystemWatcher dengan aman. Masalah apa pun yang dimilikinya (seperti peristiwa duplikat, buffer overflow kehilangan informasi terperinci) tidak lagi menjadi masalah karena informasi yang relevan ada dalam metadata file.

MSalters
sumber