FileSystemWatcher vs polling เพื่อเฝ้าดูการเปลี่ยนแปลงของไฟล์


152

ฉันต้องตั้งค่าแอพพลิเคชั่นที่คอยดูไฟล์ที่สร้างขึ้นในไดเรกทอรีทั้งในเครื่องหรือในไดรฟ์เครือข่าย

ตัวเลือกการFileSystemWatcherสำรวจหรือการจับเวลาจะเป็นตัวเลือกที่ดีที่สุดหรือไม่ ฉันเคยใช้วิธีการทั้งสองในอดีต แต่ไม่ครอบคลุม

มีปัญหาอะไรบ้าง (ประสิทธิภาพความน่าเชื่อถือ ฯลฯ ) มีวิธีใดบ้าง


3
FileSystemWatcher เป็นสิ่งที่เป็นนามธรรมและไม่สามารถเชื่อถือได้สำหรับทุกสิ่งยกเว้นกรณีพื้นฐานที่สุด ดูที่นี่: stackoverflow.com/a/22768610/129130
Stein Åsmul

1
ต้องการที่จะเพิ่มการเชื่อมโยงสำหรับการอ้างอิงให้คำตอบนี้โดยเรย์มอนด์เฉิน (Microsoft ผู้เชี่ยวชาญ) ในหัวข้อของความน่าเชื่อถือของ และบล็อกของเขา: The Old New Thing (ค้นหา FileSystemWatcher เป็นต้น)
Stein Åsmul

คำตอบ:


105

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

แก้ไข: หากคุณมี UI คุณสามารถให้ผู้ใช้ของคุณสามารถ "รีเฟรช" สำหรับการเปลี่ยนแปลงแทนการทำโพล ฉันจะรวมสิ่งนี้กับตัวเฝ้าดูระบบไฟล์


11
ฉันเคยเห็นถ้าล้มลงด้วย วิธีแก้ปัญหาที่เราใช้คือห่อคลาสของเราเองโดยที่คลาส wrapper ALSO ใช้ตัวจับเวลาเพื่อตรวจสอบในโอกาสที่ผู้เฝ้าดูยังคงดำเนินต่อไป
Joel Coehoorn

เราทำสิ่งที่คล้ายกัน - เมื่อเราประมวลผลไฟล์ที่ส่งผ่านไปยังเหตุการณ์ FileCreated แล้วเราจะทำการตรวจสอบด้วยตนเองสำหรับไฟล์ใหม่อื่น ๆ ก่อนส่งคืน สิ่งนี้ดูเหมือนว่าจะช่วยลดปัญหาใด ๆ ที่เกิดขึ้นกับไฟล์จำนวนมากที่มาถึงในครั้งเดียว
John Sibly

4
ฉันเชื่อว่าเราทดสอบใน XP และ Server 2003 ในไดเรกทอรีท้องถิ่นและไฟล์ที่ใช้ร่วมกันและมีเครื่อง XP ในเขตข้อมูล เรามีปัญหากับทั้ง dir ในเครื่องและการแชร์ไฟล์ หนึ่งในสาเหตุที่เป็นไปได้ที่เราเกิดขึ้นคือการคัดลอก / สร้างไฟล์จำนวนมากในระยะเวลาอันสั้นในไดเรกทอรี
Jason Jackson

5
มันไม่สร้างสรรค์และเป็นมืออาชีพที่จะบอกว่า "ฉันเคยเห็นผีวันหนึ่ง" ดูเหมือนว่าคนที่อยู่ในเธรดการกล่าวถึงเอกสาร msdn เกี่ยวกับการใช้บัฟเฟอร์ที่ไม่สามารถใช้กับเพจได้นั้นสามารถอธิบายปัญหาของคุณได้ คุณเคยลองใช้วิธีการของ Brent หรือไม่?
v.oddou

4
ฉันเพิ่งซื้อเซ็นเซอร์ก๊าซใน Amazon และมันทำให้ฉันประหลาดใจว่ามีคนพูดว่ามันไม่ทำงานเมื่อเห็นได้ชัดว่าพวกเขาไม่ได้ปรับเทียบอย่างถูกต้องหรือไม่รู้เกี่ยวกับการปรับเทียบ ... ขนาดบัฟเฟอร์ของมัน เกือบจะรับประกันได้ว่าเป็นสาเหตุของ "ล้มเหลว" นี่คือคำอธิบายที่อธิบายไว้ในเอกสารประกอบและมีวิธีแก้ไขที่ให้การดำเนินการที่เชื่อถือได้มาก นี่ไม่ใช่คำตอบที่ดีเพียงแค่พูดว่า "errr บางสิ่งบางอย่างไม่ได้ผลในครั้งเดียวไม่แน่ใจว่าทำไม ... ไม่มีใครควรเชื่อถือได้"
u8it

60

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

นี่คือบทความ MSDN บนบัฟเฟอร์: FileSystemWatcher .. ::. คุณสมบัติ InternalBufferSize

ต่อ MSDN:

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

เราใช้ 16MB เนื่องจากคาดว่าจะมีจำนวนมากในคราวเดียว ทำงานได้ดีและไม่พลาดไฟล์

นอกจากนี้เรายังอ่านไฟล์ทั้งหมดก่อนที่จะเริ่มดำเนินการแม้แต่หนึ่ง ... รับชื่อไฟล์ที่เก็บไว้อย่างปลอดภัย (ในกรณีของเราลงในตารางฐานข้อมูล) จากนั้นประมวลผล

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


12
บัฟเฟอร์ล้น? โอ้คุณหมายถึงสแต็คล้น
TheFlash

1
ตั้งแต่. NET 3.5: "คุณสามารถตั้งค่าบัฟเฟอร์เป็น 4 KB หรือใหญ่กว่าได้ แต่ต้องไม่เกิน 64 KB"
Brad

9
คุณใช้งาน 16MB อย่างไรหากบัฟเฟอร์ภายในสูงสุดสำหรับ FileSystemWatcher คือ 64KB
BK

1
@ Jarvis บัฟเฟอร์เป็นที่เก็บข้อมูลแบบกำหนดค่าเพื่อเก็บข้อมูลตามที่ส่งจนกว่าจะสามารถประมวลผลได้ซึ่งโดยปกติจะหมายถึง FIFO หรือ Queue ตามที่คุณต้องการจัดการคำขอตามลำดับที่มาถึงอย่างไรก็ตามในกระบวนการบางอย่างเช่นการเรียกซ้ำในโปรแกรม โครงสร้าง FILO หรือสแต็คคืออะไรที่ใช้ในกรณีนี้เราหมายถึงบัฟเฟอร์คิวเหตุการณ์อย่างแน่นอนและไม่ใช่โปรแกรมที่เรียกบัฟเฟอร์สแต็ก
MikeT

1
petermeinl.wordpress.com/2015/05/18/tamed-filesystemwatcher โพสต์นี้แชร์ไฟล์เสริมที่มีประสิทธิภาพรอบ FileSystemWatcher (FSW) ปัญหาการแก้ไขที่พบโดยทั่วไปเมื่อใช้เพื่อตรวจสอบระบบไฟล์ในแอปพลิเคชันในโลกแห่งความเป็นจริง
Kiquenet

35

FileSystemWatcherยังอาจจะพลาดการเปลี่ยนแปลงในช่วงเวลาว่างถ้าจำนวนของการเปลี่ยนแปลงการจัดคิวล้นบัฟเฟอร์ที่มีให้ นี่ไม่ใช่ข้อ จำกัด ของคลาส. NET ต่อ se แต่ของโครงสร้างพื้นฐาน Win32 พื้นฐาน จากประสบการณ์ของเราวิธีที่ดีที่สุดในการลดปัญหานี้คือการถอนการแจ้งเตือนโดยเร็วที่สุดและจัดการกับพวกเขาในเธรดอื่น

ดังที่ @ChillTemp แจ้งไว้ด้านบนผู้เฝ้าดูอาจไม่ทำงานบนการแชร์ที่ไม่ใช่ Windows ตัวอย่างเช่นจะไม่สามารถใช้งานได้กับไดรฟ์ Novell ที่เมาท์

ฉันยอมรับว่าการประนีประนอมที่ดีคือทำโพลเป็นครั้งคราวเพื่อรับการเปลี่ยนแปลงที่ไม่ได้รับ


4
ตัวเฝ้าดูระบบไฟล์สามารถเริ่มเพิ่มเหตุการณ์มากมายได้อย่างรวดเร็ว หากคุณไม่สามารถดำเนินการจัดการเหตุการณ์ของคุณอย่างน้อยก็เร็วที่สุดเท่าที่พวกเขาถูกไล่ออกในที่สุดผู้จัดการจะเริ่มทิ้งกิจกรรมบนพื้นและคุณจะพลาดสิ่งต่าง ๆ
Brent Rockwood

17

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


3
Microsoft ยอมรับว่าไม่น่าเชื่อถือสำหรับการแชร์ไฟล์ที่ไม่ใช่ windows เรากำลังประสบกับสิ่งนี้เป็นครั้งแรกนับตั้งแต่เปลี่ยนจากการแชร์ Windows ไปเป็นการแชร์ SMB บน Linux
ฌอน

1
ไม่ใช่ว่าฉันรู้ และฉันแน่ใจว่ามันจะเป็นแค่เกมโทษระหว่างผู้ขายต่าง ๆ
chilltemp

1
เราประสบปัญหากับตัวเฝ้าดูระบบไฟล์บนไดรฟ์ที่แมป หากแผนที่ยกเลิกการเชื่อมต่อแล้วเชื่อมต่อตัวเฝ้าดูไฟล์แล้วจะไม่ทำการเปลี่ยนแปลงอีกต่อไป แก้ไขได้อย่างง่ายดาย แต่ยังคงโจมตี IMHO ของระบบไฟล์
Richard Dorman

11

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


7

ขณะนี้ฉันใช้FileSystemWatcherไฟล์ XML ที่กำลังอัปเดตโดยเฉลี่ยทุก ๆ 100 มิลลิวินาที

ฉันได้พบว่าตราบใดที่FileSystemWatcherมีการกำหนดค่าอย่างถูกต้องคุณไม่ควรมีปัญหากับท้องถิ่นไฟล์

ฉันไม่มีประสบการณ์ในการดูไฟล์ระยะไกลและไม่แชร์ Windows

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


5

ฉันจะไปกับการสำรวจ

ปัญหาเครือข่ายทำให้การFileSystemWatcherไม่น่าเชื่อถือ (แม้ในกรณีที่เกิดข้อผิดพลาดมากเกินไป)


5

ฉันมีปัญหาในการใช้งานFileSystemWatcherบนเครือข่ายที่ใช้ร่วมกัน หากคุณอยู่ในสภาพแวดล้อม Windows ที่บริสุทธิ์อาจไม่ใช่ปัญหา แต่ฉันดูการแชร์ NFS และเนื่องจาก NFS ไม่มีสถานะไม่มีการแจ้งเตือนเมื่อไฟล์ที่ฉันกำลังดูเปลี่ยนแปลง


ฉันพบปัญหาเดียวกัน แต่ฉันไม่คาดคิดเนื่องจาก FileSystemWatcher อยู่ในเซิร์ฟเวอร์ windows เดียวกันซึ่งแชร์โฟลเดอร์โดยใช้ NFS ข้อเท็จจริงของการแชร์โฟลเดอร์กับ NFS ทำให้ filesystemwatcher ไม่เห็นไฟล์ที่สร้างขึ้นโดยใช้การแชร์จากระยะไกล (เช่นจาก Linux ซึ่งแมปการแชร์) ในขณะที่ถ้าฉันเขียนไฟล์ในโฟลเดอร์เดียวกันภายใต้การตรวจสอบ filesystemwatcher จะถูกเรียก ดูเหมือนว่าเซิร์ฟเวอร์ NFS จะเขียนไฟล์โดยใช้เลเยอร์ที่ต่ำกว่าและเลเยอร์ api ซึ่งทริกเกอร์ fthe filesystemwatcher ไม่ได้มีส่วนร่วมใครมีข้อมูลเพิ่มเติมหรือไม่
Mosè Bottacini

3

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

เหตุการณ์การสร้างในทางกลับกันทำงานได้ดีดังนั้นหากคุณต้องการเฝ้าดูการสร้างไฟล์คุณสามารถไปที่ FSW

นอกจากนี้ฉันไม่มีปัญหาเลยในโฟลเดอร์ท้องถิ่นไม่ว่าจะแชร์หรือไม่ก็ตาม


3

กลับมาจากวิธีเหตุการณ์โดยเร็วที่สุดโดยใช้เธรดอื่นแก้ไขปัญหาให้ฉัน:

private void Watcher_Created(object sender, FileSystemEventArgs e)
{
    Task.Run(() => MySubmit(e.FullPath));
}

2

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

ขณะนี้ฉันกำลังพยายามตัดสินใจว่าจะใช้ FSW หรือโพลสำหรับโครงการที่ฉันพัฒนาหรือไม่ การอ่านคำตอบนั้นเป็นที่ชัดเจนว่ามีบางกรณีที่ FSW ครอบคลุมความต้องการอย่างสมบูรณ์แบบในขณะที่บางครั้งคุณต้องมีการสำรวจความคิดเห็น น่าเสียดายที่ไม่มีคำตอบใดที่เกี่ยวข้องกับความแตกต่างด้านประสิทธิภาพ (ถ้ามี) โดยเฉพาะกับปัญหา "ความน่าเชื่อถือ" มีใครบ้างที่สามารถตอบคำถามในส่วนนั้นได้?

แก้ไข: nmclean 's จุดความถูกต้องของการใช้ทั้ง FSW และการสำรวจ (คุณสามารถอ่านการอภิปรายในความคิดเห็นที่ถ้าคุณมีความสนใจ) ดูเหมือนจะเป็นคำอธิบายที่มีเหตุผลมากว่าทำไมจะมีสถานการณ์ที่ใช้ทั้ง FSW และการสำรวจเป็นที่มีประสิทธิภาพ ขอขอบคุณสำหรับการส่องสว่างในที่สำหรับฉัน (และคนอื่น ๆ ที่มีความคิดเห็นแบบเดียวกัน) nmclean


1
จะทำอย่างไรถ้าคุณต้องการตอบกลับการเปลี่ยนแปลงไฟล์โดยเร็วที่สุด หากคุณสำรวจความคิดเห็นหนึ่งครั้งต่อนาทีคุณอาจมีความล่าช้ามากถึง 1 นาทีระหว่างการเปลี่ยนไฟล์และใบสมัครของคุณจะรับการเปลี่ยนแปลง เหตุการณ์ FSW น่าจะถูกกระตุ้นก่อนหน้านั้นมาก ดังนั้นเมื่อใช้ทั้งสองอย่างคุณจะจัดการกับกิจกรรมด้วยความล่าช้าน้อยที่สุดเท่าที่จะทำได้ แต่ยังรับเหตุการณ์ที่ไม่ได้รับหากมี
rom99

@ rom99 ตรงประเด็นของฉัน หาก FSW ไม่น่าเชื่อถือในกรณีที่คุณต้องการการตอบสนองอย่างรวดเร็วจะไม่มีประโยชน์ในการใช้เนื่องจากคุณจะมีกรณีที่ไม่มีการตอบสนองอย่างรวดเร็วดังนั้นใบสมัครของคุณจะไม่น่าเชื่อถือ การสำรวจในช่วงเวลาที่สั้นลงในเธรดจะเป็นสิ่งที่คุณต้องทำ การทำทั้งสองอย่างหมายความว่าคุณมีความอดทนต่อเวลาตอบสนองที่หน่วยเลือกตั้งครอบคลุมดังนั้นทำไมไม่ใช้เฉพาะหน่วยเลือกตั้ง?
ThunderGr

5
@ThunderGr "ดังนั้นใบสมัครของคุณจะไม่น่าเชื่อถือ" - ในหลายกรณีความเร็วไม่ได้เป็นข้อกำหนดเบื้องต้นสำหรับความน่าเชื่อถือ งานต้องเสร็จ แต่อาจรอสักครู่ หากเรารวมการลงคะแนนเลือกตั้งช้าและเชื่อถือได้เข้ากับFSW ที่รวดเร็วและไม่น่าเชื่อถือเราจะได้รับแอปพลิเคชันที่เชื่อถือได้เสมอและบางครั้งเร็วซึ่งดีกว่าเชื่อถือได้และไม่รวดเร็ว เราสามารถลบ FSW และบรรลุเวลาตอบสนองสูงสุดเท่าเดิมด้วยการทำโพลอย่างต่อเนื่อง แต่นี่เป็นค่าใช้จ่ายในการตอบสนองของแอปพลิเคชั่นที่เหลือดังนั้นควรดำเนินการเฉพาะเมื่อจำเป็นต้องตอบกลับทันที
nmclean

2
ตอนนี้ทำไมข้อโต้แย้งที่น่าสงสารคืออะไร? เพราะถึงแม้ว่าเรายังคงต้องเข้าถึงดิสก์เราจำเป็นต้องใช้มันน้อย ในทำนองเดียวกันคุณสามารถสำรวจความคิดเห็นน้อยลง เพียงเพราะเรายังตรวจสอบไฟล์ทั้งหมดไม่ได้หมายความว่าปริมาณงานจะเท่ากัน คำสั่งของคุณ "หน่วยเลือกตั้งที่มีราคาแพงในเวลา CPU กับ FSW หรือไม่" เป็นเท็จ โดยการลดความกังวลของ "immediacy" เป็น FSW เราสามารถเปลี่ยนการสำรวจเป็นงานว่างที่มีลำดับความสำคัญต่ำเช่นความแออัดของแอพพลิเคชั่น ณ เวลาใดก็ตามจะลดลงอย่างมากในขณะที่ยังคงให้ คุณไม่สามารถสร้างสมดุลที่เท่ากันได้โดยการโพลคนเดียว
nmclean

9
@nmclean ขอบคุณที่สละเวลาและพลังงานเพื่ออธิบายสิ่งนี้ในแบบที่คุณทำ เมื่อคุณพูดอย่างนั้นมันก็สมเหตุสมผลดีกว่ามาก ๆ เช่นเดียวกับเวลาที่แคชไม่เหมาะกับปัญหาเฉพาะของคุณดังนั้น FSW (เมื่อพิสูจน์ได้ว่าไม่น่าเชื่อถือ) อาจไม่เหมาะสม ปรากฎว่าคุณพูดถูก ฉันขอโทษที่ใช้เวลานานมากในการรับมัน
ThunderGr

1

วิธีแก้ปัญหาการทำงานสำหรับการทำงานกับสร้างเหตุการณ์แทนการเปลี่ยนแปลง

แม้กระทั่งการคัดลอกตัดวางย้าย

class Program
{        

        static void Main(string[] args)
        {
            string SourceFolderPath = "D:\\SourcePath";
            string DestinationFolderPath = "D:\\DestinationPath";
            FileSystemWatcher FileSystemWatcher = new FileSystemWatcher();
            FileSystemWatcher.Path = SourceFolderPath;
            FileSystemWatcher.IncludeSubdirectories = false;
            FileSystemWatcher.NotifyFilter = NotifyFilters.FileName;   // ON FILE NAME FILTER       
            FileSystemWatcher.Filter = "*.txt";         
             FileSystemWatcher.Created +=FileSystemWatcher_Created; // TRIGGERED ONLY FOR FILE GOT CREATED  BY COPY, CUT PASTE, MOVE  
            FileSystemWatcher.EnableRaisingEvents = true;

            Console.Read();
        }     

        static void FileSystemWatcher_Created(object sender, FileSystemEventArgs e)
        {           
                string SourceFolderPath = "D:\\SourcePath";
                string DestinationFolderPath = "D:\\DestinationPath";

                try
                {
                    // DO SOMETING LIKE MOVE, COPY, ETC
                    File.Copy(e.FullPath, DestinationFolderPath + @"\" + e.Name);
                }
                catch
                {
                }          
        }
}

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

class Program
{
    static string IsSameFile = string.Empty;  // USE STATIC FOR TRACKING

    static void Main(string[] args)
    {
         string SourceFolderPath = "D:\\SourcePath";
        string DestinationFolderPath = "D:\\DestinationPath";
        FileSystemWatcher FileSystemWatcher = new FileSystemWatcher();
        FileSystemWatcher.Path = SourceFolderPath;
        FileSystemWatcher.IncludeSubdirectories = false;
        FileSystemWatcher.NotifyFilter = NotifyFilters.LastWrite;          
        FileSystemWatcher.Filter = "*.txt";         
        FileSystemWatcher.Changed += FileSystemWatcher_Changed;
        FileSystemWatcher.EnableRaisingEvents = true;

        Console.Read();
    }     

    static void FileSystemWatcher_Changed(object sender, FileSystemEventArgs e)
    {
        if (e.Name == IsSameFile)  //SKIPS ON MULTIPLE TRIGGERS
        {
            return;
        }
        else
        {
            string SourceFolderPath = "D:\\SourcePath";
            string DestinationFolderPath = "D:\\DestinationPath";

            try
            {
                // DO SOMETING LIKE MOVE, COPY, ETC
                File.Copy(e.FullPath, DestinationFolderPath + @"\" + e.Name);
            }
            catch
            {
            }
        }
        IsSameFile = e.Name;
    }
}

นี่เป็นวิธีแก้ปัญหาสำหรับปัญหาที่เกิดขึ้นหลายเหตุการณ์


0

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

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