폴더에서 파일 만료 : x 일 후 파일 삭제 마지막 액세스 시간 또는

모든 사람이 액세스 할 수있는 Windows 공유 드라이브에서 “드롭 폴더”를 만들려고합니다. 파일이 X 일 이상 폴더에 있으면 자동으로 파일을 삭제하고 싶습니다.

그러나 내가 찾은 모든 방법, 마지막 수정 날짜, 마지막 액세스 시간 또는 파일 작성 날짜를 사용하는 것처럼 보입니다.

이 폴더를 사용자가 다른 사용자와 공유하기 위해 파일을 놓을 수있는 폴더로 만들려고합니다. 누군가 파일을 복사하거나 여기로 옮기면 시계가이 시점에서 똑딱 거리고 싶습니다. 그러나 누군가 파일을 실제로 수정하지 않으면 파일의 마지막 수정 날짜 및 작성 날짜가 업데이트되지 않습니다. 마지막 액세스 시간이 너무 자주 업데이트됩니다 … Windows 탐색기에서 디렉토리를 열면 마지막 액세스 시간이 업데이트되는 것 같습니다.

누구든지 이것에 대한 해결책을 알고 있습니까? 매일 파일 해시를 카탈로그 화 한 다음 특정 날짜보다 오래된 해시를 기반으로 파일을 만료하는 것이 해결책 일 수 있다고 생각합니다 …하지만 파일 해시를 가져 오는 데 시간이 오래 걸릴 수 있습니다.

어떤 아이디어라도 대단히 감사하겠습니다!

참고 :
나는 이미 여기에 많은 답변을 보았습니다 … 파일 서버 리소스 모니터, powershell 스크립트, 배치 스크립트 등을 살펴 보았습니다. 여전히 마지막 액세스 시간, 마지막 수정 시간 또는 생성 시간을 사용합니다 … 전술 한 바와 같이, 상기 요구에 맞지 않는다.



답변

우리는 powershell 스크립트와 정책의 조합을 사용했습니다. 이 정책은 사용자가 Drop_Zone 공유 내에 폴더를 만든 다음 원하는 파일을 해당 폴더에 복사하도록 지정합니다. 폴더가 7 일이되면 (CreationTime 사용) powershell 스크립트가 폴더를 삭제합니다.

또한 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
  }
}


답변

NTFS를 가정 할 수 있으면 파일의 대체 스트림에 키 (Guid)를 쓸 수 있습니다. 날짜와 함께 기본적으로 데이터베이스를 파일에 저장할 수 있습니다.

자세한 내용은 다음을 참조하십시오.

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

기본적으로 특별한 이름으로 코딩 된 별도의 스트림에 추가 컨텐츠를 저장할 수 있습니다.


답변

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

그게 당신이 필요로하는 모든 것이어야합니다 …


답변

오랜 시간이 지났지만이 문제를 해결하기 위해 비교적 간단한 방법을 설정했습니다.

드롭 디렉토리에 추가 된 파일 (자원 모니터링 유틸리티를 통해 모니터링)을 터치하고 마지막으로 수정 한 날짜를 폴더에 추가 된 날짜로 설정합니다.

그런 다음 마지막 수정 날짜를 사용하여 오래된 파일을 제거 할 수 있습니다. 또한 누군가 파일을 실제로 업데이트하면 카운트 다운이 재설정된다는 장점도 있습니다.


답변

파일을 복사하거나 폴더로 옮긴 날짜에 의존 할 방법이 없습니다. Windows는 파일 시스템, 드라이브, 네트워크 공유 등을 통해 파일을 보존합니다. Linux 파일 서버에서 문제를 해결하거나 사람들이 FTP 또는 웹 기반 업로드 시스템을 사용하여 파일을 직접 복사하지 못하게 할 수 있습니다.

사람들이 파일을 업로드 한 후 파일을 수정할 수없는 것이 괜찮다면, 별도의 업로드 및 액세스 폴더와 파일간에 파일을 이동하고 다시 업데이트하는 스크립트를 가질 수 있습니다. 그러나 사람들이 파일을 직접 수정할 수 있기를 원하는 것처럼 들립니다.

따라서 해킹이 쉽지만 간단한 해결책은 날짜를 망칠 것입니다. 두 개의 스크립트를 작성합니다.

시간별 날짜 변경자 스크립트

원하는 언어로 한 시간 정도 스크립트를 실행하십시오.

  • 지난 20 년 동안 날짜가 수정 된 파일을 찾습니다.
  • 이러한 파일을 찾으면 오늘에서 20 년을 빼고 수정 한 날짜를 변경하십시오.

powershell에서 다음과 같이 보일 것입니다.

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

오늘 (5 월 27 일)이 스크립트를 실행하면 모든 파일의 수정 날짜가 1994 년 6 월 1 일 (정확히 356 * 20 일)로 설정됩니다. $ before 값보다 새로운 파일 만 변경하므로 이미 과거로 설정 한 파일은 건드리지 않습니다.

정리 스크립트

정리 스크립트는 매일 밤 실행되며 다음과 같습니다.

  • “20 년 X 일 전에”수정 한 날짜의 파일 검색
  • 그들을 삭제

이 부분에 대한 스크립트는 작성하지 않겠습니다. 지정된 날짜보다 오래된 파일을 삭제하고 처리 할 수있는 유틸리티가 많이 있습니다. 중요한 부분은 7300 + X 일이 지난 파일을 찾는 것입니다. 여기서 X는 파일을 마지막으로 수정 한 후 유지할 일 수입니다.

장점

여기에 다른 답변보다 몇 가지 장점이 있습니다.

  • 누군가 파일을 수정하면 타이머가 재설정됩니다.
  • NTFS 대체 스트림이 파일을 표시 할 필요가 없습니다 (파일을 이동할 때 유지되므로 수정 된 파일을 조기에 삭제할 수 있음)
  • 성능에 영향을주는 경우 최소화해야합니다. 데이터베이스 나 파일 이름 및 / 또는 해시 목록을 유지할 필요가 없습니다.
  • 스크립트가 실행되지 않으면 아무것도 깨지지 않습니다. 날짜를 업데이트하는 데 필요한 서비스 또는 지속적으로 실행되는 프로그램이 없습니다. 몇 가지 예약 된 작업. 새 파일을 감시하고 마지막으로 수정 한 시간을 업데이트하는 솔루션은 서비스가 실패하거나 경쟁 조건에 처할 경우 새 파일을 삭제하게됩니다.

내가 볼 수있는 유일한 문제는 사람들이 20 년 전에 마지막으로 수정 된 파일을 드롭 폴더에 복사하는 경우입니다. 나는 대부분의 시나리오에서 그다지 큰 문제는 아닐 것이라고 생각하지만 일어날 수 있습니다.


답변

“업로드”IFRAME이있는 웹 페이지를 통해 드롭 박스에 파일 추가를 공식화 할 수 있습니다. 그런 다음 사용자는 파일을 “게시”하여 서버에서 PHP / ASP 작업을 호출하여 파일을 가져 와서 pucker 위치에 배치합니다. PHP / ASP는 여러 인덱스 / 분석 작업을 수행 할 수 있습니다.


답변

누군가 파일을 복사하거나 여기로 옮기면 시계가이 시점에서 똑딱 거리고 싶습니다. 그러나 누군가 파일을 실제로 수정하지 않으면 파일의 마지막 수정 날짜 및 작성 날짜가 업데이트되지 않습니다.

5 분마다 예약 된 작업으로 실행되고 두 가지 작업을 수행하는 스크립트를 작성합니다.

  1. 첫 번째 조치는 파일을 폴더에 복사하고 파일에 접 두부를 붙이고 원본을 삭제하는 것입니다. 이렇게하면 파일 작성 날짜가 응용 프로그램에 대해 일정하게 유지됩니다.
  2. 두 번째 작업은 미리 결정된 접두사가있는 모든 파일 (작업 1로 설정)을보고 X 일보다 오래된 생성 날짜를 가진 파일을 삭제합니다. 이것은 수정 / 접근 날짜 문제를 해결합니다.