มีอะไรเช่น inotify บน Windows หรือไม่?


103

ด้วย Linux OS จะมีระบบย่อย ionotify ที่แจ้งให้แอปพลิเคชันมีการเปลี่ยนแปลงระบบไฟล์

อย่างไรก็ตามฉันเป็นผู้ใช้ Windows เป็นหลักดังนั้นฉันจึงสงสัยว่ามีวิธีที่คล้ายกันในการตรวจสอบการเปลี่ยนแปลงระบบไฟล์หรือไม่?


9
ฉันไม่คิดว่าคำถามดังกล่าวจะไม่ตรงประเด็น คำถามถามหา OS API ซึ่งแตกต่างกันมากเครื่องมือ / ซอฟต์แวร์ไลบรารี อาจเป็นคำที่แตกต่างกันได้เช่นวิธีรับการแจ้งเตือนในแอปพลิเคชัน windows เมื่อไฟล์ / ไฟล์บางไฟล์ถูกแก้ไข
balki

1
โหวตให้เปิดอีกครั้ง: คำถามกำลังขอทางเลือกอื่นที่เทียบเคียงได้กับ API ของระบบปฏิบัติการเฉพาะและอ่านในทำนองว่า "ฉันมาจากอังกฤษที่ฉันใช้ส้อมกินอาหารในญี่ปุ่นฉันใช้อุปกรณ์อะไรในลักษณะคล้าย ๆ กัน? " คำตอบที่ยอมรับโดยใช้การเปรียบเทียบนั้นคือ "ใช้ตะเกียบ"
เดวิด

คำตอบ:



42

หากคุณใช้. netให้ใช้FileSystemWatcher. ข้อมูลเพิ่มเติมที่นี่: http://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher.aspx

หากคุณกำลังใช้C , การใช้งานFindFirstChangeNotification, ,FindNextChangeNotification ReadDirectoryChangesWข้อมูลเพิ่มเติมที่นี่: http://msdn.microsoft.com/en-us/library/aa365261(VS.85).aspx

บนOSX API ที่เกี่ยวข้องคือfseventsapi

พวกเขาทั้งหมดแตกต่างกันอย่างละเอียดและทุกคนมีความน่าเชื่อถือที่น่าสงสัยในกรณีที่มีขอบ โดยทั่วไปคุณไม่สามารถพึ่งพา apis เหล่านี้เพื่อดูการเปลี่ยนแปลงทั้งหมดได้อย่างสมบูรณ์ 100% ของเวลา คนส่วนใหญ่ที่ใช้การตรวจสอบระบบไฟล์จะรวมเข้ากับการสแกนเป็นระยะเพื่อชดเชยข้อมูลที่สูญหายหรือไม่สมบูรณ์จาก push api


6
คุณช่วยให้การอ้างอิงบางส่วนเกี่ยวกับ "ความน่าเชื่อถือที่น่าสงสัยในกรณีขอบสำหรับ inotify ได้หรือไม่?
Pharaun

18
หากผู้บริโภคของ fs watcher api อ่านเหตุการณ์ได้ช้ากว่ากระบวนการอื่นที่สร้างขึ้นมาเคอร์เนลจำเป็นต้องเก็บการแก้ไขระบบไฟล์ไว้ในกระบวนการอื่น (อาจมีลำดับความสำคัญสูงกว่า) หรืออนุญาตให้มีการขยายบัฟเฟอร์ได้ไม่ จำกัด ความลึกของบัฟเฟอร์ของ inotify (ตามเอกสารใน man page) ถูกควบคุมโดย / proc / sys / fs / inotify / max_queued_events นอกเหนือจากนี้คุณจะได้รับการแจ้งเตือน IN_Q_OVERFLOW ซึ่งเป็นสิ่งที่ดี แต่คุณยังคงอยู่ในสถานการณ์ที่คุณอาจต้องสแกนใหม่เป็นครั้งคราว
blucz

อ่าใช่ฉันเพิ่งอ่านเรื่องคิว ฉันคิดว่ากรณีขอบนี้จะขึ้นอยู่กับจำนวนไฟล์ที่คุณกำลังตรวจสอบและยังขึ้นอยู่กับว่ามันสำคัญในการติดตามการเปลี่ยนแปลงทั้งหมดหรือหากพลาดไปไม่กี่ไฟล์ แต่นั่นเป็นจุดที่ดี ขอบคุณ :)
Pharaun

@blucz ฉันสงสัยตัวเองว่าคนเคอร์เนลแก้สถานการณ์เหล่านี้ได้อย่างไร เมื่อรู้ว่าพวกเขาทำเช่นนี้ทำให้มั่นใจในการออกแบบและการใช้งานมากขึ้น
n611x007


11

JNotifyหรือFileMonจาก Microsoft


8
JNotify เหมาะสำหรับฉันเพราะฉันต้องการความเข้ากันได้ข้ามแพลตฟอร์ม ฉันยังสามารถเขียน bash script เดียวซึ่งทำงานใน cygwin, mac และ linux โดยสันนิษฐานว่า JAVA_HOME ได้รับการตั้งค่าอย่างถูกต้องเท่านั้น นี่เป็นตัวช่วยที่ดีในการแก้ไขปัญหาบนเครื่องของลูกค้าเมื่อพวกเขาพูดว่า "มันลบไฟล์ของฉัน!" ฉันสามารถดูบันทึกและพยายามหาว่าเกิดขึ้นได้อย่างไร / เมื่อใด
cmyers

1
FileMon คือ ProcessMonitor technet.microsoft.com/en-us/sysinternals/bb896645
MECU

10

สายไปหน่อย แต่ ...

Windows มีสิ่งอำนวยความสะดวกคล้ายกับเหตุการณ์ OSX ซึ่งคุณสามารถตรวจสอบเหตุการณ์โดยไม่ต้องเรียกใช้แอพ Windows USN Journal จะติดตามการเปลี่ยนแปลงของไฟล์ทั้งหมด Jeffrey Richter (ผู้เขียน Advanced Windows) เขียนบทความที่ยอดเยี่ยมพร้อมตัวอย่างการทำงานสำหรับ MSDN Journal อัปเดต : ตอนนี้บทความจาก archive.org เนื่องจาก MSJ ไม่ออนไลน์ที่ MS อีกต่อไป

เอกสาร MSDN สำหรับ USN Change Journals

USN Change Journals น่าจะดีกว่าหากคุณกำลังสร้างแอปพลิเคชันเช่นเครื่องมือสำรองข้อมูลหรือดัชนีที่ต้องตรวจสอบปริมาณทั้งหมด


วารสาร USN มีวิธีที่แตกต่างกันหรือไม่โดยอาศัยมันเพื่อหลีกเลี่ยงพฤติกรรมบักกี้ของFileSystemWatcher| FindFirstChangeNotification PhillipBrandonHolmesกำลังพูดถึง ?
n611x007

4
เป็นเวลานานแล้วที่ฉันทำงานกับสิ่งนี้ แต่ไม่ได้ใช้ FileSystemWatcher หรือ FindFirstChangeNotification ฉันเริ่มเขียนผู้เฝ้าดูเหตุการณ์ของ Windows ใน Go โดยอ้างอิงจากตัวอย่างของ Jeffery Richter เป็นอย่างมาก จากการทดสอบเล็กน้อยที่ฉันทำมันเป็นหินแข็งและไม่พลาดอะไรเลยคล้ายกับ fsevents ใน OS X Gist อยู่ที่นี่: gist.github.com/pkrnjevic/7219861
Peter Krnjevic

@PeterKrnjevic คุณสามารถอัปเดตลิงก์สำหรับบทความจาก Jeffrey Richter ได้หรือไม่?
SOUser

@SOUser เนื่องจาก MS bitrot บทความนี้เชื่อมโยงจาก archive.org
Peter Krnjevic

3

FileSystemWatcher () ไม่น่าเชื่อถือสาเหตุหลักมาจากการจัดการข้อผิดพลาดสำหรับบัฟเฟอร์ผู้เฝ้าดูไม่สมบูรณ์มากหรือน้อย เนื่องจากไม่มีเส้นทางและข้อมูลการจัดการข้อผิดพลาดโดยละเอียด Microsoft จึงไม่สามารถกู้คืนหรือสำรวจไดเร็กทอรีการทำงานด้วยตนเองได้

JNotify สำหรับ Windows ก็ไม่น่าเชื่อถือเช่นกันเนื่องจาก bug ^ นี้มาจาก win32 JNotify ใช้ win32 ดังนั้นจึงไม่แตกต่างจาก FileSystemWatcher ()


เมื่อคิดถึงวิธีการออกแบบบทบาทเพื่อแก้ปัญหาที่คล้ายกับ 'ความเร็ว' / 'การแข่งขัน' / 'ล้น' ฉันสงสัยตัวเองว่าเมล็ดข้าวทำได้อย่างไร น่าสนใจ. สิ่งนี้ยังเกิดขึ้นกับระบบเครือข่ายและการบันทึก ปัญหานี้มีชื่อหรือไม่?
n611x007

ใช่มันชื่อ "แมลง" จุดบกพร่อง (win32) ถูกทิ้งไว้ในทุกระบบปฏิบัติการที่สร้างโดย Microsoft จนถึงปัจจุบัน ทำให้ระบบปฏิบัติการ Microsoft ไม่เหมาะสำหรับโซลูชันประเภทการดูไฟล์ คุณต้องไป * nix เพื่อทำมันให้สำเร็จ บางครั้งฉันคิดว่าพวกเขาจงใจปล่อยให้บัฟเฟอร์ล้นนี้ด้วยเหตุผลด้านความปลอดภัย
Phillip Brandon Holmes

ฮ่าฮ่า .. ใช่ .. มันคือชื่อคลัสเตอร์โดยเจตนาดังนั้นระบบไฟล์ของไมโครซอฟท์จึงไม่สามารถรับชมได้โดยเจตนา เป็นข้อบกพร่องที่พวกเขาทิ้งไว้เนื่องจากปัญหาด้านความปลอดภัย
Phillip Brandon Holmes

1

ฉันทำการค้นหาเล็กน้อยดูเหมือนว่าฉันจำได้ว่าเคยเห็นบางอย่างที่คล้ายกันสำหรับ Windows มี FileSystemWatcherสำหรับ. NET ส่วนใหญ่สำหรับ NT หรือ XP และส่งต่อ


โดยทั่วไปแล้วจะมีเฉพาะใน NTFS Filesystems เท่านั้น แต่จะไม่มีใน FAT16, FAT32 หรือแม้แต่ exFAT ใหม่
Mastacheata

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