หมดอายุไฟล์ในโฟลเดอร์: ลบไฟล์หลังจาก x วัน


12

ฉันต้องการสร้าง "วางโฟลเดอร์" ในไดรฟ์ที่ใช้ร่วมกันกับ windows ซึ่งทุกคนสามารถเข้าถึงได้ ฉันต้องการลบไฟล์โดยอัตโนมัติหากไฟล์นั้นอยู่ในโฟลเดอร์นานกว่า X วัน

อย่างไรก็ตามดูเหมือนว่าวิธีการทั้งหมดที่ฉันทำพบใช้วันที่แก้ไขล่าสุดเวลาเข้าถึงล่าสุดหรือวันที่สร้างไฟล์

ฉันกำลังพยายามทำให้โฟลเดอร์นี้เป็นโฟลเดอร์ที่ผู้ใช้สามารถวางไฟล์เพื่อแชร์กับใครบางคน หากมีคนคัดลอกหรือย้ายไฟล์มาที่นี่ฉันต้องการให้นาฬิกาเริ่มติ๊ก ณ จุดนี้ อย่างไรก็ตามวันที่แก้ไขล่าสุดและวันที่สร้างไฟล์จะไม่ได้รับการอัปเดตเว้นแต่จะมีคนแก้ไขไฟล์จริง เวลาเข้าถึงล่าสุดถูกอัพเดตบ่อยเกินไป ... ดูเหมือนว่าเพียงแค่เปิดไดเรกทอรีใน windows explorer จะอัปเดตเวลาเข้าถึงล่าสุด

ใครรู้วิธีแก้ปัญหานี้? ฉันคิดว่าการทำรายการแฮชของไฟล์ทุกวันแล้วการหมดอายุไฟล์ตามแฮชที่เก่ากว่าวันที่กำหนดอาจเป็นทางออก .... แต่การแฮชไฟล์อาจใช้เวลานาน

ความคิดใด ๆ ที่จะได้รับการชื่นชมอย่างมาก!

หมายเหตุ:
ฉันได้ดูคำตอบมากมายแล้วที่นี่ ... ดูใน File Server Resource Monitor, สคริปต์ PowerShell, สคริปต์แบทช์และอื่น ๆ พวกเขายังคงใช้เวลาเข้าถึงล่าสุดเวลาแก้ไขล่าสุดหรือเวลาสร้าง ... ซึ่งตามที่อธิบายไว้ไม่ตรงกับความต้องการข้างต้น


คำถามหนึ่งอย่างที่ @Michael Kjorling จับเวลาหยุดนับหรือไม่ถ้าไฟล์ถูกแก้ไขหลังจากตกหล่นในกล่อง?
Get-HomeByFiveOClock

tmpwatchสิ่งที่คุณกำลังมองหาเป็นเทียบเท่าของ Windows
Avery Payne

คำตอบ:


5

เราใช้การรวมกันของสคริปต์ PowerShell และนโยบาย นโยบายระบุว่าผู้ใช้ต้องสร้างโฟลเดอร์ภายในแบ่งปัน Drop_Zone แล้วคัดลอกไฟล์ใด ๆ ที่พวกเขาต้องการลงในโฟลเดอร์นั้น เมื่อโฟลเดอร์มีอายุ 7 วัน (ใช้ CreationTime) สคริปต์ PowerShell จะลบออก

ฉันยังเพิ่มการบันทึกบางอย่างลงในสคริปต์ PowerShell เพื่อให้เราสามารถตรวจสอบการทำงานของมันและเปิดใช้งาน Shadow Copy เพื่อบันทึกสิ่งที่ไม่เหมาะสมจากตัวเอง

นี่คือสคริปต์ที่ไม่มีสิ่งบันทึกทั้งหมด

$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 "ปฏิเสธ" ของ "สร้างไฟล์ / เขียนข้อมูล" ไปที่ "โฟลเดอร์นี้เท่านั้น" จะช่วยให้มั่นใจได้ว่าผู้ใช้จะต้องสร้างโฟลเดอร์ย่อยด้วย
Brett G

3

หากคุณสามารถสมมติว่าเป็น NTFS คุณสามารถเขียนคีย์ (Guid) ลงในกระแสข้อมูลสำรองของไฟล์ได้ บวกกับวันที่ดังนั้นคุณสามารถจัดเก็บฐานข้อมูลในไฟล์ได้

ข้อมูลเพิ่มเติมสามารถดูได้ที่

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

โดยทั่วไปคุณสามารถจัดเก็บเนื้อหาเพิ่มเติมในสตรีมแยกต่างหากที่เข้ารหัสด้วยชื่อพิเศษ


คนเราจะทำสิ่งนี้ได้อย่างไร
Brett G

@BrettG เพิ่มลิงก์ไปยังเอกสาร "NTFS Alternate Data Stream" จะทำให้คุณเจอใน google เช่นกันในกรณีนี้ - คุณไม่รู้ google
TomTom

ขออภัยฉันรู้ว่ากระแสข้อมูลอื่นคืออะไรฉันแค่พยายามเข้าใจการใช้งานในบริบทนี้ ดังนั้นคุณกำลังพูดแทนการใช้แฮชหรืออะไรสักอย่างใช้ GUID (และ / หรือวันที่) ในกระแสข้อมูลสำรองเพื่อติดตามไฟล์ .. aha
Brett 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 เมื่อไฟล์ถูกสร้างขึ้นจากนั้นใช้เพื่อลบไฟล์ในภายหลัง
Tim Ferrill

1

ไม่นานมานี้ แต่ฉันตั้งค่าวิธีการส่งต่อที่ค่อนข้างตรงไปตรงมาสำหรับเรื่องนี้

ฉันจะแตะไฟล์ใด ๆ ที่เพิ่มไปยังไดเรกทอรีหล่น (ตรวจสอบผ่านยูทิลิตี้การตรวจสอบทรัพยากร) และตั้งวันที่แก้ไขล่าสุดเป็นวันที่เพิ่มไปยังโฟลเดอร์

ฉันสามารถใช้วันที่แก้ไขล่าสุดเพื่อกำจัดไฟล์ใด ๆ ที่จำเป็นต้องปิด นี่ยังมีข้อได้เปรียบที่ว่าถ้ามีคนอัพเดตไฟล์จริง ๆ มันจะรีเซ็ตการนับถอยหลัง


ความคิดที่สมบูรณ์แบบ ฉันจะทำการวิจัยของตัวเอง .. แต่ความคิดใด ๆ ที่คุณใช้ยูทิลิตี้การตรวจสอบทรัพยากร?
Brett G

@BrettG พูดตามตรงมาเกือบ 10 ปีแล้ว ฉันจำไม่ได้ คุณทำให้ฉันรู้สึกแก่ :) ถ้าฉันต้องทำวันนี้ฉันจะทำงานโดยอ้างอิงเหตุการณ์การตรวจสอบระบบไฟล์ใน Event Viewer วัตถุ FileSystemWatcher .NET มีให้ใช้งานผ่าน PowerShell ฉันคิดว่า มันจะเป็นตัวเลือกอื่น
Tim Brigham

ฮาฉันไม่ได้ตระหนักว่าคุณหมายถึงนานขนาดนั้นเมื่อคุณพูดว่า "ในขณะที่" ใช่ตลกพอฉันแค่ดูที่ FileSystemWatcher แม้ว่าฉันไม่คิดว่ามันจะทำงานกับไฟล์ที่ถูกย้าย / คัดลอก ขอบคุณสำหรับการตอบกลับ!
Brett G

1
@BrettG - สามารถใช้ Filesystemwatcher ร่วมกับตารางติดตาม แต่มีปัญหาของตัวเอง ดูที่นี่: stackoverflow.com/questions/1764809/… stackoverflow.com/questions/6000856/filesystemwatcher-issues
JohnP

1
@BrettG - นี่เป็นส่วนขยายที่ดีสำหรับ FSW: codeproject.com/Articles/58740/…
JohnP

1

ไม่มีวิธีที่จะพึ่งพาวันที่เมื่อคัดลอกหรือย้ายไฟล์ไปยังโฟลเดอร์ 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
    }
}

ใช้งานสคริปต์นี้วันนี้ (27 พฤษภาคม) ตั้งค่าวันที่แก้ไขของไฟล์ทั้งหมดเป็น 1 มิถุนายน 1994 - เท่ากับ 356 * 20 วันก่อน เนื่องจากมีการเปลี่ยนแปลงเฉพาะไฟล์ที่ใหม่กว่าค่า $ ก่อนมันจะไม่แตะไฟล์ที่เคยตั้งค่าไปแล้วในอดีต

สคริปต์การล้างข้อมูล

สคริปต์การล้างข้อมูลจะทำงานทุกคืนและ:

  • ค้นหาไฟล์ที่มีการแก้ไขวันที่ "20 ปีและสิบวันที่ผ่านมา"
  • ลบทิ้ง

ฉันจะไม่เขียนสคริปต์สำหรับส่วนนี้ - มียูทิลิตี้มากมายที่สามารถจัดการกับการลบไฟล์ที่เก่ากว่าวันที่ที่ระบุเลือกได้ตามที่คุณต้องการ ส่วนที่สำคัญคือการค้นหาไฟล์ที่มีอายุ 7300 + X วันโดยที่ X คือจำนวนวันที่คุณต้องการเก็บไว้นับตั้งแต่มีการแก้ไขครั้งล่าสุด

ข้อดี

นี่เป็นข้อได้เปรียบเหนือคำตอบอื่น ๆ ที่นี่:

  • ตัวจับเวลาจะรีเซ็ตหากมีคนแก้ไขไฟล์
  • ไม่จำเป็นสำหรับสตรีมสำรอง NTFS เพื่อทำเครื่องหมายไฟล์ (ซึ่งถูกสงวนไว้เมื่อย้ายไฟล์ดังนั้นอาจทำให้การลบไฟล์ที่ถูกปรับเปลี่ยนก่อนกำหนด)
  • ควรมีน้อยที่สุดหากมีผลกระทบต่อประสิทธิภาพ ไม่จำเป็นต้องเก็บฐานข้อมูลหรือรายการชื่อไฟล์และ / หรือแฮช
  • ไม่มีอะไรแตกสลายอย่างน่ากลัวหากสคริปต์ล้มเหลวในการทำงาน ไม่มีบริการหรือรันโปรแกรมอย่างต่อเนื่องที่จำเป็นในการอัพเดทวันที่ เพียงแค่สองสามงานที่กำหนดไว้ โซลูชั่นที่ต้องพึ่งพาการเฝ้าดูไฟล์ใหม่และการอัพเดทเวลาที่แก้ไขล่าสุดเป็นตอนนี้อาจสิ้นสุดการลบไฟล์ใหม่ได้ถ้าบริการล้มเหลวหรือทำงานผิดพลาด

ปัญหาเดียวที่ฉันเห็นคือถ้ามีคนคัดลอกไฟล์ที่ถูกแก้ไขครั้งล่าสุดเมื่อ 20 ปีก่อนไปยังโฟลเดอร์ดรอป ฉันคิดว่าในสถานการณ์ส่วนใหญ่ที่ไม่น่าเป็นปัญหามากนัก แต่อาจเกิดขึ้นได้


0

คุณสามารถทำการเพิ่มไฟล์เข้าในช่องดร็อปผ่านหน้าเว็บได้อย่างเป็นทางการซึ่งมี IFRAME "อัปโหลด" จากนั้นผู้ใช้สามารถ "โพสต์" ไฟล์ซึ่งจะเรียกใช้งาน PHP / ASP บนเซิร์ฟเวอร์ซึ่งใช้ไฟล์และวางไว้ในตำแหน่งรอยย่น PHP / ASP สามารถทำดัชนี / การวิเคราะห์จำนวนเท่าใดก็ได้


0

หากมีคนคัดลอกหรือย้ายไฟล์มาที่นี่ฉันต้องการให้นาฬิกาเริ่มติ๊ก ณ จุดนี้ อย่างไรก็ตามวันที่แก้ไขล่าสุดและวันที่สร้างไฟล์จะไม่ได้รับการอัปเดตเว้นแต่จะมีคนแก้ไขไฟล์จริง

ฉันจะสร้างสคริปต์ที่ทำงานตามกำหนดเวลาทุกห้านาทีและทำสองสิ่ง

  1. การกระทำแรกจะทำสำเนาของไฟล์ใด ๆ ที่คัดลอกลงในโฟลเดอร์ใส่คำนำหน้าบนไฟล์และลบต้นฉบับ สิ่งนี้จะทำให้มั่นใจได้ว่าวันที่สร้างไฟล์นั้นมีความเหมือนกันสำหรับแอปพลิเคชัน
  2. แอ็คชันที่สองจะดูไฟล์ทั้งหมดที่มีคำนำหน้าที่กำหนดไว้ล่วงหน้า (ตั้งค่าด้วยแอ็คชัน 1) และลบไฟล์ใด ๆ ที่มีวันที่สร้างเก่ากว่า X วัน สิ่งนี้จะช่วยแก้ปัญหาวันที่แก้ไข / เข้าถึง

0

มีกลไกที่มีอยู่ในการทำเครื่องหมายไฟล์คือบิตการเก็บถาวร มันอยู่ที่นั่นมาตั้งแต่ยุคแรก ๆ ของ DOS และมีทั้งที่ FAT และ NTFS

โดยทั่วไปไฟล์ทุกไฟล์จะมีบิตของไฟล์เก็บถาวรที่ตั้งค่าเป็นค่าเริ่มต้น หากคุณเห็นไฟล์ที่มีบิตเก็บถาวรในโฟลเดอร์ดรอปของคุณ (1) ล้างบิตนั้นและ (2) กำหนดวันที่เป็นวันนี้ หากคุณเห็นไฟล์ที่ไม่มีบิตนั้นและด้วยวันที่ <= 7 วันที่ผ่านมาให้ลบมันทิ้ง

หากผู้ใช้เขียนไปยังไฟล์ในขณะที่อยู่ในโฟลเดอร์ดร็อปบิตไฟล์เก็บถาวรจะถูกตั้งค่าอีกครั้งดังนั้นอายุการใช้งานจะถูกรีเซ็ตเป็น 7 วัน มันมีผลกับไฟล์ใหม่หลังจากทั้งหมด

ตอนนี้คุณสามารถใช้ FileSystemWatcher อย่างปลอดภัย ปัญหาใด ๆ ที่เกิดขึ้น (เช่นเหตุการณ์ที่ซ้ำกันบัฟเฟอร์ล้นที่สูญเสียข้อมูลโดยละเอียด) ไม่สำคัญอีกต่อไปเนื่องจากข้อมูลที่เกี่ยวข้องนั้นอยู่ในข้อมูลเมตาของไฟล์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.