Термін дії файлів у папці: видалення файлів через x днів


12

Я хочу зробити папку "Drop Folder" на спільному накопичувачі Windows, доступному для всіх. Я хотів би, щоб файли були автоматично видалені, якщо вони знаходяться в папці більше X днів.

Однак, схоже, що всі методи, які я знайшов для цього, використовують останню змінену дату, час останнього доступу або дату створення файлу.

Я намагаюся зробити цю папку, в яку користувач може видаляти файли, щоб поділитися з кимось. Якщо хтось копіює або переміщує файли сюди, я хотів би, щоб годинник почав галочувати з цього моменту. Однак остання змінена дата та дата створення файлу не буде оновлено, якщо хтось фактично не змінить файл. Останній час доступу оновлюється занадто часто ... Схоже, що просто відкриття каталогу у Windows Explorer оновить останній час доступу.

Хтось знає про рішення цього? Я думаю, що каталогізація хеш-файлів на щоденній основі, а потім закінчення терміну дії файлів на основі хешів, старших за певну дату, може бути рішенням .... але прийняття хеш-файлів може зайняти багато часу.

Будь-які ідеї будуть дуже вдячні!

Примітка.
Я вже переглянув досить багато відповідей на це ... заглянув у Монітор ресурсів файлового сервера, скрипти в оболонці, пакетні скрипти тощо. Вони все ще використовують останній час доступу, час останнього зміни або час створення ... які, як описано, не відповідають зазначеним потребам.


Одне запитання, як згадував @Michael Kjorling, чи таймер припиняє рахувати, якщо файл змінено після того, як він випав у поле?
Get-HomeByFiveOClock

Що ви шукаєте, це еквівалент Windows tmpwatch.
Avery Payne

Відповіді:


5

Ми використовували комбінацію сценарію повноважень та політики. Політика вказує, що користувач повинен створити папку всередині спільноти Drop_Zone і потім скопіювати всі потрібні файли у цю папку. Коли папці виповниться 7 днів (за допомогою CreationTime) сценарій Shell Shell видалить її.

Я також додав деякий журнал до скрипту powershell, щоб ми могли перевірити його роботу, і ввімкнув тіньові копії лише для того, щоб врятувати повністю невмілих від себе.

Ось сценарій без усіх речей журналу.

$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
Це здається найпростішим, не змінюється з позначенням дати файлу, альтернативними потоками даних або не потрібен певний список файлів та дати їх випадання. Я збирався створити дивовижний сценарій, який робив усіляку магію, але потім я це побачив.
BeowulfNode42

і не вимагає, щоб подія перегляду файлової системи постійно запускала сценарій, оскільки його можна запускати один раз на день, і це не має великого значення, якщо день пропущено з будь-якої причини.
BeowulfNode42

2
Чудова проста ідея, як відзначив @ BeowulfNode42. Щоб переконатися, що користувачі повинні створити папку, простий "Заборонити" з "Створити файли / записати дані" ACL до "Лише ця папка" забезпечить, що користувачі також повинні створювати підпапки.
Бретт G

3

Якщо ви можете припустити NTFS, ви можете написати ключ (Guid) в альтернативний потік файлу. Плюс дата, щоб ви могли зберігати базу даних у файлах.

Більше інформації можна знайти за адресою

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

В основному ви можете зберігати додатковий вміст в окремому потоці, який кодується спеціальним іменем.


Як би це зробити?
Бретт G

@BrettG Додано посилання на документацію. "Альтернативний потік даних NTFS" змусив би вас знайти його також у google, про всяк випадок - ви не знаєте google.
TomTom

Вибачте, я знаю, що таке альтернативні потоки даних, я просто намагався зрозуміти їх використання в цьому контексті. Отже, ви говорите, замість того, щоб використовувати хеш або щось подібне, використовуйте GUID (та / або дату) в альтернативному потоці даних, щоб відстежувати файли .. ага.
Бретт G

Так. Якщо ви можете надійно МАРКУВАТИ файл - ви навіть можете помістити в нього дату розмітки - тоді вам не потрібно обчислювати хеш.
TomTom

Просто слідкуйте, чи файл копіюється з магазину, редагується та копіюється назад. Ви хочете перезапустити таймер, для чого хеш може бути корисним.
CVn

2

Ви можете використовувати IO.FileSystemWatcher, що дозволяє "дивитися" папку за новими створеними файлами. Ось фрагменти, які вам знадобляться, щоб зробити цю роботу.

Ці змінні налаштовують шлях для перегляду та фільтр, щоб точно налаштувати, які файли слід відстежувати:

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

Це встановлює параметри для папки, яку слід спостерігати, і дії, які потрібно виконувати, коли відбувається подія. В основному це скидає LastWriteTime для кожного файлу так, як він написаний:

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

Подія може бути незареєстрована, якщо потрібно, використовуючи це:

Unregister-Event -SourceIdentifier FileCreated

Нарешті, ви можете запускати це раз на день, щоб очистити старі файли:

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

Це має бути все, що вам потрібно ...


Відредагував це, щоб встановити атрибут LastWriteTime, коли файл створений, а потім використовувати його для видалення файлів пізніше.
Тім Феррілл

1

Минув час, але я створив відносно прямий метод для вирішення цього питання.

Я торкнувся будь-яких файлів, доданих до каталогу падіння (відстежувався за допомогою утиліти моніторингу ресурсів) і призначив останню змінену дату до дати, доданої до папки.

Тоді я міг би використати останню змінену дату, щоб очистити будь-які файли, які потрібно постаріти. Це також має перевагу в тому, що якщо хтось дійсно оновить файл, він відновить зворотний відлік.


Ідеальна ідея. Я буду робити власні дослідження .. але будь-яка ідея, яку утиліту для моніторингу ресурсів ви використовували?
Бретт G

@BrettG чесно це було майже 10 років тому. Я не можу згадати. Ти змушуєш мене відчувати себе старим. :) Якби я це зробив сьогодні, я виконав би завдання на основі подій аудиту файлової системи у переглядачі подій. Об'єкт FileSystemWatcher .NET доступний через PowerShell, я думаю. Це був би інший варіант.
Тім Брігхем

Ха, я не розумів, що ти це мав на увазі так довго, коли ти сказав "на деякий час". Так досить смішно, я просто дивився на FileSystemWatcher. Хоча, я не думаю, що це буде працювати з переміщеними / скопійованими файлами. Дякую за відповідь!
Бретт G

1
@BrettG - Filesystemwatcher може використовуватися разом із таблицею відстеження, але у неї є свої проблеми. Дивіться тут: stackoverflow.com/questions/1764809 / ... stackoverflow.com/questions/6000856/filesystemwatcher-issues
JohnP

1
@BrettG - Також це хороше розширення до ЖКС: codeproject.com/Articles/58740/…
JohnP

1

Не можна покладатися на дати, коли файл було скопійовано або переміщено у папку. Windows вдається зберегти його у файлових системах, накопичувачах, мережевих спільних ресурсах тощо. Можливо, вам вдасться щось розробити за допомогою файлового сервера linux або заборонити людям безпосередньо копіювати файли за допомогою FTP або веб-системи завантаження.

Якщо ви добре, якщо люди не можуть змінити файли після їх завантаження, ви можете мати окремі папки для завантаження та доступу та сценарій, який переміщує файли між ними та повторно датує їх. Але це здається, що ви хочете, щоб люди мали змогу безпосередньо змінювати файли.

Таким простим, хоч дещо хакітним рішенням було б возитися з фініками. Я написав би два сценарії:

Погодинний сценарій зміни дати

Потрібно запускати сценарій один раз на годину чи так на своїй бажаній мові, що:

  • Шукає будь-який файл із датою, зміненою протягом останніх 20 років.
  • Коли він знайде такий файл, змініть його дату, змінену на сьогодні мінус 20 років.

У повному віці це виглядатиме приблизно так:

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

Запуск цього сценарію сьогодні (27 травня) встановлює змінену дату всіх файлів на 1 червня 1994 року - рівно 356 * 20 днів тому. Оскільки він змінює лише файли, новіші за $ до значення, він не торкнеться файлів, які він уже встановив у минулому.

Сценарій очищення

Сценарій очищення запускається щовечора, і:

  • Пошук файлів із датою, зміненою "20 років і X днів тому"
  • Видаліть їх

Я не буду писати сценарій для цієї частини - є безліч утиліт, які можуть обробляти видалення файлів, старших за вказану дату, виберіть те, що вам подобається. Важливою частиною є пошук файлів, що мають 7300 + X днів, де X - кількість днів, які ви хочете зберегти з моменту останнього зміни.

Переваги

Це має ряд переваг перед іншими відповідями тут:

  • Таймер буде скинутий, якщо хтось модифікує файл.
  • Немає необхідності в альтернативних потоках NTFS для маркування файлів (які зберігаються під час переміщення файлу, тому це може спричинити передчасне видалення зміненого файлу)
  • Має мати мінімальний, якщо будь-який вплив на продуктивність. Не потрібно зберігати базу даних або список імен файлів та / або хешей.
  • Нічого не зламається, якщо сценарії не запускаються. Для оновлення дати не потрібна служба або постійно запущена програма. Всього пара запланованих завдань. Рішення, які покладаються на перегляд нових файлів та оновлення останнього зміненого часу до цього моменту, можуть призвести до видалення нових файлів, якщо сервіс не працює або переходить у стан гонки.

Єдина проблема, яку я можу побачити, - це те, якщо люди копіюють файл, який востаннє змінено 20 років тому, у папку "drop". Я думаю, що в більшості сценаріїв це навряд чи буде великою проблемою, але це може вийти.


0

Ви можете формалізувати додавання файлів у спадне вікно через веб-сторінку, на якій розміщено IFRAME для завантаження. Потім користувач може "розмістити" файл, який викликає завдання PHP / ASP на сервері, який приймає файл і розміщує його в місці вибору. PHP / ASP може виконувати будь-яку кількість операцій з індексу / аналізу.


0

Якщо хтось копіює або переміщує файли сюди, я хотів би, щоб годинник почав галочувати з цього моменту. Однак остання змінена дата та дата створення файлу не буде оновлено, якщо хтось фактично не змінить файл.

Я створив би сценарій, який виконується як заплановані завдання кожні п’ять хвилин і робить дві речі.

  1. Першою дією було б зробити копію будь-якого файлу, скопійованого в папку, поставити префікс у файл та видалити оригінал. Це забезпечило б, щоб дата створення файлу була однаковою для програми.
  2. Друга дія буде розглядати всі файли з заздалегідь визначеним префіксом (встановити з дією 1) і видалити будь-який з тих, хто має дату створення старше X днів. Це вирішило б проблему зміни дати / доступу.

0

Існує механізм маркування файлів, біт архіву. Він існує з ранніх днів DOS і присутній як на FAT, так і на NTFS.

В основному, у кожному файлі буде встановлено його біт архіву за замовчуванням. Якщо ви бачите файл із бітом архіву у папці краплі, (1) очистіть цей біт та (2) встановіть його дату сьогодні. Якщо ви бачите файл без цього біта і з датою <= 7 днів, видаліть його.

Якщо користувач записує у файл, поки він знаходиться в папці "drop", його біт архіву встановлюється знову, тому його термін служби також скидається до 7 днів. Це фактично новий файл, зрештою.

Тепер ви можете безпечно використовувати FileSystemWatcher. Будь-які проблеми (наприклад, дублюючі події, переповнення буфера, втрачаючи детальну інформацію) вже не мають значення, оскільки відповідна інформація є всіма метаданими файлу.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.